觸發器(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,其定義以下:ide
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解析其內容。