DDL 觸發器用於響應各類數據定義語言 (DDL) 事件。 這些事件主要與以關鍵字 CREATE、ALTER、DROP、GRANT、DENY、REVOKE 或 UPDATE STATISTICS 開頭的 Transact-SQL 語句對應。 執行 DDL 式操做的系統存儲過程也能夠激發 DDL 觸發器。sql
DDL觸發器在數據庫或模式級運行,DDL觸發器一般用於記錄數據庫的修改過程和監控數據庫中的重要事件。數據庫
--聲明數據庫引用
use 數據庫名;
go安全
--判斷是否存在要建立的觸發器,若是存在則刪除
if exists(select * from sys.triggers where name=觸發器名)
drop trigger 觸發器名 on { database | all server };
go服務器
--建立觸發器
create架構
--觸發器標識符
trigger函數
--DML 觸發器所屬架構的名稱。 DML 觸發器的做用域是爲其建立該觸發器的表或視圖的架構。 不能爲 DDL 或登陸觸發器指定 schema_name。
--[ schema_name .]
--觸發器名稱
觸發器名spa
--ALL SERVER
--適用範圍: SQL Server 2008 到 SQL Server 2017。
--將 DDL 或登陸觸發器的做用域應用於當前服務器。 若是指定了此參數,則只要當前服務器中的任何位置出現 event_type 或 event_group,就會激發該觸發器。
--database
--將 DDL 觸發器的做用域應用於當前數據庫。 若是指定了此參數,則只要當前數據庫中出現 event_type 或 event_group,就會激發該觸發器。
on { database | all server }server
[with]對象
--適用範圍: SQL Server 2008 到 SQL Server 2017。
--對 CREATE TRIGGER 語句的文本進行模糊處理。 使用 WITH ENCRYPTION 能夠防止將觸發器做爲 SQL Server 複製的一部分進行發佈。 不能爲 CLR 觸發器指定 WITH ENCRYPTION。
encryptionblog
--EXECUTE AS Clause
--{ EXEC | EXECUTE } AS { SELF | OWNER | 'user_name' }
--CALLER
--指定模塊內的語句在模塊調用方的上下文中執行。 執行模塊的用戶不只必須對模塊自己擁有適當的權限,還要對模塊引用的任何數據庫對象擁有適當權限。
--CALLER 是除隊列外的全部模塊的默認值,與 SQL Server 2005 行爲相同。
--CALLER 不能在 CREATE QUEUE 或 ALTER QUEUE 語句中指定。
--SELF
--EXECUTE AS SELF 與 EXECUTE AS user_name 等價,其中指定用戶是建立或更改模塊的用戶。 建立或更改模塊的用戶的實際用戶 ID 存儲在 sys.sql_modules 或 sys.service_queues 目錄視圖的 execute_as_principal_id 列中。
--SELF 是隊列的默認值。
--OWNER
--指定模塊內的語句在模塊的當前全部者上下文中執行。 若是模塊沒有指定的全部者,則使用模塊架構的全部者。 不能爲 DDL 或登陸觸發器指定 OWNER。
--' user_name '
--指定模塊內的語句在 user_name 指定的用戶的上下文中執行。 將根據 user_name 來驗證對模塊內任意對象的權限。 不能爲具備服務器做用域的 DDL 觸發器或登陸觸發器指定 user_name。 請改用 login_name。
--user_name 必須存在於當前數據庫中,而且必須是單一實例賬戶。 user_name 不能爲組、角色、證書、密鑰或內置賬戶,如 NT AUTHORITYLocalService、NT AUTHORITYNetworkService 或 NT AUTHORITYLocalSystem。
--執行上下文的用戶 ID 存儲在元數據中,能夠在 sys.sql_modules 或 sys.assembly_modules 目錄視圖的 execute_as_principal_id 列查看。
[execute as caller]
--FOR | AFTER
--AFTER 指定 DML 觸發器僅在觸發 SQL 語句中指定的全部操做都已成功執行時才被觸發。 全部的引用級聯操做和約束檢查也必須在激發此觸發器以前成功完成。
--若是僅指定 FOR 關鍵字,則 AFTER 爲默認值。
--不能對視圖定義 AFTER 觸發器。
{ for | after }
--event_type
--執行以後將致使激發 DDL 觸發器的 Transact-SQL 語言事件的名稱。 DDL 事件中列出了 DDL 觸發器的有效事件。
--event_group
--預約義的 Transact-SQL 語言事件分組的名稱。 執行任何屬於 event_group 的 Transact-SQL 語言事件以後,都將激發 DDL 觸發器。 DDL 事件組中列出了 DDL 觸發器的有效事件組。
--CREATE TRIGGER 運行完成後,event_group 還將充當宏,將它涉及的事件類型添加到 sys.trigger_events 目錄視圖中。
{ event_type | event_group }
as
begin
sql_statement;
end
go
--聲明數據庫引用
use testss;
go
--判斷是否存在要建立的觸發器,若是存在則刪除
if exists(select * from sys.triggers where name='ddltri')
drop trigger ddltri on database;
go
--建立觸發器
create
--觸發器標識符
trigger
--DML 觸發器所屬架構的名稱。 DML 觸發器的做用域是爲其建立該觸發器的表或視圖的架構。 不能爲 DDL 或登陸觸發器指定 schema_name。
--[ schema_name .]
--觸發器名稱
ddltri
--ALL SERVER
--適用範圍: SQL Server 2008 到 SQL Server 2017。
--將 DDL 或登陸觸發器的做用域應用於當前服務器。 若是指定了此參數,則只要當前服務器中的任何位置出現 event_type 或 event_group,就會激發該觸發器。
--database
--將 DDL 觸發器的做用域應用於當前數據庫。 若是指定了此參數,則只要當前數據庫中出現 event_type 或 event_group,就會激發該觸發器。
on database
with
--適用範圍: SQL Server 2008 到 SQL Server 2017。
--對 CREATE TRIGGER 語句的文本進行模糊處理。 使用 WITH ENCRYPTION 能夠防止將觸發器做爲 SQL Server 複製的一部分進行發佈。 不能爲 CLR 觸發器指定 WITH ENCRYPTION。
encryption,
--EXECUTE AS Clause
--{ EXEC | EXECUTE } AS { SELF | OWNER | 'user_name' }
--CALLER
--指定模塊內的語句在模塊調用方的上下文中執行。 執行模塊的用戶不只必須對模塊自己擁有適當的權限,還要對模塊引用的任何數據庫對象擁有適當權限。
--CALLER 是除隊列外的全部模塊的默認值,與 SQL Server 2005 行爲相同。
--CALLER 不能在 CREATE QUEUE 或 ALTER QUEUE 語句中指定。
--SELF
--EXECUTE AS SELF 與 EXECUTE AS user_name 等價,其中指定用戶是建立或更改模塊的用戶。 建立或更改模塊的用戶的實際用戶 ID 存儲在 sys.sql_modules 或 sys.service_queues 目錄視圖的 execute_as_principal_id 列中。
--SELF 是隊列的默認值。
--OWNER
--指定模塊內的語句在模塊的當前全部者上下文中執行。 若是模塊沒有指定的全部者,則使用模塊架構的全部者。 不能爲 DDL 或登陸觸發器指定 OWNER。
--' user_name '
--指定模塊內的語句在 user_name 指定的用戶的上下文中執行。 將根據 user_name 來驗證對模塊內任意對象的權限。 不能爲具備服務器做用域的 DDL 觸發器或登陸觸發器指定 user_name。 請改用 login_name。
--user_name 必須存在於當前數據庫中,而且必須是單一實例賬戶。 user_name 不能爲組、角色、證書、密鑰或內置賬戶,如 NT AUTHORITYLocalService、NT AUTHORITYNetworkService 或 NT AUTHORITYLocalSystem。
--執行上下文的用戶 ID 存儲在元數據中,能夠在 sys.sql_modules 或 sys.assembly_modules 目錄視圖的 execute_as_principal_id 列查看。
execute as caller
--FOR | AFTER
--AFTER 指定 DML 觸發器僅在觸發 SQL 語句中指定的全部操做都已成功執行時才被觸發。 全部的引用級聯操做和約束檢查也必須在激發此觸發器以前成功完成。
--若是僅指定 FOR 關鍵字,則 AFTER 爲默認值。
--不能對視圖定義 AFTER 觸發器。
for
--event_type
--執行以後將致使激發 DDL 觸發器的 Transact-SQL 語言事件的名稱。 DDL 事件中列出了 DDL 觸發器的有效事件。
--event_group
--預約義的 Transact-SQL 語言事件分組的名稱。 執行任何屬於 event_group 的 Transact-SQL 語言事件以後,都將激發 DDL 觸發器。 DDL 事件組中列出了 DDL 觸發器的有效事件組。
--CREATE TRIGGER 運行完成後,event_group 還將充當宏,將它涉及的事件類型添加到 sys.trigger_events 目錄視圖中。
create_table,alter_table,drop_table
as
begin
print('你觸發了ddl觸發器');
end
go
優勢:
一、記錄數據庫的修改過程。
二、監控數據庫中的重要事件。
三、防止對數據庫架構執行惡意更改。
四、更加安全。
五、經過使用 EVENTDATA( ) 函數,能夠在觸發器中使用XML信息。
缺點:
一、濫用會形成數據庫及應用程序的維護困難。