DML触发器
DML觸發(fā)器:是一種用在 表 上的觸發(fā)器,通常在 insert,Update, delete語(yǔ)句上應(yīng)用。
如果觸發(fā)器僅影響一行,則觸發(fā)器執(zhí)行順序:
(1)before 語(yǔ)句觸發(fā)器
(2)before 行級(jí)觸發(fā)器
(3)執(zhí)行 DML語(yǔ)句
(4)after 行級(jí)觸發(fā)器
(5)after 語(yǔ)句觸發(fā)器
?
如果觸發(fā)器影響多行,則觸發(fā)器執(zhí)行順序:
(1)before語(yǔ)句觸發(fā)器
(2)被影響的第一行的before行觸發(fā)器
(3)第一行執(zhí)行DML語(yǔ)句
(4)第一行的after行級(jí)觸發(fā)器
(5)被影響的第二行的before行觸發(fā)器
(6)第二行執(zhí)行DML語(yǔ)句
(7)第二行的after行級(jí)觸發(fā)器
(8)after語(yǔ)句觸發(fā)器
?
語(yǔ)法:
1 create or replace trigger [schema.]trigger_name 2 {before | after} {delete | insert | {update [of column_list]}} on [schema.]table --觸發(fā)時(shí)機(jī) 3 [referencing {OLD as old_name} | {NEW as new_name} | {Parent as parent_name}] --定義OLD、NEW的別名 4 [For each row] --行級(jí)觸發(fā)器 or 語(yǔ)句級(jí) 5 [When (condition)] --觸發(fā)器被觸發(fā)后,是否執(zhí)行觸發(fā)體代碼的條件 6 plsql_clock | call_procedure_statement其中,(1)before | after:指定觸發(fā)器是在對(duì)表的操作發(fā)生之前觸發(fā)還是之后觸發(fā)。
可以同時(shí)指定多個(gè)動(dòng)作,
1 before delete or insert or update on tb_test在使用Update作為觸發(fā)行為時(shí),還可以使用 Update of 指定一個(gè)或多個(gè)字段,僅在這些字段被更新時(shí)才會(huì)觸發(fā):
1 before update of column1, column2 ON tb_test(2)when condition : 只有滿足when指定的條件,才會(huì)執(zhí)行觸發(fā)體中的代碼。在when子句中,可以使用以下幾個(gè)謂詞:
OLD 謂詞:執(zhí)行前的字段的值的名稱,比如 Update一個(gè)表時(shí),使用 OLD.column1 是指執(zhí)行Update操作之前的列的值。
NEW 謂詞:執(zhí)行后的字段的值的名稱,比如 Update一個(gè)表時(shí),使用 NEW.column1是指執(zhí)行 Update操作之后的列的值。
? ? ? 在觸發(fā)器內(nèi)部使用NEW和OLD謂詞時(shí),要在前面加上 :冒號(hào),在WHEN子句中,可以不加上冒號(hào)。
(3)可以在觸發(fā)器體的語(yǔ)句塊中使用 INSERTING、UPDATING、DELETING謂詞,這些謂詞會(huì)返回相應(yīng)的DML操作的布爾值,
如果為TRUE,則表示執(zhí)行了相應(yīng)的 INSERT、UPDATE、DELETE操作。
?
eg:
create or replace trigger tr_emp_test before insert or update or delete ON employee referencing old as old_name new as new_name for each row when(new_name.emp_name > old_name.emp_name) DECLAREv_sal number; beginif deleting thennull;end if; end;?
轉(zhuǎn)載于:https://www.cnblogs.com/ly01/p/8622387.html
總結(jié)
- 上一篇: java学习记录--ThreadLoca
- 下一篇: 装饰器带参数