SQL Server提供約束和觸發器這兩種機制,可以強制使用業務規則和數據完整性。其中的觸發器其實是特殊類型的存儲過程,SQL Server內置了DML觸發器,DDL觸發器和登錄觸發器三種常規類型的觸發器。
其中的DDL觸發器通常用于對數據庫的保護功能,例如禁止用戶隨意刪除和修改表,數據庫對象等內容。對于諸如防止數據庫架構中出現某些更改,希望數據庫中發生某種情況以響應數據庫架構的更改,希望記錄數據庫結構中的更改操作或者事件,啟動/停止/暫停和修改跟蹤結果,重現跟蹤結果等場景,可以使用DDL觸發器。
登錄觸發器是為了響應登錄事件而激發的存儲過程,與SQL Server實例建立用戶會話時將會引發該事件。例如,希望在某一個特定的時間段只允許某個賬戶登錄SQL Server服務器時,就可以使用登錄觸發器來實現。SQL Server引入了對數據定義語言DDL觸發器的支持,允許捕獲DDL操作,并對其作出反應。當對SQL Server數據庫的安全性進行管理時,離不開DDL觸發器的支持。例如在刪除數據表以及執行完整性檢查等方面,都可以借助于DDL觸發器來實現。
例 如, 執 行“Use Clientzl”,“go”,“CREATE T R I G G E R D e n y d r o p_t a b l e O N D A T A B A S E F O R D R O P_T A B L E A S RAISERROR('Not allowed to drop tables.', 10,1) PRINT 'DROP TABLE attempt in database' + DB_NAME() + '.'PRINT cast(EventData()a s v a r c h a r(4 0 0 0))ROLLBACK”,“Go”語句,可以創建名為“Denydrop_table”的DDL觸發器。
當用戶試圖刪除“Clientzl”數據庫中的表時,該觸發器就會被激活,顯示禁止刪除數據表的提示,并執行回滾操作,禁止刪除數據表。執行“DROP TRIGGER Denydrop_table ON DATABASE”語句,可以刪除該觸發器。
使用登錄觸發器,可以管控登錄事件。例如執 行“CREATE TRIGGER shehedenglu ON ALL SERVER FOR CREATE_LOGIN, ALTER_LOGIN,DROP_LOGIN AS PRINT'DDL LOGIN took place.'PRINT cast(EventData()as varchar(4000))”,“go”語句,可以創建名為“shehedenglu”的 登 錄 觸發器,可以用來捕獲登錄操作事件。這樣,在執行諸如創建、更改或者除去一個登錄等操作時,就會激活該觸發器,顯示相應的提示信息。而執行“DROP TRIGGER shehedenglu ON ALL SERVER”語句,就可以刪除該登錄觸發器。