SQL Server DDL 觸發器(Trigger)-- 介紹

SQL Server DDL 觸發器(Trigger)-- 介紹

 

觸發器(Trigger)以往僅用在特定的對象上,如數據表。當數據維護語言(DML)的Insert、Delete、Update語法針對這些對象工作時,由系統自動調用對應的觸發器,而在SQL Server 2000中增加了Instead of Trigger,通過觸發器來取代原本要執行的添加、修改、刪除語法,且可以設置在視圖上。由於Instead of Trigger是在DML語法真的改變數據寫入事務日誌之前觸發,因此,也稱爲Before Trigger,而我們一般編寫在事務已經發生並寫入日誌後的觸發器,則稱爲After Trigger。

 

在SQL Server 2005之後,則擴展了觸發器的應用面,加入數據定義語言(DDL)觸發器功能。針對DDL語法的執行,乃至於服務器實例/數據庫執行相關的存儲過程、事件也可以啓動觸發器。可用來規範、跟蹤與監控數據庫架構的變化,例如新建、修改或刪除數據表時,要求在什麼條件下允許更改數據表;記錄是誰在何時對哪些數據表的定義,做了什麼樣的更動。如果說DML觸發器是屬於數據表級別的程序,那麼,DDL觸發器就是屬於數據庫級別或是服務器級別的程序,可以針對數據庫等級的語法觸發DDL觸發器。

 

你可能針對數據庫等級的語法觸發DDL觸發器,如CREATE_TABLE;也可以是服務器等級的語法,如CREATE_LOGIN,通過在觸發器內執行ROLLBACK TRANSACTION語法,能夠將原來用戶執行的DDL語法回滾,就如同沒有執行該語法一樣。與DML觸發器相同的是:執行一句DDL可能同時觸發多個DDL觸發器,但我們無法掌控其執行順序,所以,DDL觸發器間不能有先後的依存關係。

 

創建DDL觸發器的語法也是CREATE TRIGGER,其定義如下:

 

CREATE TRIGGER <trigger name>

ON { ALL SERVER | DATABASE }

[ WITH <ddl_trigger_option> [ …,n ]]

{ FOR | AFTER } { event_type | event_group } [ ,…n ]

AS { SQL [ …n ] | EXTERNAL NAME <method definition> }

 

在編寫DDL觸發器時,要指定其針對的目標是ON DATABASE或ON ALL SERVER;兩者可引發觸發器的事件不相同,例如,前者是定義數據庫內的對象,event_type選項有CREATE_TABLE、CREATE_USER、CREATE_SCHEMA等,而後者則是以整個服務器爲目標,其event_type有CREATE_LOGIN、CREATE_ENDPOINT等。你可以發現,若要列出觸發器所針對的DDL語法,是在該語法間以下劃線(_)連接。若不想列出event_type,系統已預先將各種DDL語法分類,例如,DDL_SERVER_SECURITY_EVENTS代表所有以服務器爲目標的各類DDL語法事件,而DDL_TABLE_VEIW_EVENTS則代表了針對數據表、視圖、索引與統計的DDL事件。至於有哪些event_type和event_group,以及其間樹狀結構的關係,你可以參照聯機叢書的詳細列表。

 

最後,在指定DDL觸發器實際的內容定義時,可以是T-SQL寫成的語法,也可以參照.NET來編寫的組件(Assembly)內的方法。

 

DML的觸發器在執行時,能參照SQL Server引擎所創建的deleted和inserted臨時表,而DDL觸發器執行時,則可以調用EVENTDATA()系統函數,以獲取DDL觸發器執行時相關的系統信息。該函數返回XML格式的數據,可以T-SQL的XQuery解析其內容。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章