數據庫觸發器是一個與表相關聯的,存儲的PL/SQL 語句。每當一個特定的數據操做語句(insert update delete)在指定的表上發出時,Oracle自動執行觸發器中定義的語句序列。數據庫
觸發器的應用場景以下:安全
複雜的安全性檢查ide
數據的確認函數
數據庫審計事件
數據的備份和審計同步
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 pr ocedure_name;
其中:it
BEFORE 和AFTER指出觸發器的觸發時序分別爲前觸發和後觸發方式,前觸發是在執行觸發事件以前觸發當前所建立的觸發器,後觸發是在執行觸發事件以後觸發當前所建立的觸發器。io
FOR EACH ROW選項說明觸發器爲行觸發器。table
行觸發器和語句觸發器的區別表如今:行觸發器要求當一個DML語句操走影響數據庫中的多行數據時,對於其中的每一個數據行,只要它們符合觸發約束條件,均激活一次觸發器;而語句觸發器將整個語句操做做爲觸發事件,當它符合約束條件時,激活一次觸發器。class
當省略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)時要執行的存儲過程,執行時根據其所依附的基表改動而自動觸發,所以與應用程序無關,用數據庫觸發器能夠保證數據的一致性和完整性。
行級觸發器:對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的薪水後,這個行級觸發器將會被自動執行更新備份表中的員工的薪水。