觸發器是一種特殊的存儲過程,一種不能被顯式執行,而必須依附於一個事件的過程。只要事件發生,就會調用觸發器,運行它的代碼。SQL Server 支持把觸發器和兩種類型的事件關聯:數據操做事件(如INSERT)和數據定義事件(如CREATE TABLE),和這兩種事件關聯的觸發器分別稱爲DML 觸發器和DDL 觸發器。數據庫
觸發器有不少用途,包括審覈數據、實施不能經過約束而實現的完整性規則、實施必定的策略,等等。服務器
能夠把觸發器當作是某個事務的一個組成部分,該事務包含可以觸發觸發器的事件。在觸發器的代碼中執行ROLLBACK TRAN 命令將會致使觸發器內發生的全部更改,以及和觸發器關聯的事務中進行的全部更改都發生回滾。函數
在SQL Server中,觸發器是按照語句觸發的,而不是按照被修改的行而觸發的。post
1. DML觸發器事件
SQL Server 支持兩種DML觸發器:AFTER 觸發器和INSTEAD OF 觸發器。AFTER 觸發器是在與之關聯的事件完成後才觸發的,只能在持久化的表上定義這種觸發器。INSTEAD OF 觸發器的觸發是爲了代替與之關聯的事件操做,能夠在持久化的表或視圖上定義這種類型的觸發器。事務
在觸發器代碼中,能夠訪問稱爲inserted和deleted的兩個表,它們包含致使觸發器觸發修改操做而影響的記錄行。inserted 表包含當執行INSERT和UPDATE 語句時受影響行的新數據的鏡像。deleted表則包含當執行DELETE和UPDATE語句時受影響行的舊數據的鏡像。對於INSTEAD OF 觸發器,inserted和deleted表包含致使觸發器觸發的修改操做打算要影響的行。作用域
CREATE TRIGGER trg_T1_insert_audit ON dbo.T1 AFTER INSERTget
ASit
SET NOCOUNT ON;event
INSERT INTO dbo.T1_Audit(keycol,datacol)
SELECT keycol,datacol FROM inserted;
GO
2. DDL 觸發器
SQL Server 2005 引入了對DDL 觸發器的支持,它們能夠用於在數據庫中執行審覈、加強策略、變化管理等任務。
SQL Server 支持在兩個做用域內建立DDL 觸發器(數據庫做用域和服務器做用域),這要取決於事件的做用域。例如,對於數據庫做用域的事件(如CREATE TABLE),能夠建立數據庫做用域內的觸發器;對於具備服務器做用域的事件(如CREATE DATABASE),能夠建立服務器做用域內的觸發器。SQL Server只支持AFTER類型的DDL觸發器,而不支持BEFORE或INSTEAD OF 類型的DDL觸發器。
在觸發器中,經過查詢EVENTDATA函數(該函數將事件信息做爲XML值返回),能夠獲取關於致使觸發器觸發的事件信息。再用XQuery表達式從XML 值中提取各類事件屬性,如提交時間、事件類型、登陸名稱等。
在數據庫上經過事件組DDL_DATABASE_LEVEL_EVENTS 來建立審覈觸發器trg_audit_ddl_events,這個事件組表明數據庫級上的全部DDL事件:
CREATE TRIGGER trg_audit_ddl_events
ON DATABASE FOR DDL_DATABASE_LEVEL_EVENTS
AS
SET NOCOUNT ON;
DECLARE @eventdata AS XML;
SET @eventdata=eventdata();
INSERT INTO dbo.AuditDDLEvents(
posttime,eventtype,loginname,schemaname,objectname,targetobjectname,eventdate)
VALUES(
@eventdata.value('(/EVENT_INSTANCE/PostTime)[1]', 'VARCHAR(23)'),
@eventdata.value('(/EVENT_INSTANCE/EventType)[1]', 'sysname'),
@eventdata.value('(/EVENT_INSTANCE/LoginName)[1]', 'sysname'),
@eventdata.value('(/EVENT_INSTANCE/SchemaName)[1]', 'sysname'),
@eventdata.value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname'),
@eventdata.value('(/EVENT_INSTANCE/TargetObjectName)[1]', 'sysname'),
@eventdata);
GO