設計 DDL 觸發程序
更新: 2006 年 12 月 12 日
在設計 DDL 觸發程序之前,必須先進行下列項目:
- 您必須瞭解 DDL 觸發程序的範圍。
- 您必須決定哪些 Transact-SQL 陳述式或陳述式群組將引發觸發程序。
安全性注意事項: |
---|
觸發程序內的惡意程式碼可能在擴大的權限下執行。如需有關如何減輕這項威脅的詳細資訊,請參閱<管理觸發程序安全性>。 |
瞭解觸發程序的範圍
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 觸發程序
說明及資訊
變更歷程記錄
版本 | 歷程記錄 |
---|---|
2006 年 12 月 12 日 |
|
2006 年 7 月 17 日 |
|