觸發器是一種特殊類型的存儲過程它不同於存儲過程觸發器主要是通過事件進行觸發而被執行的觸發器的觸發事件分可為類分別是DML事件DDL事件和數據庫事件而存儲過程可以通過存儲過程名字而被直接調用當對某一表進行諸如UPDATE INSERT DELETE 這些操作時SQL Server 就會自動執行觸發器所定義的SQL 語句從而確保對數據的處理必須符合由這些SQL 語句所定義的規則
觸發器是特定事件出現的時候自動執行的代碼塊類似於存儲過程但是用戶不能直接調用他們
觸發器功能
允許/限制對表的修改
自動生成派生列比如自增字段
強制數據一致性
提供審計和日志記錄
防止無效的事務處理
啟用復雜的業務邏輯
觸發器種類
觸發器的種類可劃分為種數據操縱語言(DML)觸發器替代(INSTEAD OF)觸發器數據定義語言(DDL)觸發器數據庫事件觸發器
數據操縱語言(DML)觸發器簡稱DML觸發器是定義在表上的觸發器創建在表上由DML事件引發的觸發器編寫DML觸發器時的兩點要素是 確定觸發的表即在其上定義觸發器的表確定觸發的事件DML觸發器的觸發事件有INSERTUPDATE和DELETE三種;替代觸發器簡稱INSTEAD OF觸發器創建在視圖上用來替換對視圖進行的刪除插入和修改操作; 數據定義語言(DDL)觸發器簡稱DDL觸發器定義在模式上觸發事件是數據對象的創建和修改;數據庫事件觸發器定義在整個數據庫或模式上觸發事件是數據庫事件
ORACLE產生數據庫觸發器的語法為
CREATE [OR REPLACE] TRIGGER 觸發器名
{BEFORE|AFTER|INSTEAD OF} 觸發事件 [OR 觸發事件]
ON 表名
WHEN 觸發條件
[FOR EACH ROW]
DECLARE
聲明部分
BEGIN
主體部分
END;
其中
觸發器名觸發器對象的名稱由於觸發器是數據庫自動執行的因此該名稱只是一個名稱沒有實質的用途一個觸發器可由多個不同的數據操縱語言操作觸發在觸發器中可用INSERTINGDELETINGUPDATING謂詞來區別不同的數據操縱語言操作這些謂詞可以在IF分支條件語句中作為判斷條件來使用
觸發時間指明觸發器何時執行該值可取 觸發的時間有BEFORE和AFTER兩種分別表示觸發動作發生在DML語句執行之前和語句執行之後確定觸發級別有語句級觸發器和行級觸發器兩種語句級觸發器表示SQL語句只觸發一次觸發器行級觸發器表示SQL語句影響的每一行都要觸發一次
Before表示在數據庫動作之前觸發器執行;在SQL語句的執行過程中如果存在行級BEFORE觸發器則SQL語句在對每一行操作之前都要先執行一次行級BEFORE觸發器然後才對行進行操作如果存在行級AFTER觸發器則SQL語句在對每一行操作之後都要再執行一次行級AFTER觸發器
after表示在數據庫動作之後出發器執行如果存在語句級AFTER觸發器則在SQL語句執行完畢後要最後執行一次語句級AFTER觸發器
觸發事件指明哪些數據庫動作會觸發此觸發器指INSERTDELETE或UPDATE事件事件可以並行出現中間用OR連接;
insert數據庫插入會觸發此觸發器;
update數據庫修改會觸發此觸發器;
delete數據庫刪除會觸發此觸發器
表 名數據庫觸發器所在的表
for each row表示觸發器為行級觸發器省略則為語句級觸發器對表的每一行觸發器執行一次
觸發器的創建者或具有DROP ANY TIRGGER系統權限的人才能刪除觸發器刪除觸發器的語法如下
DROP TIRGGER 觸發器名
可以通過命令設置觸發器的可用狀態使其暫時關閉或重新打開即當觸發器暫時不用時可以將其置成無效狀態在使用時重新打開該命令語法如下
ALTER TRIGGER 觸發器名 {DISABLE|ENABLE}
其中DISABLE表示使觸發器失效ENABLE表示使觸發器生效
同存儲過程類似觸發器可以用SHOW ERRORS 檢查編譯錯誤
如果有多個觸發器被定義成為相同時間相同事件觸發且最後定義的觸發器是有效的則最後定義的觸發器被觸發其他觸發器不執行觸發器體內禁止使用COMMITROLLBACKSAVEPOINT語句也禁止直接或間接地調用含有上述語句的存儲過程定義一個觸發器時要考慮上述多種情況並根據具體的需要來決定觸發器的種類
觸發器的作用
觸發器的主要作用就是其能夠實現由主鍵和外鍵所不能保證的復雜的參照完整性和數據的一致性除此之外觸發器還有其它許多不同的功能
() 強化約束(Enforce restriction)
觸發器能夠實現比CHECK 語句更為復雜的約束
() 跟蹤變化Auditing changes
觸發器可以偵測數據庫內的操作從而不允許數據庫中未經許可的指定更新和變化
() 級聯運行(Cascaded operation)
觸發器可以偵測數據庫內的操作並自動地級聯影響整個數據庫的各項內容例如某個表上的觸發器中包含有對另外一個表的數據操作(如刪除更新插入)而該操作又導致該表上觸發器被觸發
() 存儲過程的調用(Stored procedure invocation)
為了響應數據庫更新觸發器可以調用一個或多個存儲過程甚至可以通過外部過程的調用而在DBMS( 數據庫管理系統)本身之外進行操作
由此可見觸發器可以解決高級形式的業務規則或復雜行為限制以及實現定制記錄等一些方面的問題例如觸發器能夠找出某一表在數據修改前後狀態發生的差異並根據這種差異執行一定的處理此外一個表的同一類型(INSERT UPDATE DELETE)的多個觸發器能夠對同一種數據操作采取多種不同的處理
總體而言觸發器性能通常比較低
當運行觸發器時系統處理的大部分時間花費在參照其它表的這一處理上因為這些表既不在內存中也不在數據庫設備上而刪除表和插入表總是位於內存中可見觸發器所參照的其它表的位置決定了操作要花費的時間長短
From:http://tw.wingwit.com/Article/program/Oracle/201311/18340.html