Oracle觸發器觸發級別

尛樣兒發表於2011-11-30


這篇文章用實驗討論Oracle觸發器的觸發級別問題。

1.建立測試環境:
create table a(id number);
create table b(id number);

begin
  for i in 1 .. 100 loop
    insert into a values (i);
    commit;
  end loop;
end;
/

create or replace trigger a_t_b
  after insert or update or delete on a 
  for each row
declare
  -- local variables here
begin 
insert into b values (1);
end a_t_b;

2.測試每行觸發:
SQL> begin
  2  update a set id=1 where id in(1,2,3,4,5,6,7,8,9);
  3  delete from a where id>90;
  4  end;
  5  /
 
PL/SQL procedure successfully completed
 
SQL> commit;
 
Commit complete
 
SQL> select * from b;
 
        ID
----------
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
         1
 
19 rows selected

        雖然只有兩條SQL語句,但是兩條語句操作了19行資料,所以這裡產生了19個觸發事件。 

3.測試語句觸發:
SQL> truncate table b;
 
Table truncated
 
修改觸發器,註釋for each row行。
create or replace trigger a_t_b
  after insert or update or delete on a 
  -- for each row
declare
  -- local variables here
begin 
insert into b values (1);
end a_t_b;

SQL> begin
  2  update a set id=2 where id in (11,12,13,14,15,16);
  3  delete from a where id>80;
  4  end;
  5  /
 
PL/SQL procedure successfully completed
 
SQL> commit;
 
Commit complete
 
SQL> select * from b;
 
        ID
----------
         1
         1
        雖然同樣修改了多行記錄,但只有兩條SQL語句,所以只產生了兩個觸發事件。還需要注意的是觸發事件發生在操作行記錄和SQL語句級別,而非發生在事務級別,跟事務沒關係。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23135684/viewspace-712450/,如需轉載,請註明出處,否則將追究法律責任。

相關文章