Oracle DB 的 "Row Trigger 列觸發" 與 "Statement Trigger 敘述觸發" 之差異


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;

範例結果 :


Related Posts Plugin for WordPress, Blogger...