Share via


設計 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 TABLEALTER 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 日

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