DDL 觸發程序

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體

DDL 觸發程序則是為了回應各種資料定義語言 (DDL) 事件而引發的。 這些事件主要對應至以 CREATE、ALTER、DROP、GRANT、DENY、REVOKE 或 UPDATE STATISTICS 關鍵字開頭的 Transact-SQL 陳述式。 執行類似 DDL 作業的某些系統預存程序也可能引發 DDL 觸發程序。

當您要執行下列作業時,可使用 DDL 觸發程序:

  • 防止對資料庫結構描述進行特定變更。

  • 在資料庫中發生特定動作以回應資料庫結構描述的變更。

  • 記錄資料庫結構描述的變更或事件。

重要

請測試 DDL 觸發程序,以判斷它們對執行之系統預存程序的回應。 例如,CREATE TYPE 陳述式與 sp_addtype 預存程序,都會引發在 CREATE_TYPE 事件上建立的 DDL 觸發程序。

DDL 觸發程序的類型

Transact-SQL DDL 觸發程序

一個特殊類型的 Transact-SQL 預存程序,其可執行一或多個 Transact-SQL 陳述式以回應伺服器範圍或資料庫範圍事件。 例如,如果執行陳述式 (例如 ALTER SERVER CONFIGURATION) 或使用 DROP TABLE 刪除資料表,則可能會引發 DDL 觸發程序。

CLR DDL 觸發程序

CLR 觸發程序不執行 Transact-SQL 預存程序,而是執行以 Managed 程式碼撰寫的一個或多個方法,這些方法是在 .NET Framework 中建立並在 SQL Server 中上傳的組件成員。

在執行會觸發 DDL 觸發程序的 DDL 陳述式之後,才會引發 DDL 觸發程序。 DDL 觸發程序不能使用為 INSTEAD OF 觸發程序。 對於影響區域或全域暫存資料表與預存程序的事件,DDL 觸發程序不會為了回應它而引發。

DDL 觸發程序不會建立特殊 inserteddeleted 資料表。

使用 EVENTDATA 函數將可擷取引發 DLL 觸發程序的事件資訊,以及觸發程序所造成的後續變更之資訊。

要針對每個 DDL 事件建立的多個觸發程序。

DDL 觸發程序不像 DML 觸發程序,並不以結構描述為範圍。 因此,OBJECT_ID、OBJECT_NAME、OBJECTPROPERTY 和 OBJECTPROPERTYEX 等函數無法用來查詢有關 DDL 觸發程序的中繼資料。 請改用目錄檢視。

伺服器範圍的 DDL 觸發程序會出現在 SQL Server Management Studio 物件總管的 [觸發程序] 資料夾中。 這個資料夾在 [伺服器物件] 資料夾之下。 資料庫範圍的 DDL 觸發程序則是出現在 [資料庫觸發程序] 資料夾。 這個資料夾在對應資料庫的 [可程式性] 資料夾之下。

重要

觸發程序內的惡意程式碼可能在擴大的權限下執行。 如需如何協助降低此威脅的詳細資訊,請參閱 管理觸發程序安全性

DDL 觸發程序範圍

DDL 觸發程序可以引發以回應目前資料庫中 (或目前伺服器上) 處理的 Transact-SQL 事件。 觸發程序的範圍需視事件而定。 例如,每當資料庫或伺服器執行個體上發生 CREATE_TABLE 事件時,為了回應 CREATE_TABLE 事件而建立來引發的 DDL 觸發程序可以進行此處理。 只有當伺服器執行個體上發生 CREATE_LOGIN 事件時,為了回應 CREATE_LOGIN 事件而建立來引發的 DDL 觸發程序才可以進行此處理。

在下列範例中,每當資料庫中發生 safetyDROP_TABLE 事件時,就會引發 DDL 觸發程序 ALTER_TABLE

CREATE TRIGGER safety   
ON DATABASE   
FOR DROP_TABLE, ALTER_TABLE   
AS   
   PRINT 'You must disable Trigger "safety" to drop or alter tables!'   
   ROLLBACK;  

在下列範例中,如果目前伺服器執行個體上發生了任何 CREATE_DATABASE 事件,DDL 觸發程序就會列印訊息。 該範例使用 EVENTDATA 函式來擷取對應 Transact-SQL 陳述式的文字。 如需如何搭配 DDL 觸發程序使用 EVENTDATA 的詳細資訊,請參閱 使用 EVENTDATA 函數

IF EXISTS (SELECT * FROM sys.server_triggers  
    WHERE name = 'ddl_trig_database')  
DROP TRIGGER ddl_trig_database  
ON ALL SERVER;  
GO  
CREATE TRIGGER ddl_trig_database   
ON ALL SERVER   
FOR CREATE_DATABASE   
AS   
    PRINT 'Database Created.'  
    SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')  
GO  
DROP TRIGGER ddl_trig_database  
ON ALL SERVER;  
GO  
  

您可以在本主題後面「選取特定的 DDL 陳述式以引發 DDL 觸發程序」一節所提供的連結中,找到 Transact-SQL 陳述式與其可指定之範圍的對應清單。

以資料庫限定範圍的 DDL 觸發程序是以物件形式儲存在它們所建立的資料庫中。 DDL 觸發程序可以在 master 資料庫中建立,其運作方式與使用者指定的資料庫中所建立者相似。 您可以查詢 sys.triggers 目錄檢視,以取得有關 DDL 觸發程序的資訊。 您可以在觸發程序建立所在的資料庫環境中查詢 sys.triggers ,或是藉由將資料庫名稱指定為識別碼,例如 master.sys.triggers

伺服器範圍的 DDL 觸發程序是以物件的形式儲存在 master 資料庫中。 然而,您可以藉由查詢任何資料庫環境中的 sys.server_triggers 目錄檢視,以取得有關伺服器範圍之 DDL 觸發程序的資訊。

指定 Transact-SQL 陳述式或陳述式群組

選取特定的 DDL 陳述式以引發 DDL 觸發程序

DDL 觸發程序可以設計為在一或多個特定的 Transact-SQL 陳述式執行後引發。 在前面的範例中,觸發程序 safety 會在任何 DROP_TABLEALTER_TABLE 事件之後引發。 如需可指定來引發 DDL 觸發程序的 Transact-SQL 陳述式的清單,以及觸發程序可引發的範圍,請參閱 DDL 事件

選取預先定義的 DDL 陳述式群組以引發 DDL 觸發程序

DDL 觸發程序可以在執行任何屬於預先定義之相似事件群組的 Transact-SQL 事件之後引發。 例如,如果您想要在執行 CREATE TABLE、ALTER TABLE 或 DROP TABLE 陳述式後引發 DDL 觸發程序,可以在 CREATE TRIGGER 陳述式中指定 FOR DDL_TABLE_EVENTS。 在執行 CREATE TRIGGER 後,事件群組所涵蓋的事件將加入 sys.trigger_events 目錄檢視中。

在 SQL Server 2005 (9.x) 中,如果在事件群組上建立觸發程序,則 sys.trigger_events 不會包含有關此事件群組的資訊,而 sys.trigger_events 只會包含有關該群組所涵蓋之個別事件的資訊。 在 SQL Server 2008 (10.0.x) 和更新版本中,sys.trigger_events 會持續保存有關觸發程序建立所在之事件群組的中繼資料,也會持續保存有關該事件群組所涵蓋之個別事件的中繼資料。 因此,對 SQL Server 2008 (10.0.x) 和更新版本中事件群組所涵蓋之事件的變更,不會套用到 SQL Server 2005 (9.x) 中的這些事件群組上所建立的 DDL 觸發程序。

如需可供 DDL 觸發程序使用之預先定義的 DDL 陳述式群組清單、事件群組所涵蓋的特定陳述式,以及可以為這些事件群組編寫程式的範圍,請參閱< DDL Event Groups>。

Task 主題
描述如何建立、修改、刪除或停用 DDL 觸發程序。 實作 DDL 觸發程序
描述如何建立 CLR DDL 觸發程序。 建立 CLR 觸發程序
描述如何傳回有關 DDL 觸發程序的詳細資訊。 取得 DDL 觸發程序的資訊
描述如何傳回有關使用 EVENTDATA 函數引發 DDL 觸發程序之事件的詳細資訊。 使用 EVENTDATA 函數
描述如何管理觸發程序安全性。 管理觸發程序安全性

另請參閱

DML 觸發程序
登入觸發程序
CREATE TRIGGER (Transact-SQL)
EVENTDATA (Transact-SQL)