Share via


設計 DDL 觸發程序

在設計 DDL 觸發程序之前,必須先進行下列項目:

  • 您必須瞭解 DDL 觸發程序的範圍。

  • 您必須決定哪些 Transact-SQL 陳述式或陳述式群組將引發此觸發程序。

安全性注意事項安全性注意事項

觸發程序內的惡意程式碼可能在擴大的權限下執行。如需有關如何減少這項威脅的詳細資訊,請參閱<管理觸發程序安全性>。

[!附註]

對於影響區域或全域暫存資料表與預存程序的事件,DDL 觸發程序不會為了回應它而引發。

瞭解觸發程序的範圍

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

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

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 觸發程序的資訊。

如需有關如何擷取 DDL 觸發程序中繼資料的詳細資訊,請參閱<取得 DDL 觸發程序的相關資訊>。

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

可以建立要引發的 DDL 觸發程序,以回應一或多個特定的 DDL 陳述式或是預先定義的 DDL 陳述式群組。

選取特定的 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 觸發程序,可以在 CREATE TRIGGER 陳述式中指定 FOR DDL_TABLE_EVENTS。在執行 CREATE TRIGGER 後,事件群組所涵蓋的事件將加入 sys.trigger_events 目錄檢視中。

[!附註]

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

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