DDL トリガーDDL Triggers

適用対象: ○SQL Server ○Azure SQL Database XAzure SQL Data Warehouse XParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

DDL トリガーは、さまざまなデータ定義言語 (DDL) イベントに対応して起動されます。DDL triggers fire in response to a variety of Data Definition Language (DDL) events. これらのイベントは主に、CREATE、ALTER、DROP、GRANT、DENY、REVOKE、UPDATE STATISTICS のいずれかのキーワードで始まる Transact-SQLTransact-SQL ステートメントに対応します。These events primarily correspond to Transact-SQLTransact-SQL statements that start with the keywords CREATE, ALTER, DROP, GRANT, DENY, REVOKE or UPDATE STATISTICS. DDL と同様の操作を実行する特定のシステム ストアド プロシージャも DDL トリガーを起動できます。Certain system stored procedures that perform DDL-like operations can also fire DDL triggers.

DDL トリガーは、次のような場合に使用します。Use DDL triggers when you want to do the following:

  • データベース スキーマへの特定の変更を回避する。Prevent certain changes to your database schema.

  • データベース スキーマの変更に対して、データベース内でなんらかの処理を実行する。Have something occur in the database in response to a change in your database schema.

  • データベース スキーマの変更またはイベントを記録する。Record changes or events in the database schema.

重要

DDL トリガーはテストして、実行されているシステム ストアド プロシージャに応答するかどうか、確認してください。Test your DDL triggers to determine their responses to system stored procedures that are run. たとえば、CREATE TYPE ステートメントおよび sp_addtype ストアド プロシージャはどちらも、CREATE_TYPE イベントで作成される DDL トリガーを起動します。For example, the CREATE TYPE statement and the sp_addtype stored procedure will both fire a DDL trigger that is created on a CREATE_TYPE event.

DDL トリガーの種類Types of DDL Triggers

Transact-SQL DDL トリガーTransact-SQL DDL Trigger

サーバー スコープまたはデータベース スコープのイベントに応答して Transact-SQLTransact-SQL ステートメント (複数可) を実行する特殊な Transact-SQLTransact-SQL ストアド プロシージャです。A special type of Transact-SQLTransact-SQL stored procedure that executes one or more Transact-SQLTransact-SQL statements in response to a server-scoped or database-scoped event. たとえば、ALTER SERVER CONFIGURATION などのステートメントが実行されたときや、DROP TABLE を使用してテーブルが削除されたときに、DDL トリガーを起動させることができます。For example, a DDL Trigger may fire if a statement such as ALTER SERVER CONFIGURATION is executed or if a table is deleted by using DROP TABLE.

CLR DDL トリガーCLR DDL Trigger

CLR トリガーは、 Transact-SQLTransact-SQL ストアド プロシージャを実行するのではなく、.NET Framework で作成され、 SQL ServerSQL Serverでアップロードされたアセンブリのメンバーであるマネージド コードに記述されている、1 つ以上のメソッドを実行します。Instead of executing a Transact-SQLTransact-SQL stored procedure, a CLR trigger executes one or more methods written in managed code that are members of an assembly created in the .NET Framework and uploaded in SQL ServerSQL Server.

DDL トリガーは、起動元の DDL ステートメントが実行されるまで、起動されません。DDL triggers fire only after the DDL statements that trigger them are run. DDL トリガーを INSTEAD OF トリガーの代わりに使用することはできません。DDL triggers cannot be used as INSTEAD OF triggers. DDL トリガーは、ローカルまたはグローバルの一時テーブルおよびストアド プロシージャに影響するイベントに応答して起動されることはありません。DDL triggers do not fire in response to events that affect local or global temporary tables and stored procedures.

DDL トリガーでは、特殊な inserted テーブルや deleted テーブルは作成できません。DDL triggers do not create the special inserted and deleted tables.

DDL トリガーを起動するイベントの情報と、起動したトリガーにより加えられる変更は、EVENTDATA 関数を使用してキャプチャします。The information about an event that fires a DDL trigger, and the subsequent changes caused by the trigger, is captured by using the EVENTDATA function.

DDL イベントごとに作成される複数のトリガー。Multiple triggers to be created for each DDL event.

DML トリガーと異なり、DDL トリガーのスコープはスキーマに設定されません。Unlike DML triggers, DDL triggers are not scoped to schemas. このため、DDL トリガーに関するメタデータのクエリに、OBJECT_ID、OBJECT_NAME、OBJECTPROPERTY、OBJECTPROPERTYEX などの関数を使用することはできません。Therefore, functions such as OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY, and OBJECTPROPERTYEX cannot be used for querying metadata about DDL triggers. 代わりに、カタログ ビューを使用してください。Use the catalog views instead.

サーバー スコープの DDL トリガーは、SQL Server Management Studio のオブジェクト エクスプローラーの [Triggers] フォルダーに表示されます。Server-scoped DDL triggers appear in the SQL Server Management Studio Object Explorer in the Triggers folder. このフォルダーは、 [Server Objects] フォルダーにあります。This folder is located under the Server Objects folder. データベース スコープの DDL トリガーは、 [データベース トリガー] フォルダーに表示されます。Database-scoped DDL triggers appear in the Database Triggers folder. このフォルダーは対応するデータベースの [Programmability] フォルダーにあります。This folder is located under the Programmability folder of the corresponding database.

重要

上位の特権の下では、トリガー内の悪意のあるコードを実行できます。Malicious code inside triggers can run under escalated privileges. この脅威の軽減方法の詳細については、「 トリガーのセキュリティの管理」を参照してください。For more information about how to help reduce this threat, see Manage Trigger Security.

DDL トリガーのスコープDDL Trigger Scope

DDL トリガーは、現在のデータベースまたは現在のサーバーで処理されている Transact-SQLTransact-SQL イベントに応答して起動されます。DDL triggers can fire in response to a Transact-SQLTransact-SQL event processed in the current database, or on the current server. トリガーのスコープは、イベントによって異なります。The scope of the trigger depends on the event. たとえば、CREATE_TABLE イベントに応答して起動されるように作成された DDL トリガーは、データベース、またはサーバー インスタンスで CREATE_TABLE イベントが発生するたびに起動されます。For example, a DDL trigger created to fire in response to a CREATE_TABLE event can do so whenever a CREATE_TABLE event occurs in the database, or on the server instance. CREATE_LOGIN イベントに応答して起動されるように作成された DDL トリガーは、サーバー インスタンスで CREATE_LOGIN イベントが発生した場合にのみ起動できます。A DDL trigger created to fire in response to a CREATE_LOGIN event can do so only when a CREATE_LOGIN event occurs in the server instance.

次の例では、データベースで safety イベントまたは DROP_TABLE イベントが発生するたびに、DDL トリガー ALTER_TABLE が起動されます。In the following example, DDL trigger safety will fire whenever a DROP_TABLE or ALTER_TABLE event occurs in the database.

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 トリガーによってメッセージが出力されます。In the following example, a DDL trigger prints a message if any CREATE_DATABASE event occurs on the current server instance. この例では、対応する EVENTDATA ステートメントのテキストを取得するために Transact-SQLTransact-SQL 関数を使用します。The example uses the EVENTDATA function to retrieve the text of the corresponding Transact-SQLTransact-SQL statement. DDL トリガーで EVENTDATA を使用する方法の詳細については、「 EVENTDATA 関数の使用」を参照してください。For more information about how to use EVENTDATA with DDL triggers, see Use the EVENTDATA Function.

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  
  

Transact-SQLTransact-SQL ステートメントに指定できるスコープをそのステートメントに対応付けた一覧については、「DDL トリガーを起動するための、特定の DDL ステートメントの選択」に記載されたリンクを参照してください。The lists that map the Transact-SQLTransact-SQL statements to the scopes that can be specified for them are available through the links provided in the section "Selecting a Particular DDL Statement to Fire a DDL Trigger," later in this topic.

データベース スコープが設定された DDL トリガーは、DDL トリガーが作成されたデータベースにオブジェクトとして格納されます。Database-scoped DDL triggers are stored as objects in the database in which they are created. DDL トリガーを master データベースに作成することもでき、ユーザーが設計したデータベースで作成されたトリガーと同様に動作します。DDL triggers can be created in the master database and behave just like those created in user-designed databases. sys.triggers カタログ ビューにクエリを実行することで、DDL トリガーに関する情報を取得できます。You can obtain information about DDL triggers by querying the sys.triggers catalog view. トリガーが作成されたデータベース コンテキスト内の sys.triggers に対してクエリを実行できます。または、識別子 (たとえば、 master.sys.triggers) としてデータベース名を指定することもできます。You can query sys.triggers within the database context in which the triggers are created or by specifying the database name as an identifier, such as master.sys.triggers.

サーバー スコープが設定された DDL トリガーは、 master データベースにオブジェクトとして格納されます。Server-scoped DDL triggers are stored as objects in the master database. ただし、サーバー スコープが設定された DDL トリガーに関する情報は、任意のデータベース コンテキストの sys.server_triggers カタログ ビューから取得できます。However, you can obtain information about server-scoped DDL triggers by querying the sys.server_triggers catalog view in any database context.

Transact-SQL ステートメントまたはステートメントのグループの指定Specifying a Transact-SQL Statement or Group of Statements

DDL トリガーを起動するための、特定の DDL ステートメントの選択Selecting a Particular DDL Statement to Fire a DDL Trigger

DDL トリガーは、1 つ以上の特定の Transact-SQLTransact-SQL ステートメントが実行された後に起動されるように設計できます。DDL triggers can be designed to fire after one or more particular Transact-SQLTransact-SQL statements are run. 前の例では、 safety イベント、または DROP_TABLE イベントの後に ALTER_TABLE トリガーが起動されます。In the previous example, trigger safety fires after any DROP_TABLE or ALTER_TABLE event. DDL トリガーを起動するために指定できる各 Transact-SQLTransact-SQL ステートメント、および DDL トリガーを起動できるスコープの一覧については、「 DDL イベント」を参照してください。For lists of the Transact-SQLTransact-SQL statements that can be specified to fire a DDL trigger, and the scope at which the trigger can fire, see DDL Events.

DDL トリガーを起動するための、事前定義済み DDL ステートメントのグループの選択Selecting a Predefined Group of DDL Statements to Fire a DDL Trigger

類似したイベントの事前定義済みのグループに所属する Transact-SQLTransact-SQL イベントを実行した後に、DDL トリガーを起動できます。A DDL trigger can fire after execution of any Transact-SQLTransact-SQL event that belongs to a predefined grouping of similar events. たとえば、CREATE TABLE ステートメント、ALTER TABLE ステートメント、または DROP TABLE ステートメントのいずれかの実行後に DDL トリガーを発生させる場合、CREATE TRIGGER ステートメントで FOR DDL_TABLE_EVENTS を指定できます。For example, if you want a DDL trigger to fire after any CREATE TABLE, ALTER TABLE, or DROP TABLE statement is run, you can specify FOR DDL_TABLE_EVENTS in the CREATE TRIGGER statement. CREATE TRIGGER の実行後、イベント グループで対応されるイベントが sys.trigger_events カタログ ビューに追加されます。After CREATE TRIGGER is run, the events that are covered by an event group are added to the sys.trigger_events catalog view.

SQL Server 2005 (9.x)SQL Server 2005 (9.x)で、イベント グループに対してトリガーを作成した場合、 sys.trigger_events にはイベント グループについての情報が含まれず、 sys.trigger_events にはそのグループで対応される個々のイベントについての情報のみが含まれています。In SQL Server 2005 (9.x)SQL Server 2005 (9.x), if a trigger is created on an event group, sys.trigger_events does not include information about the event group, sys.trigger_events includes information only about the individual events covered by that group. SQL Server 2008SQL Server 2008 以降では、 sys.trigger_events が、トリガーが作成されたイベント グループに関するメタデータ、およびイベント グループが対応する個々のイベントに関するメタデータも保持します。In SQL Server 2008SQL Server 2008 and higher, sys.trigger_events persists metadata about the event group on which the triggers is created, and also about the individual events that the event group covers. したがって、 SQL Server 2008SQL Server 2008 以降のイベント グループで対応されたイベントに変更を加えても、 SQL Server 2005 (9.x)SQL Server 2005 (9.x)のイベント グループに対して作成される DDL トリガーには適用されません。Therefore, changes to the events that are covered by event groups in SQL Server 2008SQL Server 2008 and higher do not apply to DDL triggers that are created on those event groups in SQL Server 2005 (9.x)SQL Server 2005 (9.x).

DDL トリガーで使用できる事前定義済みの DDL ステートメントのグループ、そのグループが対応する特定のステートメント、およびこれらのイベント グループをプログラミングできるスコープの一覧については、「 DDL イベント グループ」を参照してください。For a list of the predefined groups of DDL statements that are available for DDL triggers, the particular statements the event groups cover, and the scopes at which these event groups can be programmed, see DDL Event Groups.

タスクTask トピックTopic
DDL トリガーを作成、変更、削除、または無効化する方法について説明します。Describes how to create, modify, delete or disable DDL triggers. DDL トリガーの実装Implement DDL Triggers
CLR DDL トリガーの作成方法について説明します。Describes how to create a CLR DDL trigger. CLR トリガーの作成Create CLR Triggers
DDL トリガーに関する情報を取得する方法について説明します。Describes how to return information about DDL triggers. DDL トリガーに関する情報の取得Get Information About DDL Triggers
DDL トリガーを起動するイベントの情報を、EVENTDATA 関数を使用して取得する方法について説明します。Describes how to return information about an event that fires a DDL trigger by using the EVENTDATA function. EVENTDATA 関数の使用Use the EVENTDATA Function
トリガーのセキュリティを管理する方法について説明します。Describes how to manage trigger security. トリガーのセキュリティの管理Manage Trigger Security

参照See Also

DML トリガー DML Triggers
ログオン トリガー Logon Triggers
CREATE TRIGGER (Transact-SQL)CREATE TRIGGER (Transact-SQL)