一、什么是觸發器
資料庫觸發器是一個與表相關聯的,存盤的PL/SQL 陳述句,每當一個特定的資料操作陳述句(insert update delete)在指定的表上發出時,Oracle自動執行觸發器中定義的陳述句序列,
觸發器的應用場景如下:
- 復雜的安全性檢查
- 資料的確認
- 資料庫審計
- 資料的備份和審計
二、創建Oracle觸發器的語法
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER }
{INSERT | DELETE | UPDATE [OF column [, column …]]}
[OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]
ON [schema.]table_name | [schema.]view_name
[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
[FOR EACH ROW ]
[WHEN condition]
PL/SQL_BLOCK | CALL procedure_name;
其中:
- BEFORE 和AFTER指出觸發器的觸發時序分別為前觸發和后觸發方式,前觸發是在執行觸發事件之前觸發當前所創建的觸發器,后觸發是在執行觸發事件之后觸發當前所創建的觸發器,
- FOR EACH ROW選項說明觸發器為行觸發器,
- 行觸發器和陳述句觸發器的區別表現在:行觸發器要求當一個DML陳述句操走影響資料庫中的多行資料時,對于其中的每個資料行,只要它們符合觸發約束條件,均激活一次觸發器;而陳述句觸發器將整個陳述句操作作為觸發事件,當它符合約束條件時,激活一次觸發器,
- 當省略FOR EACH ROW 選項時,BEFORE 和AFTER 觸發器為陳述句觸發器,而INSTEAD OF 觸發器則只能為行觸發器
- REFERENCING 子句說明相關名稱,在行觸發器的PL/SQL塊和WHEN 子句中可以使用相關名稱參照當前的新、舊列值,默認的相關名稱分別為OLD和NEW,觸發器的PL/SQL塊中應用相關名稱時,必須在它們之前加冒號(:),但在WHEN子句中則不能加冒號,
- WHEN 子句說明觸發約束條件,Condition 為一個邏輯表達時,其中必須包含相關名稱,而不能包含查詢陳述句,也不能呼叫PL/SQL 函式,WHEN 子句指定的觸發約束條件只能用在BEFORE 和AFTER 行觸發器中,不能用在INSTEAD OF 行觸發器和其它型別的觸發器中,
- 當一個基表被修改( INSERT, UPDATE, DELETE)時要執行的存盤程序,執行時根據其所依附的基表改動而自動觸發,因此與應用程式無關,用資料庫觸發器可以保證資料的一致性和完整性,
三、Oracle觸發器的型別
- 行級觸發器:對DML陳述句影響的每個行執行一次,例如,一條update陳述句更新了100條資料,如果我們針對update定義了行級觸發器,那么行級觸發器將會被觸發100次 ,
- 陳述句級觸發器:對每個DML陳述句執行一次,例如,一條update陳述句更新了200條資料,如果我們針對update定義了陳述句級觸發器,那么陳述句級觸發器將會被觸發1次 ,
四、利用資料庫觸發器實作資料的同步
create or replace trigger sync_salary after update on emp for each row begin --當主表更新后,自動更新備份表, update emp_back set sal=:new.sal where empno=:new.empno; end; /
- 在上面的例子中,當我們更新了主表emp的薪水后,這個行級觸發器將會被自動執行更新備份表中的員工的薪水,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/7333.html
標籤:Oracle
