做了一個測試。SQL> create table test1 (cola varchar2(10) );表已建立。SQL> create table test2 (colb varchar2(10));表已建立。SQL> select * from test1;未選定行SQL> select * from test2;未選定行SQL> create or replace trigger trigger1
2 before insert on test1
3 for each row
4 declare
5 begin
6 insert into test2(colb) values('trigger1');
7 end trigger1;
8 /觸發器已建立SQL> select object_name,object_id from user_objects where object_name in ('TRIGGER1','TEST1');OBJECT_NAME
--------------------------------------------------------------------------------
OBJECT_ID
----------
TEST1
101621
TRIGGER1
101623
SQL> col object_name for a20
SQL> /OBJECT_NAME OBJECT_ID
-------------------- ----------
TEST1 101621
TRIGGER1 101623 SQL> insert into test1(cola) values('no1');已建立 1 行。SQL> commit;提交完成。SQL> select * from test1;COLA
--------------------
no1 SQL> select * from test2;COLB
--------------------
trigger1 --到這裡,表現一切正常。下面開始刪除恢複。SQL> drop table test1;表已刪除。SQL> select object_name,object_id from user_objects
2 where object_name in ('TRIGGER1','TEST1');未選定行--如果沒加purge選項,則兩者都被刪除到資源回收筒,雖然user_object視圖看不到,在底層表obj$中能看到。
SQL> flashback table TEST1 to before drop;閃回完成。SQL> select object_name,object_id from user_objects
2 where object_name in ('TRIGGER1','TEST1');OBJECT_NAME OBJECT_ID
-------------------- ----------
TEST1 101621 --閃回成功後,www.bkjia.com在視圖中,正常對象只能看到表TEST1,不能看到觸發器。SQL> grant select on obj$ to ncoadev;授權成功。--切換到sys使用者,授權訪問指定對象。SQL> select name,obj# from sys.obj$ where obj# in (101621,101623);NAME OBJ#
------------------------------------------------------------ ----------
TEST1 101621
BIN$mlTKEo1FAGjgQ38AAAEAaA==$0 101623 --obj$表中,能看到 ID為101623的觸發器還在,但名字被Oracle打了內部標記。此時,用pl/sql dev等工具是看不到那個觸發器的。SQL> select * from test2;COLB
--------------------
trigger1 SQL> insert into test1(cola) values('no2');已建立 1 行。SQL> commit;提交完成。SQL> select * from test2;COLB
--------------------
trigger1
trigger1 --又插入了一條記錄,證明觸發器還是生效的,但很難管理了。更麻煩的是後面:SQL> create or replace trigger trigger1
2 before insert on test1
3 for each row
4 declare
5 begin
6 insert into test2(colb) values('trigger2');
7 end trigger1;
8 /觸發器已建立--如果開發人員看不到觸發器了,認為觸發器丟失,又建立了一個新的同名觸發器trigger1,仍然能建立。SQL> select * from test2;COLB
--------------------
trigger1
trigger1 SQL> insert into test1(cola) values('no3');已建立 1 行。SQL> commit;提交完成。SQL> select * from test2;COLB
--------------------
trigger1
trigger1
trigger2
trigger1 --此時,兩個觸發器都生效了,都作用在這個表上,會給系統帶來什麼影響呢?? 這算不算一個bug呢?