CREATE TRIGGER (Transact-SQL)CREATE TRIGGER (Transact-SQL)

適用対象: ○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

DML トリガー、DDL トリガー、またはログオン トリガーを作成します。Creates a DML, DDL, or logon trigger. トリガーとは、特別な種類のストアド プロシージャであり、データベース サーバーでイベントが発生したときに自動的に実行されます。A trigger is a special type of stored procedure that automatically runs when an event occurs in the database server. DML トリガーは、ユーザーがデータ操作言語 (DML) イベントを介してデータを変更しようとしたときに実行されます。DML triggers run when a user tries to modify data through a data manipulation language (DML) event. DML イベントは、テーブルやビューに対する INSERT、UPDATE、または DELETE ステートメントによって発生するイベントです。DML events are INSERT, UPDATE, or DELETE statements on a table or view. これらのトリガーは、テーブル行が影響を受けるかどうかにかかわらず、有効なイベントが発生したときに起動されます。These triggers fire when any valid event fires, whether table rows are affected or not. 詳しくは、「 DML Triggers」をご覧ください。For more information, see DML Triggers.

DDL トリガーは、さまざまなデータ定義言語 (DDL) イベントに対応して起動されます。DDL triggers run in response to a variety of data definition language (DDL) events. 本来、これらのイベントは、Transact-SQLTransact-SQL の CREATE、ALTER、DROP ステートメント、および DDL に類似した処理を実行するシステム ストアド プロシージャに対応するものです。These events primarily correspond to Transact-SQLTransact-SQL CREATE, ALTER, and DROP statements, and certain system stored procedures that perform DDL-like operations.

ログオン トリガーは、ユーザーのセッションの確立時に発生する LOGON イベントに応答して起動されます。Logon triggers fire in response to the LOGON event that's raised when a user's session is being established. トリガーは、Transact-SQLTransact-SQL ステートメントから直接作成することも、MicrosoftMicrosoft .NET Framework.NET Framework 共通言語ランタイム (CLR) 内に作成したアセンブリのメソッドから作成し、SQL ServerSQL Server のインスタンスにアップロードすることもできます。You can create triggers directly from Transact-SQLTransact-SQL statements or from methods of assemblies that are created in the MicrosoftMicrosoft .NET Framework.NET Framework common language runtime (CLR) and uploaded to an instance of SQL ServerSQL Server. SQL ServerSQL Server では、特定のステートメントに対して複数のトリガーを作成できます。lets you create multiple triggers for any specific statement.

重要

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

注意

この記事では、SQL Server への .NET Framework CLR の統合について説明します。The integration of .NET Framework CLR into SQL Server is discussed in this article. CLR 統合は、Azure SQL Database には適用されません。CLR integration does not apply to Azure SQL Database.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

-- SQL Server Syntax  
-- Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger)  
  
CREATE [ OR ALTER ] TRIGGER [ schema_name . ]trigger_name   
ON { table | view }   
[ WITH <dml_trigger_option> [ ,...n ] ]  
{ FOR | AFTER | INSTEAD OF }   
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }   
[ WITH APPEND ]  
[ NOT FOR REPLICATION ]   
AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME <method specifier [ ; ] > }  
  
<dml_trigger_option> ::=  
    [ ENCRYPTION ]  
    [ EXECUTE AS Clause ]  
  
<method_specifier> ::=  
    assembly_name.class_name.method_name  
  
-- SQL Server Syntax  
-- Trigger on an INSERT, UPDATE, or DELETE statement to a 
-- table (DML Trigger on memory-optimized tables)  
  
CREATE [ OR ALTER ] TRIGGER [ schema_name . ]trigger_name   
ON { table }   
[ WITH <dml_trigger_option> [ ,...n ] ]  
{ FOR | AFTER }   
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }   
AS { sql_statement  [ ; ] [ ,...n ] }  
  
<dml_trigger_option> ::=  
    [ NATIVE_COMPILATION ]  
    [ SCHEMABINDING ]  
    [ EXECUTE AS Clause ]  
  
-- Trigger on a CREATE, ALTER, DROP, GRANT, DENY, 
-- REVOKE or UPDATE statement (DDL Trigger)  
  
CREATE [ OR ALTER ] TRIGGER trigger_name   
ON { ALL SERVER | DATABASE }   
[ WITH <ddl_trigger_option> [ ,...n ] ]  
{ FOR | AFTER } { event_type | event_group } [ ,...n ]  
AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier >  [ ; ] }  
  
<ddl_trigger_option> ::=  
    [ ENCRYPTION ]  
    [ EXECUTE AS Clause ]  
  
-- Trigger on a LOGON event (Logon Trigger)  
  
CREATE [ OR ALTER ] TRIGGER trigger_name   
ON ALL SERVER   
[ WITH <logon_trigger_option> [ ,...n ] ]  
{ FOR| AFTER } LOGON    
AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier >  [ ; ] }  
  
<logon_trigger_option> ::=  
    [ ENCRYPTION ]  
    [ EXECUTE AS Clause ]  
  

構文Syntax

-- Azure SQL Database Syntax   
-- Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger)  
  
CREATE [ OR ALTER ] TRIGGER [ schema_name . ]trigger_name   
ON { table | view }   
 [ WITH <dml_trigger_option> [ ,...n ] ]   
{ FOR | AFTER | INSTEAD OF }   
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }   
  AS { sql_statement  [ ; ] [ ,...n ] [ ; ] > }  
  
<dml_trigger_option> ::=   
        [ EXECUTE AS Clause ]  
  
-- Azure SQL Database Syntax  
-- Trigger on a CREATE, ALTER, DROP, GRANT, DENY, 
-- REVOKE, or UPDATE STATISTICS statement (DDL Trigger)   
  
CREATE [ OR ALTER ] TRIGGER trigger_name   
ON { DATABASE }   
 [ WITH <ddl_trigger_option> [ ,...n ] ]   
{ FOR | AFTER } { event_type | event_group } [ ,...n ]   
AS { sql_statement  [ ; ] [ ,...n ]  [ ; ] }  
  
<ddl_trigger_option> ::=   
    [ EXECUTE AS Clause ]  

引数Arguments

OR ALTEROR ALTER
適用対象:Azure SQL DatabaseSQL DatabaseSQL ServerSQL Server (SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1 以降)。Applies to: Azure SQL DatabaseSQL Database, SQL ServerSQL Server (starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1).

トリガーが既に存在する場合にのみ、条件付きでビューを変更します。Conditionally alters the trigger only if it already exists.

schema_nameschema_name
DML トリガーが属しているスキーマの名前。The name of the schema to which a DML trigger belongs. DML トリガーのスコープは、そのトリガーが作成されたテーブルまたはビューのスキーマです。DML triggers are scoped to the schema of the table or view on which they're created. schema_name は DDL トリガーやログオン トリガーでは指定できません。schema_name can't be specified for DDL or logon triggers.

trigger_nametrigger_name
トリガーの名前。The name of the trigger. trigger_name は、識別子の規則に従う必要があります。ただし、trigger_name の先頭に # または ## を指定することはできません。A trigger_name must follow the rules for identifiers, except that trigger_name can't start with # or ##.

table | viewtable | view
DML トリガーが実行されるテーブルまたはビュー。The table or view on which the DML trigger runs. このテーブルまたはビューは、トリガー テーブルまたはトリガー ビューと呼ばれることがあります。This table or view is sometimes referred to as the trigger table or trigger view. テーブルまたはビューの完全修飾名の指定は省略可能です。Specifying the fully qualified name of the table or view is optional. ビューは、INSTEAD OF トリガーによってのみ参照できます。You can only reference a view by an INSTEAD OF trigger. DML トリガーは、ローカルまたはグローバルの一時テーブルに対しては定義できません。You can't define DML triggers on local or global temporary tables.

DATABASEDATABASE
DDL トリガーのスコープを現在のデータベースに適用します。Applies the scope of a DDL trigger to the current database. これを指定すると、現在のデータベースで event_type または event_group が発生するたびにトリガーが起動します。If specified, the trigger fires whenever event_type or event_group occurs in the current database.

ALL SERVERALL SERVER
適用対象: SQL Server 2008SQL Server 2008 から SQL Server 2017SQL Server 2017Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

DDL トリガーまたはログオン トリガーのスコープを現在のサーバーに適用します。Applies the scope of a DDL or logon trigger to the current server. これを指定すると、現在のサーバーの任意の場所で event_type または event_group が発生するたびにトリガーが起動します。If specified, the trigger fires whenever event_type or event_group occurs anywhere in the current server.

WITH ENCRYPTIONWITH ENCRYPTION
適用対象: SQL Server 2008SQL Server 2008 から SQL Server 2017SQL Server 2017Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

CREATE TRIGGER ステートメントのテキストをわかりにくくします。Obscures the text of the CREATE TRIGGER statement. WITH ENCRYPTION を使用すると、そのトリガーを SQL ServerSQL Server レプリケーションの一部としてパブリッシュできなくなります。Using WITH ENCRYPTION prevents the trigger from being published as part of SQL ServerSQL Server replication. WITH ENCRYPTION は、CLR トリガーに対しては指定できません。WITH ENCRYPTION can't be specified for CLR triggers.

EXECUTE ASEXECUTE AS
トリガーを実行するセキュリティ コンテキストを指定します。Specifies the security context under which the trigger is executed. これにより、トリガーが参照するデータベース オブジェクトの権限を検証するときに、SQL ServerSQL Server インスタンスが使用するユーザー アカウントを制御できます。Enables you to control which user account the instance of SQL ServerSQL Server uses to validate permissions on any database objects that are referenced by the trigger.

このオプションは、メモリ最適化テーブルのトリガーに必要です。This option is required for triggers on memory-optimized tables.

詳細については、「EXECUTE AS 句 (Transact-SQL)」を参照してください。For more information, seeEXECUTE AS Clause (Transact-SQL).

NATIVE_COMPILATIONNATIVE_COMPILATION
トリガーをネイティブでコンパイルすることを示します。Indicates that the trigger is natively compiled.

このオプションは、メモリ最適化テーブルのトリガーに必要です。This option is required for triggers on memory-optimized tables.

SCHEMABINDINGSCHEMABINDING
トリガーによって参照されているテーブルを削除または変更できないようにします。Ensures that tables referenced by a trigger can't be dropped or altered.

このオプションは、メモリ最適化テーブルのトリガーで必要であり、従来のテーブルのトリガーではサポートされていません。This option is required for triggers on memory-optimized tables and isn't supported for triggers on traditional tables.

FOR | AFTERFOR | AFTER
AFTER を指定した場合は、トリガー元の SQL ステートメントで指定したすべての処理が正常に開始された場合のみ、DML トリガーが起動されます。AFTER specifies that the DML trigger fires only when all operations specified in the triggering SQL statement have launched successfully. このトリガーの実行前に、すべての連鎖参照操作と制約チェックも成功している必要があります。All referential cascade actions and constraint checks must also succeed before this trigger fires.

指定したキーワードが FOR だけの場合は、AFTER が既定値になります。AFTER is the default when FOR is the only keyword specified.

ビューに AFTER トリガーを定義することはできません。You can't define AFTER triggers on views.

INSTEAD OFINSTEAD OF
トリガーをアクティブにする SQL ステートメントの "代わりに" DML トリガーを起動するように指定します。したがって、トリガーをアクティブにするステートメントの操作は無効になります。Specifies that the DML trigger launches instead of the triggering SQL statement, thus, overriding the actions of the triggering statements. DDL トリガーまたはログオン トリガーに INSTEAD OF を指定することはできません。You can't specify INSTEAD OF for DDL or logon triggers.

テーブルまたはビューに対する INSERT、UPDATE、または DELETE の各ステートメントに、INSTEAD OF トリガーを 1 つだけ定義できます。At most, you can define one INSTEAD OF trigger per INSERT, UPDATE, or DELETE statement on a table or view. ビューにビューを定義して、各ビューに独自の INSTEAD OF トリガーを定義することもできます。You can also define views on views where each view has its own INSTEAD OF trigger.

INSTEAD OF トリガーは、WITH CHECK OPTION を使用する更新可能なビューには定義できません。You can't define INSTEAD OF triggers on updatable views that use WITH CHECK OPTION. SQL ServerSQL Server これを行うと、WITH CHECK OPTION が指定されている更新可能なビューに INSTEAD OF トリガーを追加した場合にエラーが発生します。Doing so results in an error when an INSTEAD OF trigger is added to an updatable view WITH CHECK OPTION specified. INSTEAD OF トリガーを定義する前に、ALTER VIEW を使用してそのオプションを削除する必要があります。You remove that option by using ALTER VIEW before defining the INSTEAD OF trigger.

{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }
テーブルまたはビューに対して試行されたときに、DML トリガーをアクティブにするデータ変更ステートメントを指定します。Specifies the data modification statements that activate the DML trigger when it's tried against this table or view. 少なくとも 1 つのオプションを指定します。Specify at least one option. これらのオプションを任意の順序で組み合わせて、トリガー定義内で使用できます。Use any combination of these options in any order in the trigger definition.

INSTEAD OF トリガーでは、ON DELETE 連鎖操作を指定する参照関係があるテーブルで、DELETE オプションを使用することはできません。For INSTEAD OF triggers, you can't use the DELETE option on tables that have a referential relationship, specifying a cascade action ON DELETE. 同様に、ON UPDATE 連鎖操作を指定する参照関係があるテーブルで、UPDATE オプションを使用することはできません。Similarly, the UPDATE option isn't allowed on tables that have a referential relationship, specifying a cascade action ON UPDATE.

WITH APPENDWITH APPEND
適用対象: SQL Server 2008SQL Server 2008 から SQL Server 2008 R2SQL Server 2008 R2Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2008 R2SQL Server 2008 R2.

既存のトリガーに対して、新しいトリガーを追加します。Specifies that an additional trigger of an existing type should be added. WITH APPEND は、INSTEAD OF トリガーと共に使用することはできず、AFTER トリガーが明示的に指定されている場合も使用できません。WITH APPEND can't be used with INSTEAD OF triggers or if an AFTER trigger is explicitly stated. 旧バージョンとの互換性を保つために、WITH APPEND は、INSTEAD OF または AFTER の指定がなく、FOR が指定されている場合のみ使用してください。For backward compatibility, only use WITH APPEND when FOR is specified, without INSTEAD OF or AFTER. EXTERNAL NAME を使用している場合 (つまり、トリガーが CLR トリガーの場合)、WITH APPEND は指定できません。You can't specify WITH APPEND if using EXTERNAL NAME (that is, if the trigger is a CLR trigger).

event_typeevent_type
発生後に DDL トリガーが起動される Transact-SQLTransact-SQL 言語イベントの名前。The name of a Transact-SQLTransact-SQL language event that, after launch, causes a DDL trigger to fire. DDL トリガーで使用できるイベントの一覧については、「DDL イベント」を参照してください。Valid events for DDL triggers are listed in DDL Events.

event_groupevent_group
Transact-SQLTransact-SQL 言語イベントの定義済みグループの名前。The name of a predefined grouping of Transact-SQLTransact-SQL language events. DDL トリガーは、event_group に属する Transact-SQLTransact-SQL 言語イベントの発生後に起動します。The DDL trigger fires after launch of any Transact-SQLTransact-SQL language event that belongs to event_group. DDL トリガーで使用できるイベント グループの一覧については、「DDL イベント グループ」を参照してください。Valid event groups for DDL triggers are listed in DDL Event Groups.

event_group は、対応するイベントの種類を sys.trigger_events カタログ ビューに追加した場合、CREATE TRIGGER が終了した後でマクロとしても動作します。After the CREATE TRIGGER has finished running, event_group also acts as a macro by adding the event types it covers to the sys.trigger_events catalog view.

NOT FOR REPLICATIONNOT FOR REPLICATION
適用対象: SQL Server 2008SQL Server 2008 から SQL Server 2017SQL Server 2017Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

トリガーに関係するテーブルがレプリケーション エージェントによって変更される場合は、トリガーを実行しないことを示します。Indicates that the trigger shouldn't be run when a replication agent modifies the table that's involved in the trigger.

sql_statementsql_statement
トリガー条件とトリガー動作。The trigger conditions and actions. トリガー条件には、試行された DML イベント、DDL イベント、またはログオン イベントによってトリガー動作が実行されるかどうかを判定するための補足の条件を指定します。Trigger conditions specify additional criteria that determine whether the tried DML, DDL, or logon events cause the trigger actions to be run.

Transact-SQLTransact-SQL ステートメントで指定されたトリガー動作は、操作が試行されると有効になります。The trigger actions specified in the Transact-SQLTransact-SQL statements go into effect when the operation is tried.

トリガーには、いくつかの例外を除き、任意の数と種類の Transact-SQLTransact-SQL ステートメントを含めることができます。Triggers can include any number and type of Transact-SQLTransact-SQL statements, with exceptions. 詳細については、「解説」を参照してください。For more information, see Remarks. トリガーは、データ変更またはデータ定義ステートメントに基づいてデータをチェックまたは変更するものであり、ユーザーに値は返されません。A trigger is designed to check or change data based on a data modification or definition statement; it should't return data to the user. トリガー内の Transact-SQLTransact-SQL ステートメントには、フロー制御言語が主に使用されます。The Transact-SQLTransact-SQL statements in a trigger frequently include control-of-flow language.

DML トリガーでは、deleted および inserted 論理 (概念) テーブルが使用されます。DML triggers use the deleted and inserted logical (conceptual) tables. それらは、トリガーが定義されるテーブル、つまり、ユーザー操作の対象となるテーブルと構造的に類似しています。They're structurally similar to the table on which the trigger is defined, that is, the table on which the user action is tried. deleted および inserted テーブルには、ユーザー操作によって変更される行の古い値または新しい値が格納されます。The deleted and inserted tables hold the old values or new values of the rows that may be changed by the user action. たとえば、deleted テーブルのすべての値を取得するには、次のように指定します。For example, to retrieve all values in the deleted table, use:

SELECT * FROM deleted;  

詳しくは、「inserted テーブルと deleted テーブルの使用」をご覧ください。For more information, see Use the inserted and deleted Tables.

DDL トリガーおよびログオン トリガーでは、EVENTDATA (Transact-SQL) 関数を使用して、トリガー起動イベントに関する情報を取得できます。DDL and logon triggers capture information about the triggering event by using the EVENTDATA (Transact-SQL) function. 詳しくは、「EVENTDATA 関数の使用」をご覧ください。For more information, see Use the EVENTDATA Function.

SQL ServerSQL Server では、テーブルまたはビューに対する INSTEAD OF トリガーによって、textntext、または image 型の列を更新できます。allows the update of text, ntext, or image columns through the INSTEAD OF trigger on tables or views.

重要

ntexttext、および image データ型は、MicrosoftMicrosoft SQL ServerSQL Server の将来のバージョンで削除される予定です。ntext, text, and image data types will be removed in a future version of MicrosoftMicrosoftSQL ServerSQL Server. 新しい開発作業では、これらのデータ型の使用は避け、現在これらのデータ型を使用しているアプリケーションは修正するようにしてください。Avoid using these data types in new development work, and plan to modify applications that currently use them. 代わりに、 nvarchar(max)varchar(max)varbinary(max) を使用してください。Use nvarchar(max), varchar(max), and varbinary(max) instead. AFTER トリガーと INSTEAD OF トリガーでは両方とも、inserted テーブルおよび deleted テーブルで varchar(MAX)nvarchar(MAX) 、および varbinary(MAX) 型のデータがサポートされます。Both AFTER and INSTEAD OF triggers support varchar(MAX), nvarchar(MAX), and varbinary(MAX) data in the inserted and deleted tables.

メモリ最適化テーブルのトリガーの場合、最上位レベルで許可される唯一の sql_statement は ATOMIC ブロックです。For triggers on memory-optimized tables, the only sql_statement allowed at the top level is an ATOMIC block. ATOMIC ブロック内で使用できる T-SQL は、ネイティブ プロシージャ内で使用できる T-SQL によって制限されます。The T-SQL allowed inside the ATOMIC block is limited by the T-SQL allowed inside native procs.

< method_specifier > 適用対象: SQL Server 2008SQL Server 2008 から SQL Server 2017SQL Server 2017< method_specifier > Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

CLR トリガーに対して、トリガーにバインドするアセンブリのメソッドを指定します。For a CLR trigger, specifies the method of an assembly to bind with the trigger. このメソッドは引数を受け取らず、void を返す必要があります。The method must take no arguments and return void. class_name は有効な SQL ServerSQL Server 識別子であり、アセンブリ内にアセンブリで可視のクラスとして存在している必要があります。class_name must be a valid SQL ServerSQL Server identifier and must exist as a class in the assembly with assembly visibility. このクラスの名前が名前空間で修飾されており、名前空間の部分がピリオド (.) で分けられている場合は、このクラス名を角かっこ ([ ]) または引用符 (" ") で区切る必要があります。If the class has a namespace-qualified name that uses '.' to separate namespace parts, the class name must be delimited by using [ ] or " " delimiters. 入れ子になったクラスは使用できません。The class can't be a nested class.

注意

既定では、CLR コードを実行する SQL ServerSQL Server の機能はオフになっています。By default, the ability of SQL ServerSQL Server to run CLR code is off. マネージド コード モジュールを参照するデータベース オブジェクトを作成、変更、削除することはできますが、sp_configure によって clr enabled オプションが有効になっていない場合、これらの参照は SQL ServerSQL Server のインスタンスでは実行されません。You can create, modify, and drop database objects that reference managed code modules, but these references don't run in an instance of SQL ServerSQL Server unless the clr enabled Option is enabled by using sp_configure.

DML トリガーの解説Remarks for DML Triggers

DML トリガーは主に、ビジネス ルールとデータの整合性を設定するために使用します。DML triggers are frequently used for enforcing business rules and data integrity. SQL ServerSQL Server では、ALTER TABLE と CREATE TABLE ステートメントで宣言参照整合性 (DRI) を使用できます。provides declarative referential integrity (DRI) through the ALTER TABLE and CREATE TABLE statements. ただし、DRI ではデータベース間の参照整合性は提供されません。However, DRI doesn't provide cross-database referential integrity. 参照整合性とは、テーブルの主キーと外部キー間の関係についての規則です。Referential integrity refers to the rules about the relationships between the primary and foreign keys of tables. 参照整合性を設定するには、ALTER TABLE と CREATE TABLE で、PRIMARY KEY と FOREIGN KEY 制約を使用します。To enforce referential integrity, use the PRIMARY KEY and FOREIGN KEY constraints in ALTER TABLE and CREATE TABLE. トリガー テーブルに制約が存在する場合、これらは INSTEAD OF トリガーが実行された後、AFTER トリガーが実行される前にチェックされます。If constraints exist on the trigger table, they're checked after the INSTEAD OF trigger runs and before the AFTER trigger runs. 制約違反の場合は、INSTEAD OF トリガーの動作がロールバックされ、AFTER トリガーは起動されません。If the constraints are violated, the INSTEAD OF trigger actions are rolled back and the AFTER trigger isn't fired.

テーブルで実行される最初と最後の AFTER トリガーを、sp_settriggerorder を使用して指定できます。You can specify the first and last AFTER triggers to be run on a table by using sp_settriggerorder. 1 つのテーブルで、INSERT、UPDATE、DELETE の各操作に対して、最初の AFTER トリガーと最後の AFTER トリガーをそれぞれ 1 つだけ指定できます。You can specify only one first and one last AFTER trigger for each INSERT, UPDATE, and DELETE operation on a table. 同じテーブルにそれ以外の AFTER トリガーが存在する場合、それらはランダムに実行されます。If there are other AFTER triggers on the same table, they're randomly run.

ALTER TRIGGER ステートメントを使って最初と最後のトリガーを変更し、変更したトリガーに設定されていた最初と最後を示す属性を削除した場合は、sp_settriggerorder を使用して順序の値を再設定する必要があります。If an ALTER TRIGGER statement changes a first or last trigger, the first or last attribute set on the modified trigger is dropped, and you must reset the order value by using sp_settriggerorder.

AFTER トリガーは、そのトリガーを起動する SQL ステートメントが正常に実行された後にのみ実行されます。An AFTER trigger is run only after the triggering SQL statement has run successfully. このステートメントの実行には、更新または削除されるオブジェクトに関連付けられている連鎖的なすべての参照操作と制約チェックの実行も含まれます。This successful execution includes all referential cascade actions and constraint checks associated with the object updated or deleted. AFTER トリガーは、同じテーブルの INSTEAD OF トリガーを再帰的に起動することはありません。An AFTER does not recursively fire an INSTEAD OF trigger on the same table.

テーブルに定義された INSTEAD OF トリガーによって、通常は INSTEAD OF トリガーを起動するステートメントがそのテーブルで再度実行される場合、トリガーの再帰呼び出しは行われません。If an INSTEAD OF trigger defined on a table runs a statement against the table that would ordinarily fire the INSTEAD OF trigger again, the trigger isn't called recursively. 代わりに、そのステートメントでは、テーブルに INSTEAD OF トリガーが存在しないものとして処理が行われ、制約操作と AFTER トリガーの実行が連鎖的に開始されます。Instead, the statement processes as if the table had no INSTEAD OF trigger and starts the chain of constraint operations and AFTER trigger executions. たとえば、トリガーがテーブルの INSTEAD OF INSERT トリガーとして定義されているとします。For example, if a trigger is defined as an INSTEAD OF INSERT trigger for a table. さらに、そのトリガーが、同じテーブルに対して INSERT ステートメントを実行する場合、INSTEAD OF トリガーによって開始される INSERT ステートメントでは、トリガーの再度の呼び出しは行われません。And, the trigger runs an INSERT statement on the same table, the INSERT statement launched by the INSTEAD OF trigger doesn't call the trigger again. トリガーによって開始される INSERT では、制約動作の実行処理とテーブルに定義されている AFTER INSERT トリガーの起動処理が開始されます。The INSERT launched by the trigger starts the process of running constraint actions and firing any AFTER INSERT triggers defined for the table.

ビューに定義された INSTEAD OF トリガーによって、通常 INSTEAD OF トリガーを起動するステートメントがそのビューに対して再び実行される場合、そのトリガーの再帰呼び出しは行われません。When an INSTEAD OF trigger defined on a view runs a statement against the view that would ordinarily fire the INSTEAD OF trigger again, it's not called recursively. 代わりに、そのステートメントは、そのビューの基になるベース テーブルに対する変更として解決されます。Instead, the statement is resolved as modifications against the base tables underlying the view. この場合、ビューの定義では、更新可能なビューの制限をすべて満たしている必要があります。In this case, the view definition must meet all the restrictions for an updatable view. 更新可能なビューの定義については、「ビューを使用したデータ変更」をご覧ください。For a definition of updatable views, see Modify Data Through a View.

たとえば、トリガーがビューの INSTEAD OF UPDATE トリガーとして定義されているとします。For example, if a trigger is defined as an INSTEAD OF UPDATE trigger for a view. さらに、そのトリガーが同じビューを参照する UPDATE ステートメントを実行する場合、INSTEAD OF トリガーによって開始される UPDATE ステートメントでは、トリガーの再度の呼び出しは行われません。And, the trigger runs an UPDATE statement referencing the same view, the UPDATE statement launched by the INSTEAD OF trigger doesn't call the trigger again. トリガーによって開始される UPDATE ステートメントは、ビューに INSTEAD OF トリガーが存在しないものとして処理が行われます。The UPDATE launched by the trigger is processed against the view as if the view didn't have an INSTEAD OF trigger. この UPDATE によって変更された列は、単一のベース テーブルに対して解決される必要があります。The columns changed by the UPDATE must be resolved to a single base table. 基になるベース テーブルを変更するたびに、制約の適用とそのテーブルに定義された AFTER トリガーの起動が連鎖的に開始されます。Each modification to an underlying base table starts the chain of applying constraints and firing AFTER triggers defined for the table.

特定の列に対する UPDATE または INSERT 操作のテストTesting for UPDATE or INSERT Actions to Specific Columns

Transact-SQLTransact-SQL トリガーは、特定の列に対する UPDATE または INSERT による変更に基づいて特定の操作を実行するように設定できます。You can design a Transact-SQLTransact-SQL trigger to do certain actions based on UPDATE or INSERT modifications to specific columns. これを行うには、トリガー内で UPDATE() または COLUMNS_UPDATED を使用します。Use UPDATE() or COLUMNS_UPDATED in the body of the trigger for this purpose. UPDATE() では、1 つの列に対する UPDATE または INSERT の試行がテストされます。UPDATE() tests for UPDATE or INSERT attempts on one column. COLUMNS_UPDATED では、複数の列に対して実行される UPDATE または INSERT 操作がテストされます。COLUMNS_UPDATED tests for UPDATE or INSERT actions that run on multiple columns. この関数は、挿入または更新された列を示すビット パターンを返します。This function returns a bit pattern that indicates which columns were inserted or updated.

トリガーの制限Trigger Limitations

CREATE TRIGGER はバッチ内の最初のステートメントとして使用する必要があり、1 つのテーブルにのみ適用されます。CREATE TRIGGER must be the first statement in the batch and can apply to only one table.

トリガーは現在のデータベース内でしか作成できませんが、他のデータベース内のオブジェクトを参照することができます。A trigger is created only in the current database; however, a trigger can reference objects outside the current database.

トリガーを修飾するトリガー スキーマ名を指定する場合は、テーブル名を同じ方法で修飾します。If the trigger schema name is specified to qualify the trigger, qualify the table name in the same way.

1 つのトリガー動作を、同じ CREATE TRIGGER ステートメント内の複数のユーザー操作 (たとえば、INSERT と UPDATE) に対して定義できます。The same trigger action can be defined for more than one user action (for example, INSERT and UPDATE) in the same CREATE TRIGGER statement.

INSTEAD OF DELETE/UPDATE トリガーは、外部キーがあり、DELETE/UPDATE 操作に対する連鎖操作が定義されているテーブルには定義できません。INSTEAD OF DELETE/UPDATE triggers can't be defined on a table that has a foreign key with a cascade on DELETE/UPDATE action defined.

トリガーの内部では任意の SET ステートメントを指定できます。Any SET statement can be specified inside a trigger. 選択した SET オプションは、トリガーの実行中有効で、終了後は元の設定に戻ります。The SET option selected remains in effect during the execution of the trigger and then reverts to its former setting.

トリガーが起動すると、ストアド プロシージャの場合と同様に、呼び出し側アプリケーションに結果が返されます。When a trigger fires, results are returned to the calling application, just like with stored procedures. トリガーを実行しても結果がアプリケーションに返されないようにするには、結果を返す SELECT ステートメントや変数を割り当てるステートメントをトリガーから除外します。To prevent results being returned to an application because of a trigger firing, don't include either SELECT statements that return results or statements that carry out variable assignment in a trigger. ユーザーに結果を返す SELECT ステートメントまたは変数の割り当てを行うステートメントを含むトリガーでは、特別な処理が必要です。A trigger that includes either SELECT statements that return results to the user or statements that do variable assignment, requires special handling. 返された結果を、トリガー テーブルの変更が許可されているすべてのアプリケーションに書き込む必要があります。You'd have to write the returned results into every application in which modifications to the trigger table are allowed. トリガー内で変数を割り当てる必要がある場合は、トリガーの先頭で SET NOCOUNT ステートメントを使用して、結果セットが返されないようにします。If variable assignment must occur in a trigger, use a SET NOCOUNT statement at the start of the trigger to prevent the return of any result sets.

TRUNCATE TABLE ステートメントは実質的には DELETE ステートメントですが、個別の行の削除がログに記録されないため、トリガーがアクティブになることはありません。Although a TRUNCATE TABLE statement is in effect a DELETE statement, it doesn't activate a trigger because the operation doesn't log individual row deletions. ただし、TRUNCATE TABLE ステートメントを実行する権限のあるユーザー以外は、このように DELETE トリガーが回避されてしまうことに注意を払う必要はありません。However, only those users with permissions to run a TRUNCATE TABLE statement need be concerned about inadvertently circumventing a DELETE trigger this way.

ログに記録されるかどうかにかかわらず、WRITETEXT ステートメントによってトリガーがアクティブになることはありません。The WRITETEXT statement, whether logged or unlogged, doesn't activate a trigger.

次の Transact-SQLTransact-SQL ステートメントは DML トリガーでは許可されません。The following Transact-SQLTransact-SQL statements aren't allowed in a DML trigger:

ALTER DATABASEALTER DATABASE CREATE DATABASECREATE DATABASE DROP DATABASEDROP DATABASE
RESTORE DATABASERESTORE DATABASE RESTORE LOGRESTORE LOG RECONFIGURERECONFIGURE

また、次の Transact-SQLTransact-SQL ステートメントは、トリガーによって起動される操作の対象となるテーブルまたはビューに対して使用する場合は、DML トリガー内では使用できません。Additionally, the following Transact-SQLTransact-SQL statements aren't allowed inside the body of a DML trigger when it's used against the table or view that's the target of the triggering action.

CREATE INDEX (CREATE SPATIAL INDEX および CREATE XML INDEX を含む)CREATE INDEX (including CREATE SPATIAL INDEX and CREATE XML INDEX) ALTER INDEXALTER INDEX DROP INDEXDROP INDEX
DBCC DBREINDEXDBCC DBREINDEX ALTER PARTITION FUNCTIONALTER PARTITION FUNCTION DROP TABLEDROP TABLE
ALTER TABLE (次の操作で使用する場合)ALTER TABLE when used to do the following:

列の追加、変更、または削除Add, modify, or drop columns.

パーティションの切り替えSwitch partitions.

PRIMARY KEY 制約や UNIQUE 制約の追加または削除Add or drop PRIMARY KEY or UNIQUE constraints.

注意

SQL ServerSQL Server ではシステム テーブルに対するユーザー定義トリガーがサポートされないため、システム テーブルに対してはユーザー定義トリガーを作成しないことをお勧めします。Because SQL ServerSQL Server does not support user-defined triggers on system tables, we recommend that you do not create user-defined triggers on system tables.

DML トリガーの最適化Optimizing DML Triggers

トリガーは、トランザクションで (黙示的に、またはそれ以外の方法で) 機能し、開いている間はリソースをロックします。Triggers work in transactions (implied or otherwise) and while they're open, they lock resources. ロックは、トランザクションが (COMMIT で) 確認されるか、(ROLLBACK で) 拒否されるまで、そのままの状態を維持します。The lock remains in place until the transaction is confirmed (with COMMIT) or rejected (with a ROLLBACK). トリガーの実行時間が長くなるほど、別のプロセスがブロックされる可能性が高くなります。The longer a trigger runs, the higher the probability that another process is then blocked. そのため、トリガーは、可能な限り継続時間が短くなるように記述します。So, write triggers to lessen their duration whenever possible. 短い継続時間を実現するための 1 つの方法は、DML ステートメントによって変更される行が 0 行のときに、トリガーを解放することです。One way to achieve shorter duration is to release a trigger when a DML statement changes zero rows.

どの行も変更しないコマンドでトリガーを解放するには、システム変数 ROWCOUNT_BIG を使用します。To release the trigger for a command that doesn't change any rows, employ the system variable ROWCOUNT_BIG.

次の T-SQL コード スニペットは、行を変更しないコマンドでトリガーを解放する方法を示しています。The following T-SQL code snippet shows how to release the trigger for a command that doesn't change any rows. このコードは、各 DML トリガーの先頭に存在する必要があります。This code should be present at the beginning of each DML trigger:

IF (ROWCOUNT_BIG() = 0)
RETURN;

DDL トリガーの解説Remarks for DDL Triggers

DDL トリガーでは、標準のトリガーと同様、イベントに応答してストアド プロシージャが開始されます。DDL triggers, like standard triggers, launch stored procedures in response to an event. ただし、標準のトリガーとは異なり、テーブルまたはビューの UPDATE、INSERT、または DELETE ステートメントに応答して実行されることはありません。But, unlike standard triggers, they don't run in response to UPDATE, INSERT, or DELETE statements on a table or view. 代わりに、それらは、主にデータ定義言語 (DDL) ステートメントに応答して実行されます。Instead, they primarily run in response to data definition language (DDL) statements. このステートメントの種類には、CREATE、ALTER、DROP、GRANT、DENY、REVOKE、UPDATE STATISTICS ステートメントなどがあります。The statement types include CREATE, ALTER, DROP, GRANT, DENY, REVOKE, and UPDATE STATISTICS. DDL と同様の操作を実行する特定のシステム ストアド プロシージャも DDL トリガーを起動できます。Certain system stored procedures that carry out DDL-like operations can also fire DDL triggers.

重要

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

DDL トリガーの詳細については、「DDL トリガー」を参照してください。For more information about DDL triggers, see DDL Triggers.

DDL トリガーは、ローカルまたはグローバルの一時テーブルおよびストアド プロシージャに影響するイベントに応答して起動されることはありません。DDL triggers don't fire in response to events that affect local or global temporary tables and stored procedures.

DML トリガーと異なり、DDL トリガーのスコープはスキーマではありません。Unlike DML triggers, DDL triggers aren't scoped to schemas. このため、DDL トリガーに関するメタデータのクエリに、OBJECT_ID、OBJECT_NAME、OBJECTPROPERTY、OBJECTPROPERTYEX などの関数を使用することはできません。So, you can't use functions such as OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY, and OBJECTPROPERTYEX for querying metadata about DDL triggers. 代わりに、カタログ ビューを使用してください。Use the catalog views instead. 詳しくは、「DDL トリガーに関する情報の取得」をご覧ください。For more information, see Get Information About DDL Triggers.

注意

サーバー スコープの DDL トリガーは、SQL Server Management StudioSQL Server Management Studio オブジェクト エクスプローラーの [トリガー] フォルダーに表示されます。Server-scoped DDL triggers appear in the SQL Server Management StudioSQL 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.

ログオン トリガーLogon Triggers

ログオン トリガーは、LOGON イベントに応答してストアド プロシージャを実行します。Logon triggers carry out stored procedures in response to a LOGON event. このイベントは、SQL ServerSQL Server インスタンスでユーザー セッションが確立されるときに発生します。This event happens when a user session is established with an instance of SQL ServerSQL Server. ログオン トリガーは、ログインの認証段階が終了した後、ユーザー セッションが確立される前に発生します。Logon triggers fire after the authentication phase of logging in finishes, but before the user session is established. したがって、通常は、エラー メッセージや PRINT ステートメントからのメッセージはユーザーに表示されますが、このトリガー内で発生したすべてのメッセージは SQL ServerSQL Server のエラー ログに記録されます。So, all messages originating inside the trigger that would typically reach the user, such as error messages and messages from the PRINT statement, are diverted to the SQL ServerSQL Server error log. 詳細については、「ログオン トリガー」を参照してください。For more information, see Logon Triggers.

認証に失敗した場合、ログオン トリガーは起動しません。Logon triggers don't fire if authentication fails.

ログオン トリガーでは、分散トランザクションはサポートされていません。Distributed transactions aren't supported in a logon trigger. 分散トランザクションを含むログオン トリガーが起動されると、エラー 3969 が返ります。Error 3969 returns when a logon trigger that contains a distributed transaction fire.

ログオン トリガーを無効にするDisabling a Logon Trigger

ログオン トリガーを使用すると、 データベース エンジンDatabase Engine sysadmin 固定サーバー ロールのメンバーを含むすべてのユーザーの への接続を効率的に禁止できます。A logon trigger can effectively prevent successful connections to the データベース エンジンDatabase Engine for all users, including members of the sysadmin fixed server role. ログオン トリガーによって接続が禁止されているときでも、 sysadmin 固定サーバー ロールのメンバーは、専用管理者接続を使用するか、または データベース エンジンDatabase Engine を最小構成モード (-f) で起動することにより、接続できます。When a logon trigger is preventing connections, members of the sysadmin fixed server role can connect by using the dedicated administrator connection, or by starting the データベース エンジンDatabase Engine in minimal configuration mode (-f). 詳細については、「 データベース エンジン サービスのスタートアップ オプション」を参照してください。For more information, see Database Engine Service Startup Options.

トリガーについての留意事項General Trigger Considerations

結果の返送Returning Results

今後のバージョンの SQL Server では、トリガーを使用して結果を返す機能が削除される予定です。The ability to return results from triggers will be removed in a future version of SQL Server. 結果セットを返すトリガーは、それを処理するように設計されていないアプリケーションでは予期しない動作を起こすことがあります。Triggers that return result sets may cause unexpected behavior in applications that aren't designed to work with them. 新しい開発作業では、トリガーを使用して結果セットを返すことを避け、現在この方法を使用しているアプリケーションについては変更を検討してください。Avoid returning result sets from triggers in new development work, and plan to modify applications that currently do. トリガーが結果セットを返さないようにするには、disallow results from triggers オプションを 1 に設定します。To prevent triggers from returning result sets, set the disallow results from triggers option to 1.

ログオン トリガーでは、結果セットを返すことは常に禁止されているため、この動作は構成できません。Logon triggers always disallow the return of results sets and this behavior isn't configurable. ログオン トリガーで結果セットが生成されると、トリガーは起動に失敗し、トリガーを起動したログインの試行は拒否されます。If a logon trigger generates a result set, the trigger fails to launch and the login attempt that fired the trigger is denied.

複数のトリガーMultiple Triggers

SQL ServerSQL Server では、各 DML イベント、DDL イベント、または LOGON イベントに対して複数のトリガーを作成できます。lets you create multiple triggers for each DML, DDL, or LOGON event. たとえば、既に UPDATE トリガーが作成されているテーブルに対して CREATE TRIGGER FOR UPDATE を実行すると、追加の更新トリガーが作成されます。For example, if CREATE TRIGGER FOR UPDATE is run for a table that already has an UPDATE trigger, an additional update trigger is created. 以前のバージョンの SQL ServerSQL Server では、各テーブルにおいて、INSERT、UPDATE、DELETE の各データ修正イベントに許可されるトリガーは 1 つだけでした。In earlier versions of SQL ServerSQL Server, only one trigger for each INSERT, UPDATE, or DELETE data modification event is allowed for each table.

再帰トリガーRecursive Triggers

SQL ServerSQL Server では、ALTER DATABASE によって RECURSIVE_TRIGGERS 設定が有効になっている場合、トリガーの再帰呼び出しもサポートされます。also supports recursive invocation of triggers when the RECURSIVE_TRIGGERS setting is enabled using ALTER DATABASE.

再帰トリガーでは、次の種類の再帰呼び出しが有効になります。Recursive triggers enable the following types of recursion to occur:

  • 間接再帰Indirect recursion

    間接再帰では、アプリケーションでテーブル T1 が更新されると、With indirect recursion, an application updates table T1. この操作によってトリガー TR1 が起動し、テーブル T2 が更新されます。This fires trigger TR1, updating table T2. 次にトリガー T2 が起動し、テーブル T1 が更新されます。Trigger T2 then fires and updates table T1.

  • 直接再帰Direct recursion

    直接再帰では、アプリケーションによってテーブル T1 が更新されます。In direct recursion, the application updates table T1. この操作によってトリガー TR1 が起動し、テーブル T1 が更新されます。This fires trigger TR1, updating table T1. テーブル T1 が更新されると、トリガー TR1 が再び起動するという動作が続きます。Because table T1 was updated, trigger TR1 fires again, and so on.

次の例では、間接トリガー再帰と直接トリガー再帰の両方を使用します。ここでは、テーブル T1 で 2 つの更新トリガー TR1 と TR2 が定義されているとします。The following example uses both indirect and direct trigger recursion Assume that two update triggers, TR1 and TR2, are defined on table T1. トリガー TR1 によって、テーブル T1 が再帰的に更新されます。Trigger TR1 updates table T1 recursively. UPDATE ステートメントでは、TR1 と TR2 が 1 回ずつ実行されます。An UPDATE statement runs each TR1 and TR2 one time. さらに、TR1 が起動すると、TR1 (再帰的) と TR2 の実行が開始されます。Additionally, the launch of TR1 triggers the execution of TR1 (recursively) and TR2. トリガーの inserted テーブルと deleted テーブルには、そのトリガーを呼び出した UPDATE ステートメントのみに対応する行が格納されています。The inserted and deleted tables for a specific trigger contain rows that correspond only to the UPDATE statement that invoked the trigger.

注意

この動作は、ALTER DATABASE によって RECURSIVE_TRIGGERS 設定が有効になっている場合にのみ実行されます。The previous behavior occurs only if the RECURSIVE_TRIGGERS setting is enabled by using ALTER DATABASE. あるイベントに対して定義されている複数のトリガーの実行順序は定義されていません。There's no defined order in which multiple triggers defined for a specific event are run. 個々のトリガーは自己完結している必要があります。Each trigger should be self-contained.

RECURSIVE_TRIGGERS の設定を無効にすると、直接再帰のみが無効になります。Disabling the RECURSIVE_TRIGGERS setting only prevents direct recursions. 間接再帰呼び出しを無効にするには、sp_configure を使用して、サーバー オプション nested triggers を 0 に設定します。To disable indirect recursion also, set the nested triggers server option to 0 by using sp_configure.

いずれかのトリガーで ROLLBACK TRANSACTION が実行されると、入れ子のレベルにかかわらず、それ以降のトリガーは実行されません。If any one of the triggers carries out a ROLLBACK TRANSACTION, regardless of the nesting level, no more triggers are run.

入れ子になったトリガーNested Triggers

トリガーは、最大 32 レベルの入れ子にすることができます。You can nest triggers to a maximum of 32 levels. トリガーによって別のトリガーが存在するテーブルが変更された場合、2 番目のトリガーがアクティブになり、3 番目のトリガーを呼び出すことができ、以下同様になります。If a trigger changes a table on which there's another trigger, the second trigger activates and can then call a third trigger, and so on. この連鎖的なトリガーで無限ループが発生すると、入れ子レベルを超過した時点でトリガーは取り消されます。If any trigger in the chain sets off an infinite loop, the nesting level is exceeded and the trigger is canceled. Transact-SQLTransact-SQL トリガーで、CLR ルーチン、データ型、または集計を参照することによってマネージド コードが開始された場合、この参照は 32 レベルの入れ子制限の 1 レベルとしてカウントされます。When a Transact-SQLTransact-SQL trigger launches managed code by referencing a CLR routine, type, or aggregate, this reference counts as one level against the 32-level nesting limit. マネージド コード内から呼び出されたメソッドは、この制限としてはカウントされません。Methods invoked from within managed code don't count against this limit.

入れ子にされたトリガーを無効にするには、sp_configure の nested triggers オプションを 0 (オフ) に設定します。To disable nested triggers, set the nested triggers option of sp_configure to 0 (off). 既定の構成では、入れ子になったトリガーがサポートされます。The default configuration supports nested triggers. 入れ子になったトリガーがオフの場合、ALTER DATABASE によって RECURSIVE_TRIGGERS がどのように設定されていても、再帰トリガーは無効になります。If nested triggers are off, recursive triggers are also disabled, despite the RECURSIVE_TRIGGERS setting that's set by using ALTER DATABASE.

INSTEAD OF トリガー内で入れ子になっている最初の AFTER トリガーは、nested triggers サーバー構成オプションが 0 でも起動されます。The first AFTER trigger nested inside an INSTEAD OF trigger fires even if the nested triggers server configuration option is 0. ただし、この設定では、後の AFTER トリガーは起動されません。But, under this setting, the later AFTER triggers don't fire. アプリケーションの入れ子になっているトリガーを見直して、nested triggers サーバー構成オプションが 0 に設定されている場合に、アプリケーションがビジネス ルールに従っているかどうかを判断します。Review your applications for nested triggers to determine if the applications follow your business rules when the nested triggers server configuration option is set to 0. 該当しない場合は、適切な変更を行います。If not, make the appropriate modifications.

名前の遅延解決Deferred Name Resolution

SQL ServerSQL Server では、Transact-SQLTransact-SQL のストアド プロシージャ、トリガー、およびバッチで、コンパイル時に存在しないテーブルを参照できます。allows for Transact-SQLTransact-SQL stored procedures, triggers, and batches to refer to tables that don't exist at compile time. この機能を名前の遅延解決といいます。This ability is called deferred name resolution.

アクセス許可Permissions

DML トリガーを作成するには、トリガーを作成するテーブルまたはビューに対する ALTER 権限が必要です。To create a DML trigger, it requires ALTER permission on the table or view on which the trigger is being created.

サーバー スコープ (ON ALL SERVER) の DDL トリガー、またはログオン トリガーを作成するには、サーバーに対する CONTROL SERVER 権限が必要です。To create a DDL trigger with server scope (ON ALL SERVER) or a logon trigger, requires CONTROL SERVER permission on the server. データベース スコープ (ON DATABASE) の DDL トリガーを作成するには、現在のデータベースに対する ALTER ANY DATABASE DDL TRIGGER 権限が必要です。To create a DDL trigger with database scope (ON DATABASE), requires ALTER ANY DATABASE DDL TRIGGER permission in the current database.

使用例Examples

A.A. DML トリガーを事前通知と組み合わせて使用するUsing a DML trigger with a reminder message

次の DML トリガーは、AdventureWorks2012AdventureWorks2012 データベース内の Customer テーブルでデータの追加または変更が試行されたときに、クライアントに対してメッセージを表示します。The following DML trigger prints a message to the client when anyone tries to add or change data in the Customer table in the AdventureWorks2012AdventureWorks2012 database.

CREATE TRIGGER reminder1  
ON Sales.Customer  
AFTER INSERT, UPDATE   
AS RAISERROR ('Notify Customer Relations', 16, 10);  
GO  

B.B. DML トリガーを電子メール メッセージと組み合わせて使用するUsing a DML trigger with a reminder e-mail message

次の例は、MaryM テーブルが変更されたときに、指定したユーザー (Customer) に電子メールを送信します。The following example sends an e-mail message to a specified person (MaryM) when the Customer table changes.

CREATE TRIGGER reminder2  
ON Sales.Customer  
AFTER INSERT, UPDATE, DELETE   
AS  
   EXEC msdb.dbo.sp_send_dbmail  
        @profile_name = 'AdventureWorks2012 Administrator',  
        @recipients = 'danw@Adventure-Works.com',  
        @body = 'Don''t forget to print a report for the sales force.',  
        @subject = 'Reminder';  
GO  

C.C. DML AFTER トリガーを使用して、PurchaseOrderHeader テーブルと Vendor テーブルの間にビジネス ルールを設定するUsing a DML AFTER trigger to enforce a business rule between the PurchaseOrderHeader and Vendor tables

CHECK 制約で参照できるのは、列レベルまたはテーブル レベルの制約が定義されている列のみであるため、テーブル間にまたがる制約 (ここでは、ビジネス ルール) はすべてトリガーとして定義する必要があります。Because CHECK constraints reference only the columns on which the column-level or table-level constraint is defined, you must define any cross-table constraints (in this case, business rules) as triggers.

次の例は、DML トリガーを AdventureWorks2012 データベースに作成します。The following example creates a DML trigger in the AdventureWorks2012 database. このトリガーでは、PurchaseOrderHeader テーブルに新しい発注を挿入しようとしたときに、ベンダーの信用格付けが良好であるかどうか (5 ではない) がチェックされます。This trigger checks to make sure the credit rating for the vendor is good (not 5) when there's an attempt to insert a new purchase order into the PurchaseOrderHeader table. ベンダーの信用格付けを取得するには、Vendor テーブルを参照する必要があります。To get the credit rating of the vendor, the Vendor table must be referenced. 信用格付けが低い場合は、メッセージが表示され、挿入は発生されません。If the credit rating is too low, a message appears and the insertion doesn't happen.

-- This trigger prevents a row from being inserted in the Purchasing.PurchaseOrderHeader 
-- table when the credit rating of the specified vendor is set to 5 (below average).  
  
CREATE TRIGGER Purchasing.LowCredit ON Purchasing.PurchaseOrderHeader  
AFTER INSERT  
AS  
IF (ROWCOUNT_BIG() = 0)
RETURN;
IF EXISTS (SELECT *  
           FROM Purchasing.PurchaseOrderHeader AS p   
           JOIN inserted AS i   
           ON p.PurchaseOrderID = i.PurchaseOrderID   
           JOIN Purchasing.Vendor AS v   
           ON v.BusinessEntityID = p.VendorID  
           WHERE v.CreditRating = 5  
          )  
BEGIN  
RAISERROR ('A vendor''s credit rating is too low to accept new  
purchase orders.', 16, 1);  
ROLLBACK TRANSACTION;  
RETURN   
END;  
GO  
  
-- This statement attempts to insert a row into the PurchaseOrderHeader table  
-- for a vendor that has a below average credit rating.  
-- The AFTER INSERT trigger is fired and the INSERT transaction is rolled back.  
  
INSERT INTO Purchasing.PurchaseOrderHeader (RevisionNumber, Status, EmployeeID,  
VendorID, ShipMethodID, OrderDate, ShipDate, SubTotal, TaxAmt, Freight)  
VALUES (  
2  
,3  
,261  
,1652  
,4  
,GETDATE()  
,GETDATE()  
,44594.55  
,3567.564  
,1114.8638 );  
GO  
  

D.D. データベース スコープの DDL トリガーを使用するUsing a database-scoped DDL trigger

次の例では、DDL トリガーを使用して、データベースのシノニムが削除されないようにします。The following example uses a DDL trigger to prevent any synonym in a database from being dropped.

CREATE TRIGGER safety   
ON DATABASE   
FOR DROP_SYNONYM  
AS   
IF (@@ROWCOUNT = 0)
RETURN;
   RAISERROR ('You must disable Trigger "safety" to drop synonyms!',10, 1)  
   ROLLBACK  
GO  
DROP TRIGGER safety  
ON DATABASE;  
GO  

E.E. サーバー スコープの DDL トリガーを使用するUsing a server-scoped DDL trigger

次の例では、DDL トリガーを使用して、現在のサーバー インスタンスで CREATE DATABASE イベントが発生したときにメッセージを表示し、EVENTDATA 関数を使用して、対応する Transact-SQLTransact-SQL ステートメントのテキストを取得します。The following example uses a DDL trigger to print a message if any CREATE DATABASE event occurs on the current server instance, and uses the EVENTDATA function to retrieve the text of the corresponding Transact-SQLTransact-SQL statement. DDL トリガーで EVENTDATA を使用するその他の例については、「EVENTDATA 関数の使用」を参照してください。For more examples that use EVENTDATA in DDL triggers, see Use the EVENTDATA Function.

適用対象: SQL Server 2008SQL Server 2008 から SQL Server 2017SQL Server 2017Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

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  

F.F. ログオン トリガーを使用するUsing a logon trigger

次のログオン トリガーの例では、login_test ログインで既に 3 つのユーザー セッションが実行されている場合に、そのログインのメンバーとして SQL ServerSQL Server にログインを試行すると拒否されます。The following logon trigger example denies an attempt to log in to SQL ServerSQL Server as a member of the login_test login if there are already three user sessions running under that login.

適用対象: SQL Server 2008SQL Server 2008 から SQL Server 2017SQL Server 2017Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

USE master;  
GO  
CREATE LOGIN login_test WITH PASSWORD = '3KHJ6dhx(0xVYsdf' MUST_CHANGE,  
    CHECK_EXPIRATION = ON;  
GO  
GRANT VIEW SERVER STATE TO login_test;  
GO  
CREATE TRIGGER connection_limit_trigger  
ON ALL SERVER WITH EXECUTE AS 'login_test'  
FOR LOGON  
AS  
BEGIN  
IF ORIGINAL_LOGIN()= 'login_test' AND  
    (SELECT COUNT(*) FROM sys.dm_exec_sessions  
            WHERE is_user_process = 1 AND  
                original_login_name = 'login_test') > 3  
    ROLLBACK;  
END;  
  

G.G. トリガーを起動するイベントを表示するViewing the events that cause a trigger to fire

次の例は、sys.triggers および sys.trigger_events カタログ ビューをクエリし、どの Transact-SQLTransact-SQL 言語イベントでトリガー safety が起動されるかを特定します。The following example queries the sys.triggers and sys.trigger_events catalog views to determine which Transact-SQLTransact-SQL language events cause trigger safety to fire. トリガー safety は、上の例 "D" で作成されます。The trigger, safety, is created in example 'D', found above.

SELECT TE.*  
FROM sys.trigger_events AS TE  
JOIN sys.triggers AS T ON T.object_id = TE.object_id  
WHERE T.parent_class = 0 AND T.name = 'safety';  
GO  

参照See Also

ALTER TABLE (Transact-SQL) ALTER TABLE (Transact-SQL)
ALTER TRIGGER (Transact-SQL) ALTER TRIGGER (Transact-SQL)
COLUMNS_UPDATED (Transact-SQL) COLUMNS_UPDATED (Transact-SQL)
CREATE TABLE (Transact-SQL) CREATE TABLE (Transact-SQL)
DROP TRIGGER (Transact-SQL) DROP TRIGGER (Transact-SQL)
ENABLE TRIGGER (Transact-SQL) ENABLE TRIGGER (Transact-SQL)
DISABLE TRIGGER (Transact-SQL) DISABLE TRIGGER (Transact-SQL)
TRIGGER_NESTLEVEL (Transact-SQL) TRIGGER_NESTLEVEL (Transact-SQL)
EVENTDATA (Transact-SQL) EVENTDATA (Transact-SQL)
sys.dm_sql_referenced_entities (Transact-SQL) sys.dm_sql_referenced_entities (Transact-SQL)
sys.dm_sql_referencing_entities (Transact-SQL) sys.dm_sql_referencing_entities (Transact-SQL)
sys.sql_expression_dependencies (Transact-SQL) sys.sql_expression_dependencies (Transact-SQL)
sp_help (Transact-SQL) sp_help (Transact-SQL)
sp_helptrigger (Transact-SQL) sp_helptrigger (Transact-SQL)
sp_helptext (Transact-SQL) sp_helptext (Transact-SQL)
sp_rename (Transact-SQL) sp_rename (Transact-SQL)
sp_settriggerorder (Transact-SQL) sp_settriggerorder (Transact-SQL)
UPDATE() (Transact-SQL) UPDATE() (Transact-SQL)
DML トリガーに関する情報の取得 Get Information About DML Triggers
DDL トリガーに関する情報の取得 Get Information About DDL Triggers
sys.triggers (Transact-SQL) sys.triggers (Transact-SQL)
sys.trigger_events (Transact-SQL) sys.trigger_events (Transact-SQL)
sys.sql_modules (Transact-SQL) sys.sql_modules (Transact-SQL)
sys.assembly_modules (Transact-SQL) sys.assembly_modules (Transact-SQL)
sys.server_triggers (Transact-SQL) sys.server_triggers (Transact-SQL)
sys.server_trigger_events (Transact-SQL) sys.server_trigger_events (Transact-SQL)
sys.server_sql_modules (Transact-SQL) sys.server_sql_modules (Transact-SQL)
sys.server_assembly_modules (Transact-SQL)sys.server_assembly_modules (Transact-SQL)