SQL Server提供約束和觸發(fā)器這兩種機制,可以強制使用業(yè)務(wù)規(guī)則和數(shù)據(jù)完整性。其中的觸發(fā)器其實是特殊類型的存儲過程,SQL Server內(nèi)置了DML觸發(fā)器,DDL觸發(fā)器和登錄觸發(fā)器三種常規(guī)類型的觸發(fā)器。
其中的DDL觸發(fā)器通常用于對數(shù)據(jù)庫的保護功能,例如禁止用戶隨意刪除和修改表,數(shù)據(jù)庫對象等內(nèi)容。對于諸如防止數(shù)據(jù)庫架構(gòu)中出現(xiàn)某些更改,希望數(shù)據(jù)庫中發(fā)生某種情況以響應(yīng)數(shù)據(jù)庫架構(gòu)的更改,希望記錄數(shù)據(jù)庫結(jié)構(gòu)中的更改操作或者事件,啟動/停止/暫停和修改跟蹤結(jié)果,重現(xiàn)跟蹤結(jié)果等場景,可以使用DDL觸發(fā)器。
登錄觸發(fā)器是為了響應(yīng)登錄事件而激發(fā)的存儲過程,與SQL Server實例建立用戶會話時將會引發(fā)該事件。例如,希望在某一個特定的時間段只允許某個賬戶登錄SQL Server服務(wù)器時,就可以使用登錄觸發(fā)器來實現(xiàn)。SQL Server引入了對數(shù)據(jù)定義語言DDL觸發(fā)器的支持,允許捕獲DDL操作,并對其作出反應(yīng)。當對SQL Server數(shù)據(jù)庫的安全性進行管理時,離不開DDL觸發(fā)器的支持。例如在刪除數(shù)據(jù)表以及執(zhí)行完整性檢查等方面,都可以借助于DDL觸發(fā)器來實現(xiàn)。
例 如, 執(zhí) 行“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”語句,可以創(chuàng)建名為“Denydrop_table”的DDL觸發(fā)器。
當用戶試圖刪除“Clientzl”數(shù)據(jù)庫中的表時,該觸發(fā)器就會被激活,顯示禁止刪除數(shù)據(jù)表的提示,并執(zhí)行回滾操作,禁止刪除數(shù)據(jù)表。執(zhí)行“DROP TRIGGER Denydrop_table ON DATABASE”語句,可以刪除該觸發(fā)器。
使用登錄觸發(fā)器,可以管控登錄事件。例如執(zhí) 行“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”語句,可以創(chuàng)建名為“shehedenglu”的 登 錄 觸發(fā)器,可以用來捕獲登錄操作事件。這樣,在執(zhí)行諸如創(chuàng)建、更改或者除去一個登錄等操作時,就會激活該觸發(fā)器,顯示相應(yīng)的提示信息。而執(zhí)行“DROP TRIGGER shehedenglu ON ALL SERVER”語句,就可以刪除該登錄觸發(fā)器。