適用於:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric 中的 SQL 資料庫
DDL 觸發程式會在各種資料定義語言(DDL)事件發生時觸發。 這些事件主要對應至以 關鍵詞 CREATE、、ALTER、、DROPGRANT、、 DENYREVOKE或 UPDATE STATISTICS開頭的 Transact-SQL 語句。 執行類似 DDL 作業的某些系統預存程序也可能引發 DDL 觸發程序。
當您要執行下列工作時,請使用 DDL 觸發程式:
- 防止對資料庫結構描述進行特定變更。
- 在資料庫中發生特定動作以回應資料庫結構描述的變更。
- 記錄資料庫結構描述的變更或事件。
重要
請測試 DDL 觸發程序,以判斷它們對執行之系統預存程序的回應。 例如, CREATE TYPE 語句和 sp_addtype 預存程序都會執行在 CREATE_TYPE 事件上建立的 DDL 觸發器。
DDL 觸發程式的類型
Transact-SQL 觸發器
一個特殊類型的 Transact-SQL 預存程序,其可執行一或多個 Transact-SQL 陳述式以回應伺服器範圍或資料庫範圍事件。 例如,DDL 觸發程式可能會在執行像是 ALTER SERVER CONFIGURATION 的語句,或使用 DROP TABLE 刪除資料表時被引發。
CLR 觸發程式
Common Language Runtime (CLR) 觸發器不是執行 Transact-SQL 預存程序,而是執行組件成員的其中一個或多個以托管代碼撰寫的方法,該組件是在 .NET Framework 中建立並上傳至 SQL Server。
在執行會觸發 DDL 觸發程序的 DDL 陳述式之後,才會引發 DDL 觸發程序。 DDL 觸發程式無法用作 INSTEAD OF 觸發程式。 若是影響區域或全域暫存資料表與預存程序的事件,DDL 觸發程序就不會為了回應這類事件而引發。
DDL 觸發程式不會建立特殊 inserted 和 deleted 數據表。
使用 EVENTDATA 函式來擷取引發 DDL 觸發程式的事件資訊,以及觸發程式造成的後續變更。
要針對每個 DDL 事件建立的多個觸發程序。
不同於數據作語言 (DML) 觸發程式,DDL 觸發程式的範圍不限於架構。 因此,、OBJECT_ID、 OBJECT_NAME和 OBJECTPROPERTY 等OBJECTPROPERTYEX函式無法用於查詢有關 DDL 觸發程式的元數據。 請改用目錄檢視。
伺服器範圍的 DDL 觸發程序會出現在 SQL Server Management Studio 物件總管的 [觸發程序] 資料夾中。 這個資料夾在 [伺服器物件] 資料夾之下。 資料庫範圍的 DDL 觸發程序則是出現在 [資料庫觸發程序] 資料夾。 這個資料夾在對應資料庫的 [可程式性] 資料夾之下。
重要
觸發程序內的惡意程式碼可能在擴大的權限下執行。 如需如何協助降低此威脅的詳細資訊,請參閱 管理觸發程序安全性。
DDL 觸發程式作用範圍
DDL 觸發程序可以引發以回應目前資料庫中 (或目前伺服器上) 處理的 Transact-SQL 事件。 觸發程序的範圍需視事件而定。 例如,建立的 DDL 觸發程式,其目的在於對 CREATE_TABLE 事件作出回應,這個觸發程式可以在資料庫的 CREATE_TABLE 事件發生時,或伺服器實例發生事件時執行此操作。 為了回應 CREATE_LOGIN 事件而建立的 DDL 觸發程式只能在伺服器實例中發生 CREATE_LOGIN 事件時觸發。
在下列範例中,無論在資料庫中發生safety事件或DROP_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;
這些清單將 Transact-SQL 語句對應至可為其指定的範圍,相關連結可見於本文稍後的 選取特定 DDL 語句以觸發 DDL 觸發程式 一節中提供。
資料庫範圍的 DDL 觸發程式會以物件的形式儲存在建立它們的資料庫中。 您可以在 master 資料庫中建立 DDL 觸發器,其行為就像在使用者定義的資料庫中建立的觸發器一樣。 您可以藉由查詢 sys.triggers 目錄檢視來取得 DDL 觸發程式的相關信息。 您可以在建立觸發程式的資料庫內容中查詢 sys.triggers ,或藉由將資料庫名稱指定為識別元,例如 master.sys.triggers。
伺服器範圍的 DDL 觸發程式會儲存為 master 資料庫中的物件。 不過,您可以在任何資料庫內容中查詢 sys.server_triggers 目錄檢視,以取得伺服器範圍 DDL 觸發程式的相關信息。
指定 Transact-SQL 語句或語句群組
選擇特定的 DDL 語句以引發 DDL 觸發器
DDL 觸發程序可以設計為在一或多個特定的 Transact-SQL 陳述式執行後引發。 在前面的範例中,觸發程序 safety 會在任何 DROP_TABLE 或 ALTER_TABLE 事件之後引發。 如需可指定來引發 DDL 觸發程序的 Transact-SQL 陳述式的清單,以及觸發程序可引發的範圍,請參閱 DDL 事件。
選取預先定義的 DDL 語句組合以觸發 DDL 觸發程式
DDL 觸發程序可以在執行任何屬於預先定義之相似事件群組的 Transact-SQL 事件之後引發。 例如,如果您希望在執行任何CREATE TABLE、ALTER TABLE或DROP TABLE語句之後觸發 DDL 觸發程式,您可以在FOR DDL_TABLE_EVENTS語句中指定CREATE TRIGGER。 執行之後 CREATE TRIGGER ,事件群組所涵蓋的事件會新增至 sys.trigger_events 目錄檢視。
在 SQL Server 2005 (9.x) 中,如果在事件群組上建立觸發程式,則不包含事件群組的相關信息, sys.trigger_eventssys.trigger_events 則只包含該群組所涵蓋個別事件的相關信息。
sys.trigger_events 會保存建立觸發程式之事件群組的相關元數據,也會保存事件群組涵蓋的個別事件。 因此,事件群組所涵蓋事件的變更不適用於在 SQL Server 2005 (9.x) 中在這些事件群組上建立之最新版 SQL Server 的 DDL 觸發程式。
如需可供 DDL 觸發程序使用之預先定義的 DDL 陳述式群組清單、事件群組所涵蓋的特定陳述式,以及可以為這些事件群組編寫程式的範圍,請參閱< DDL Event Groups>。
相關工作
| Task | 文章 |
|---|---|
| 描述如何建立、修改、刪除或停用 DDL 觸發程式。 | 實作 DDL 觸發程序 |
| 描述如何建立 CLR DDL 觸發程序。 | 建立 CLR 觸發程式 |
| 描述如何傳回有關 DDL 觸發程序的詳細資訊。 | 取得 DDL 觸發程序的資訊 |
描述如何使用EVENTDATA函數來傳回激發 DDL 觸發器之事件的相關資訊。 |
使用 EVENTDATA 函數 |
| 描述如何管理觸發程序安全性。 | 管理觸發程式安全性 |