設計 DDL 觸發程序

更新: 2006 年 12 月 12 日

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

  • 您必須瞭解 DDL 觸發程序的範圍。
  • 您必須決定哪些 Transact-SQL 陳述式或陳述式群組將引發觸發程序。
ms186406.security(zh-tw,SQL.90).gif安全性注意事項:
觸發程序內的惡意程式碼可能在擴大的權限下執行。如需有關如何減輕這項威脅的詳細資訊,請參閱<管理觸發程序安全性>。

瞭解觸發程序的範圍

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 陳述式的文字。如需如何使用 EVENTDATA 及 DDL 觸發程序的詳細資訊,請參閱<使用 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 資料庫中建立,其行為方式就與在使用者指定的資料庫中所建立的相似。DDL 觸發程序的資訊可在 sys.triggers 目錄檢視內,從建立這些觸發程序的資料庫內容中取得,或指定資料庫名稱作為識別項 (如 master.sys.triggers) 來找出。

以伺服器限定範圍的 DDL 觸發程序是以物件的形式儲存在 master 資料庫中。然而,以伺服器限定範圍的 DDL 觸發程序資訊可從任何資料庫內容中的 sys.server_triggers 目錄檢視取得。

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

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

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

您可以建立 DDL 觸發程序,為回應下列事件而引發:

  • 一或多個特定 DDL 陳述式。
  • DDL 陳述式預先定義的群組

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

DDL 觸發程序可以設計成在執行一或多個特定 Transact-SQL 陳述式之後才引發。在前面的範例中,於 DROP TABLE 或 ALTER TABLE 事件後面會引發觸發程序安全性。

並非所有的 DDL 事件都可以用來引發 DDL 觸發程序。有些事件只能用於非同步、非交易的陳述式。例如,ADD_ROLE_MEMBER 事件就不能用來引發 DDL 觸發程序。您應該針對這些事件使用事件通知。如需事件通知的詳細資訊,請參閱<事件通知 (Database Engine)>。

<與 DDL 觸發程序搭配使用的 DDL 事件>主題列出可以指定用來引發 DDL 觸發程序的 Transact-SQL 陳述式,以及這些陳述式可以引發的範圍。

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

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

<與 DDL 觸發程序搭配使用的事件群組>主題列出 DDL 觸發程序可使用的預先定義之 DDL 陳述式群組、它們所涵蓋的特定陳述式以及可以設計這些事件群組的範圍。

請參閱

概念

使用 EVENTDATA 函數
瞭解 DDL 觸發程序
實作 DDL 觸發程序

說明及資訊

取得 SQL Server 2005 協助

變更歷程記錄

版本 歷程記錄

2006 年 12 月 12 日

變更的內容:
  • 更正 CREATE_DATABASE 事件不能用來引發 DDL 觸發程序的錯誤資訊。ADD_ROLE_MEMBER 已取代此事件,做為可以用來引發事件通知,但不能引發 DDL 觸發程序的範例。

2006 年 7 月 17 日

變更的內容:
  • 更新「瞭解觸發程序的範圍」中的第二個範例。