ALTER TRIGGER (Transact-SQL)ALTER 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

以前に CREATE TRIGGER ステートメントで作成された DML トリガー、DDL トリガー、またはログオン トリガーの定義を変更します。Modifies the definition of a DML, DDL, or logon trigger that was previously created by the CREATE TRIGGER statement. トリガーは、CREATE TRIGGER を使用して作成します。Triggers are created by using CREATE TRIGGER. これらのトリガーは、Transact-SQLTransact-SQL ステートメントから直接作成することも、MicrosoftMicrosoft .NET Framework.NET Framework 共通言語ランタイム (CLR) 内に作成したアセンブリのメソッドから作成し、SQL ServerSQL Server のインスタンスにアップロードすることもできます。They can be created 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. ALTER TRIGGER ステートメントで使用されるパラメーターの詳細については、「CREATE TRIGGER (Transact-SQL)」を参照してください。For more information about the parameters that are used in the ALTER TRIGGER statement, see CREATE TRIGGER (Transact-SQL).

トピック リンク アイコン 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)  

ALTER TRIGGER schema_name.trigger_name   
ON  ( table | view )   
[ WITH <dml_trigger_option> [ ,...n ] ]  
 ( FOR | AFTER | INSTEAD OF )   
{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }   
[ 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  
  
-- Trigger on an INSERT, UPDATE, or DELETE statement to a table 
-- (DML Trigger on memory-optimized tables)  

ALTER TRIGGER schema_name.trigger_name   
ON  ( table  )   
[ WITH <dml_trigger_option> [ ,...n ] ]  
 ( FOR | AFTER )   
{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }   
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)  
  
ALTER TRIGGER trigger_name   
ON { DATABASE | ALL SERVER }   
[ WITH <ddl_trigger_option> [ ,...n ] ]  
{ FOR | AFTER } { event_type [ ,...n ] | event_group }   
AS { sql_statement [ ; ] | EXTERNAL NAME <method specifier>   
[ ; ] }  
}   
  
<ddl_trigger_option> ::=  
    [ ENCRYPTION ]  
    [ <EXECUTE AS Clause> ]  
  
<method_specifier> ::=  
    assembly_name.class_name.method_name  
  
-- Trigger on a LOGON event (Logon Trigger)  

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

引数Arguments

schema_nameschema_name
DML トリガーが属しているスキーマの名前を指定します。Is 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 are created. schema**_name は、DML トリガーと、トリガーに対応するテーブルまたはビューが既定のスキーマに属している場合にのみ、省略可能です。schema**_name is optional only if the DML trigger and its corresponding table or view belong to the default schema. DDL トリガーまたはログオン トリガーでは schema_name を指定できません。schema_name cannot be specified for DDL or logon triggers.

trigger_nametrigger_name
変更する既存のトリガーです。Is the existing trigger to modify.

table | viewtable | view
DML トリガーが実行されるテーブルまたはビューです。Is the table or view on which the DML trigger is executed. テーブルまたはビューの完全修飾名の指定は省略可能です。Specifying the fully-qualified name of the table or view is optional.

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.

ALTER TRIGGER ステートメントのテキストを含む sys.syscommentssys.sql_modules エントリを暗号化します。Encrypts the sys.syscommentssys.sql_modules entries that contain the text of the ALTER 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 cannot be specified for CLR triggers.

注意

トリガーが WITH ENCRYPTION を使用して作成されている場合、それを有効なままにするには、ALTER TRIGGER ステートメントで WITH ENCRYPTION を再度指定する必要があります。If a trigger is created by using WITH ENCRYPTION, it must be specified again in the ALTER TRIGGER statement for this option to remain enabled.

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

詳細については、「EXECUTE AS 句 (Transact-SQL)」を参照してください。For more information, see EXECUTE 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 that are referenced by a trigger cannot be dropped or altered.

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

AFTERAFTER
トリガーをアクティブにする SQL ステートメントが正常に実行された後にのみ、そのトリガーを起動することを指定します。Specifies that the trigger is fired only after the triggering SQL statement is executed successfully. このトリガーが起動される前に、すべての連鎖参照操作および制約チェックも正常に終了している必要があります。All referential cascade actions and constraint checks also must have been successful before this trigger fires.

FOR キーワードのみが指定されている場合は、AFTER が既定値です。AFTER is the default, if only the FOR keyword is specified.

DML AFTER トリガーは、テーブルでのみ定義できます。DML AFTER triggers may be defined only on tables.

INSTEAD OFINSTEAD OF
SQL ステートメントを起動する代わりに DML トリガーの実行を指定します。したがって、ステートメントのトリガーの操作はオーバーライドされます。Specifies that the DML trigger is executed instead of the triggering SQL statement, therefore, overriding the actions of the triggering statements. DDL トリガーまたはログオン トリガーでは INSTEAD OF を指定できません。INSTEAD OF cannot be specified for DDL or logon triggers.

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

INSTEAD OF トリガーは、WITH CHECK OPTION を使用して作成したビューでは使用できません。INSTEAD OF triggers are not allowed on views created by using WITH CHECK OPTION. WITH CHECK OPTION が指定されているビューに対して INSTEAD OF トリガーを追加すると、SQL ServerSQL Server でエラーが発生します。SQL ServerSQL Server raises an error when an INSTEAD OF trigger is added to a view for which WITH CHECK OPTION was specified. ユーザーは、INSTEAD OF トリガーを定義する前に、ALTER VIEW を使用して WITH CHECK OPTION を削除する必要があります。The user must remove that option using ALTER VIEW before defining the INSTEAD OF trigger.

{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] } | { [INSERT ] [ , ] [ UPDATE ] }{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] } | { [INSERT ] [ , ] [ UPDATE ] }
このテーブルまたはビューに対して実行したときに DML トリガーをアクティブにするデータ変更ステートメントを指定します。Specifies the data modification statements, when tried against this table or view, activate the DML trigger. 少なくとも 1 つのオプションを指定する必要があります。At least one option must be specified. トリガー定義では、このキーワードを指定する順序や組み合わせを問いません。Any combination of these in any order is allowed in the trigger definition. 複数のオプションを指定するときは、オプションをコンマで区切ります。If more than one option is specified, separate the options with commas.

INSTEAD OF トリガーの場合、目的のテーブルに連鎖的な ON DELETE 参照操作を指定している参照関係があるときは、DELETE オプションを指定できません。For INSTEAD OF triggers, the DELETE option is not allowed on tables that have a referential relationship specifying a cascade action ON DELETE. 同様に、目的のテーブルに ON UPDATE 連鎖参照操作を指定している参照関係があるときは、UPDATE オプションを指定できません。Similarly, the UPDATE option is not allowed on tables that have a referential relationship specifying a cascade action ON UPDATE. 詳細については、「ALTER TABLE (Transact-SQL)」を参照してください。For more information, see ALTER TABLE (Transact-SQL).

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

event_groupevent_group
Transact-SQLTransact-SQL 言語イベントの定義済みグループの名前を指定します。Is the name of a predefined grouping of Transact-SQLTransact-SQL language events. DDL トリガーは、event_group に属する Transact-SQLTransact-SQL 言語イベントの実行後に起動します。The DDL trigger fires after execution 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. 対応するイベントの種類を sys.trigger_events カタログ ビューに追加すると、event_group は、ALTER TRIGGER の実行が終了した後、マクロとしても機能します。After ALTER 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 should not be executed when a replication agent modifies the table involved in the trigger.

sql_statementsql_statement
トリガー条件とトリガー動作です。Is the trigger conditions and actions.

メモリ最適化テーブルのトリガーの場合、最上位レベルで許可される唯一の 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.

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

トリガーにバインドするアセンブリのメソッドを指定します。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. 入れ子にされたクラスは使用できません。The class cannot be a nested class.

RemarksRemarks

ALTER TRIGGER の詳細については、「CREATE TRIGGER (Transact-SQL)」の「解説」を参照してください。For more information about ALTER TRIGGER, see Remarks in CREATE TRIGGER (Transact-SQL).

注意

EXTERNAL_NAME オプションおよび ON_ALL_SERVER オプションは、包含データベースでは使用できません。The EXTERNAL_NAME and ON_ALL_SERVER options are not available in a contained database.

DML トリガーDML Triggers

ALTER TRIGGER では、テーブルおよびビューに対する INSTEAD OF トリガーを利用することで、更新可能なビューを手動で使用できるようになります。ALTER TRIGGER supports manually updatable views through INSTEAD OF triggers on tables and views. SQL ServerSQL Server は、ALTER TRIGGER を、他のすべての種類のトリガー (AFTER、INSTEAD-OF) と同様に適用します。applies ALTER TRIGGER the same way for all kinds of triggers (AFTER, INSTEAD-OF).

テーブルで実行される最初と最後の AFTER トリガーを、sp_settriggerorder を使用して指定できます。The first and last AFTER triggers to be executed on a table can be specified by using sp_settriggerorder. 1 つのテーブルにつき、最初と最後の AFTER トリガーはそれぞれ 1 つだけ指定できます。Only one first and one last AFTER trigger can be specified on a table. 同じテーブルに他の AFTER トリガーが指定されている場合、トリガーはランダムに実行されます。If there are other AFTER triggers on the same table, they are randomly executed.

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 the order value must be reset by using sp_settriggerorder.

AFTER トリガーは、トリガーを起動する SQL ステートメントが正常に実行された後にのみ実行されます。An AFTER trigger is executed only after the triggering SQL statement has executed successfully. このステートメントの実行には、更新または削除されるオブジェクトに関連付けられている連鎖的なすべての参照操作と制約チェックの実行も含まれます。This successful execution includes all referential cascade actions and constraint checks associated with the object updated or deleted. AFTER トリガー操作は、トリガーをアクティブにするステートメントの結果、およびそのステートメントによって発生するすべての UPDATE および DELETE 連鎖参照操作の結果を調べます。The AFTER trigger operation checks for the effects of the triggering statement and also all referential cascade UPDATE and DELETE actions that are caused by the triggering statement.

子テーブルまたは参照元テーブルへの DELETE 操作が、親テーブルでの DELETE による CASCADE の結果として発生し、その子テーブルの中で DELETE での INSTEAD OF トリガーが定義されている場合、そのトリガーは無視され、DELETE 操作が実行されます。When a DELETE action to a child or referencing table is the result of a CASCADE on a DELETE from the parent table, and an INSTEAD OF trigger on DELETE is defined on that child table, the trigger is ignored and the DELETE action is executed.

DDL トリガーDDL Triggers

DML トリガーと異なり、DDL トリガーのスコープはスキーマに設定されません。Unlike DML triggers, DDL triggers are not scoped to schemas. そのため、DDL トリガーについてメタデータに問い合わせる際に、OBJECT_ID、OBJECT_NAME、OBJECTPROPERTY、および OBJECTPROPERTY(EX) は使用できません。Therefore, the OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY, and OBJECTPROPERTY(EX) cannot be used when querying metadata about DDL triggers. 代わりに、カタログ ビューを使用してください。Use the catalog views instead. 詳しくは、「DDL トリガーに関する情報の取得」をご覧ください。For more information, see Get Information About DDL Triggers.

ログオン トリガーLogon Triggers

Azure SQL データベースAzure SQL Database は、ログオン イベントによるトリガーをサポートしません。does not support triggers on logon events.

アクセス許可Permissions

DML トリガーを変更するには、トリガーが定義されているテーブルやビューに対する ALTER 権限が必要です。To alter a DML trigger requires ALTER permission on the table or view on which the trigger is defined.

サーバー スコープ (ON ALL SERVER) で定義されている DDL トリガー、またはログオン トリガーを変更するには、サーバーに対する CONTROL SERVER 権限が必要です。To alter a DDL trigger defined 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 alter a DDL trigger defined with database scope (ON DATABASE) requires ALTER ANY DATABASE DDL TRIGGER permission in the current database.

使用例Examples

次の例では、ユーザーが SalesPersonQuotaHistory テーブルにデータを追加したり、データを変更したりしようとすると、クライアントに対してユーザー定義のメッセージを出力する、AdventureWorks 2012 データベースの DML トリガーを作成します。The following example creates a DML trigger in the AdventureWorks 2012 database, that prints a user-defined message to the client when a user tries to add or change data in the SalesPersonQuotaHistory table. 次に ALTER TRIGGER を使用してトリガーを変更し、トリガーを INSERT 操作だけに適用します。The trigger is then modified by using ALTER TRIGGER to apply the trigger only on INSERT activities. このトリガーは、テーブルの更新や行の挿入を行うユーザーに対して、 Compensation 部門にも変更を知らせる必要があることを連絡できるので有用です。This trigger is helpful because it reminds the user that updates or inserts rows into this table to also notify the Compensation department.

CREATE TRIGGER Sales.bonus_reminder  
ON Sales.SalesPersonQuotaHistory  
WITH ENCRYPTION  
AFTER INSERT, UPDATE   
AS RAISERROR ('Notify Compensation', 16, 10);  
GO  

-- Now, change the trigger.  
ALTER TRIGGER Sales.bonus_reminder  
ON Sales.SalesPersonQuotaHistory  
AFTER INSERT  
AS RAISERROR ('Notify Compensation', 16, 10);  
GO  

参照See Also

DROP TRIGGER (Transact-SQL) DROP TRIGGER (Transact-SQL)
ENABLE TRIGGER (Transact-SQL) ENABLE TRIGGER (Transact-SQL)
DISABLE TRIGGER (Transact-SQL) DISABLE TRIGGER (Transact-SQL)
EVENTDATA (Transact-SQL) EVENTDATA (Transact-SQL)
sp_helptrigger (Transact-SQL) sp_helptrigger (Transact-SQL)
ストアド プロシージャの作成 Create a Stored Procedure
sp_addmessage (Transact-SQL) sp_addmessage (Transact-SQL)
トランザクション Transactions
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)
パブリケーション データベースでのスキーマの変更Make Schema Changes on Publication Databases