ALTER TRIGGER (Transact-SQL)

更新 : 2006 年 12 月 12 日

以前に CREATE TRIGGER ステートメントで作成された DML トリガ、DDL トリガ、またはログオン トリガの定義を変更します。トリガは、CREATE TRIGGER を使用して作成します。これらのトリガは、Transact-SQL ステートメントから直接作成することも、Microsoft .NET Framework 共通言語ランタイム (CLR) 内に作成したアセンブリのメソッドから作成し、SQL Server のインスタンスにアップロードすることもできます。ALTER TRIGGER ステートメントで使用されるパラメータの詳細については、「CREATE TRIGGER (Transact-SQL)」を参照してください。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

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 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

引数

  • schema_name
    DML トリガが所属するスキーマの名前です。DML トリガのスコープは、トリガが作成されたテーブルまたはビューのスキーマです。schema_name は、DML トリガと、トリガに対応するテーブルまたはビューが既定のスキーマに属している場合のみ、省略可能です。schema_name は、DDL トリガまたはログオン トリガに対しては指定できません。
  • trigger_name
    変更する既存のトリガです。
  • table | view
    DML トリガが実行されるテーブルまたはビューです。テーブルまたはビューの完全修飾名の指定は省略可能です。
  • DATABASE
    DDL トリガのスコープを現在のデータベースに適用します。これを指定すると、現在のデータベースで event_type または event_group が発生するたびにトリガが起動します。
  • ALL SERVER
    DDL トリガまたはログオン トリガのスコープを現在のサーバーに適用します。これを指定すると、現在のサーバーの任意の場所で event_type または event_group が発生するたびにトリガが起動します。
  • WITH ENCRYPTION
    ALTER TRIGGER ステートメントのテキストを含んでいる syscomments エントリを暗号化します。WITH ENCRYPTION を使用すると、そのトリガを SQL Server レプリケーションの一部としてパブリッシュできなくなります。WITH ENCRYPTION は、CLR トリガには指定できません。

    ms176072.note(ja-jp,SQL.90).gifメモ :
    トリガが WITH ENCRYPTION を使用して作成されている場合、それを有効なままにするには、ALTER TRIGGER ステートメントで WITH ENCRYPTION を再度指定する必要があります。
  • EXECUTE AS
    トリガが実行されるセキュリティ コンテキストを指定します。このオプションを使用することで、SQL Server のインスタンスが使用するユーザー アカウントを制御することができます。このアカウントは、トリガが参照するデータベース オブジェクトに対する権限を検証するために使用されます。

    詳細については、「EXECUTE AS 句 (Transact-SQL)」を参照してください。

  • AFTER
    トリガをアクティブにする SQL ステートメントが正常に実行された後にのみ、そのトリガを起動することを指定します。このトリガが起動される前に、すべての連鎖参照操作および制約チェックも正常に終了している必要があります。

    FOR キーワードのみが指定されている場合は、AFTER が既定値です。

    DML AFTER トリガは、テーブルでのみ定義できます。

  • INSTEAD OF
    その DML トリガを、トリガをアクティブにする SQL ステートメントの代わりに実行するように指定します。したがって、トリガをアクティブにするステートメントの操作は無効になります。INSTEAD OF は、DDL トリガまたはログオン トリガには指定できません。

    テーブルまたはビューでは、INSERT、UPDATE、または DELETE の各ステートメントごとに 1 つだけ INSTEAD OF トリガを定義できます。ただし、各ビューに INSTEAD OF トリガがあるビューで、ビューを定義することができます。

    INSTEAD OF トリガは、WITH CHECK OPTION を使用して作成したビューでは使用できません。WITH CHECK OPTION が指定されているビューに対して INSTEAD OF トリガを追加すると、SQL Server でエラーが発生します。ユーザーは、INSTEAD OF トリガを定義する前に、ALTER VIEW を使用して WITH CHECK OPTION を削除する必要があります。

  • { [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] } | { [INSERT ] [ , ] [ UPDATE ] }
    このテーブルまたはビューに対して実行したときに DML トリガをアクティブにするデータ変更ステートメントを指定します。少なくとも 1 つのオプションを指定する必要があります。トリガ定義では、このキーワードを指定する順序や組み合わせを問いません。複数のオプションを指定するときは、オプションをコンマで区切ります。

    INSTEAD OF トリガの場合、目的のテーブルに ON DELETE 連鎖参照操作を指定している参照関係があるときは、DELETE オプションを指定できません。同様に、目的のテーブルに ON UPDATE 連鎖参照操作を指定している参照関係があるときは、UPDATE オプションを指定できません。詳細については、「ALTER TABLE (Transact-SQL)」を参照してください。

  • event_group
    Transact-SQL 言語イベントの、事前に定義されたグループの名前です。DDL トリガは、event_group に属する Transact-SQL 言語イベントの実行後に起動します。DDL トリガで使用できるイベント グループの一覧は、「DDL トリガと併用するためのイベント グループ」にあります。対応するイベントの種類を sys.trigger_events カタログ ビューに追加すると、event_group は、ALTER TRIGGER の実行が終了した後、マクロとしても機能します。
  • sql_statement
    トリガ条件とトリガ動作です。
  • <method_specifier>
    トリガにバインドするアセンブリのメソッドを指定します。このメソッドは引数を受け取らず、void を返す必要があります。class_name は、有効な SQL Server 識別子で、アセンブリの表示設定が指定されたアセンブリ内にクラスとして存在する必要があります。クラスを入れ子にはできません。

解説

ALTER TRIGGER の詳細については、「CREATE TRIGGER (Transact-SQL)」の「解説」を参照してください。

DML トリガ

ALTER TRIGGER では、テーブルおよびビューに対する INSTEAD OF トリガを利用することで、更新可能なビューが手動で使用できます。SQL Server は、ALTER TRIGGER を、他のすべての種類のトリガ (AFTER、INSTEAD-OF) と同様に適用します。

テーブルで実行される最初と最後の AFTER トリガを、sp_settriggerorder を使用して指定できます。1 つのテーブルにつき、最初と最後の AFTER トリガはそれぞれ 1 つだけ指定できます。同じテーブルに他の AFTER トリガが複数ある場合は、ランダムに実行されます。

ALTER TRIGGER ステートメントを使って最初と最後のトリガを変更すると、変更したトリガに設定されていた最初と最後を示す属性が削除されるため、sp_settriggerorder を使用して順序の値を再設定する必要があります。

AFTER トリガは、トリガの基になった SQL ステートメントの実行が正常に終了した後にだけ実行されます。正常な実行の中には、更新または削除対象のオブジェクトに関連付けられているすべての連鎖参照操作と制約チェックが含まれます。AFTER トリガ操作は、トリガをアクティブにするステートメントの結果、およびそのステートメントによって発生するすべての UPDATE および DELETE 連鎖参照操作の結果を調べます。

子テーブルまたは参照元テーブルへの DELETE 操作が、親テーブルでの DELETE による CASCADE の結果として発生し、その子テーブルの中で DELETE での INSTEAD OF トリガが定義されている場合、そのトリガは無視され、DELETE 操作が実行されます。

DDL トリガ

DML トリガと異なり、DDL トリガのスコープはスキーマに設定されません。そのため、DDL トリガについてメタデータに問い合わせる際に、OBJECT_ID、OBJECT_NAME、OBJECTPROPERTY、および OBJECTPROPERTY(EX) は使用できません。代わりにカタログ ビューを使用します。詳細については、「DDL トリガに関する情報の取得」を参照してください。

権限

DML トリガを変更するには、トリガが定義されているテーブルやビューに対する ALTER 権限が必要です。

サーバー スコープ (ON ALL SERVER) で定義されている DDL トリガ、またはログオン トリガを変更するには、サーバーに対する CONTROL SERVER 権限が必要です。データベース スコープ (ON DATABASE) で定義されている DDL トリガを変更するには、現在のデータベースでの ALTER ANY DATABASE DDL TRIGGER 権限が必要です。

次の例では、ユーザーが SalesPersonQuotaHistory テーブルにデータを追加したり、データを変更したりしようとすると、クライアントに対してユーザー定義のメッセージを出力する DML トリガを作成します。次に ALTER TRIGGER を使用してトリガを変更し、トリガを INSERT 操作だけに適用します。このトリガは、テーブルの更新や行の挿入を行うユーザーに対して、Compensation 部門にも変更を知らせる必要があることを連絡できるので有用です。

USE AdventureWorks;
GO
IF OBJECT_ID(N'Sales.bonus_reminder', N'TR') IS NOT NULL
    DROP TRIGGER Sales.bonus_reminder;
GO
CREATE TRIGGER Sales.bonus_reminder
ON Sales.SalesPersonQuotaHistory
WITH ENCRYPTION
AFTER INSERT, UPDATE 
AS RAISERROR ('Notify Compensation', 16, 10);
GO
-- Now, change the trigger.
USE AdventureWorks;
GO
ALTER TRIGGER Sales.bonus_reminder
ON Sales.SalesPersonQuotaHistory
AFTER INSERT
AS RAISERROR ('Notify Compensation', 16, 10);
GO

参照

関連項目

DROP TRIGGER (Transact-SQL)
ENABLE TRIGGER (Transact-SQL)
DISABLE TRIGGER (Transact-SQL)
EVENTDATA (Transact-SQL)
sp_helptrigger (Transact-SQL)
sp_addmessage (Transact-SQL)
sys.triggers (Transact-SQL)
sys.trigger_events (Transact-SQL)
sys.sql_modules (Transact-SQL)
sys.assembly_modules (Transact-SQL)
sys.server_triggers
sys.server_trigger_events
sys.server_sql_modules
sys.server_assembly_modules (Transact-SQL)

その他の技術情報

ストアド プロシージャの作成 (データベース エンジン)
トランザクション
オブジェクト名としての識別子の使用
DML トリガに関する情報の取得
DDL トリガに関する情報の取得
NOT FOR REPLICATION を使用した制約、ID、およびトリガの制御
パブリケーション データベースでのスキーマの変更

ヘルプおよび情報

SQL Server 2005 の参考資料の入手

変更履歴

リリース 履歴

2006 年 12 月 12 日

新しい内容
  • SQL Server 2005 Service Pack 2 で導入されたログオン トリガの構文、引数、権限の情報を追加。

2005 年 12 月 5 日

新しい内容
  • 引数 schema_name を指定する必要がある場合の説明を追加。