Oracle Trigger 有兩種類型 :
Row Trigger (列觸發) 與 Statement Trigger (敘述觸發),
以下大致敘述一下 :
Row Trigger (列觸發)
Row Trigger: 在 Create Trigger 時, 有加入 for each row.
優: 可以使用 :new / :old.
缺: 無法對該 Table 做某些事情, 也就是不能對該 Table 做 Select / Insert / Update / Delete.
Statement Trigger (敘述觸發)
Statement Trigger: 在 Create Trigger 時, 沒有加入 for each row.
優: 可以對該 Table 做某些事情, 也就是可以對該 Table 做 Select / Insert / Update / Delete.
缺: 無法使用 :new / :old.
其他介紹
相同之處: 不管是 Row Trigger 或是 Statement Trigger, 都是每一筆觸發一次.
若一個 Table 同時有 Row Trigger、Statement Trigger, 則其執行先後順序 :
1. Before 型的 Statement Trigger.
2. Before 型的 Row Trigger.
3. After 型的 Row Trigger.
4. After 型的 Statement Trigger.
範例程式碼
-- 建立測試用 Table
create table tomkuoTable (
aa number
, bb varchar2(100)
);
-- 建立測試用 Trigger
create or replace trigger "INS1_TOMKUOTABLE" before insert on tomkuoTable
for each row
begin
dbms_output.put_line( 'Row Trigger on Before Insert' );
end;
create or replace trigger "INS2_TOMKUOTABLE" after insert on tomkuoTable
for each row
begin
dbms_output.put_line( 'Row Trigger on After Insert' );
end;
create or replace trigger "INS3_TOMKUOTABLE" before insert on tomkuoTable
begin
dbms_output.put_line( 'Statement Trigger on Before Insert' );
end;
create or replace trigger "INS4_TOMKUOTABLE" after insert on tomkuoTable
begin
dbms_output.put_line( 'Statement Trigger on After Insert' );
end;
-- 新增一筆資料
insert into tomkuoTable values( 1, 'aaa' );
commit;
-- 刪除測試用 Table
drop table tomkuoTable;
範例結果 :