CREATE TRIGGER ステートメントは、新しいトリガーを作成するために使用されます。トリガーはテーブルに関連付けられるデータベースオブジェクトであり、テーブルで指定されたイベントが発生するとトリガーが有効化されます。
CREATE TRIGGER ステートメントの構文は次のとおりです:
CREATE
[DEFINER = user]
TRIGGER trigger_name
trigger_time trigger_event
ON table_name FOR EACH ROW
[trigger_order]
trigger_body
trigger_time: { BEFORE | AFTER }
trigger_event: { INSERT | UPDATE | DELETE }
trigger_order: { FOLLOWS | PRECEDES } other_trigger_name
table_name はトリガーが関連付けられるテーブルを指定します。このテーブルは TEMPORARY テーブルではなく、トリガーを一時テーブルやビューに関連付けることはできません。
トリガー名はスキーマネームスペース内に存在するため、すべてのトリガーはスキーマ内で一意の名前を持つ必要があります。異なるスキーマのトリガーは同じ名前を持つことができます。
CREATE TRIGGER では、トリガーに関連付けられるテーブルに TRIGGER 権限が付与されている必要があります。DEFINER 句が存在する場合、必要な権限は user 値によって決まります。
trigger_time は、トリガーの動作時間を BEFORE または AFTER と指定します。これは、変更対象の各行の前または後にトリガーが有効化されることを示します。列値の基本チェックはトリガーの有効化よりも前に実行されるため、BEFORE トリガーを使用して列型に適合しない値を有効な値に変換することはできません。
trigger_event は、トリガーを有効化する操作タイプを示します。有効な値は次のとおりです:
INSERT:テーブルに新しい行が挿入されるたびに、トリガーが有効化されます。例えば、INSERT、LOAD DATA、およびREPLACEステートメントを使用してデータを挿入します。UPDATE:行が変更されるたびに(例えば、UPDATEステートメントを使用して)、トリガーが有効化されます。DELETE:テーブルから行が削除されるたびに(例えば、DELETEおよびREPLACEステートメントを使用して)、トリガーが有効化されます。DROP TABLEおよびTRUNCATE TABLEステートメントではこのトリガーは有効化されません。パーティションの削除でもDELETEトリガーは有効化されません。
trigger_event は、トリガーを有効化するSQLステートメントの文字列表現ではなく、テーブル操作タイプを示します。例えば、INSERT トリガーは INSERT ステートメントだけでなく LOAD DATA ステートメントによっても有効化されます。これらの2つのステートメントはどちらも行をテーブルに挿入します。
同じトリガーイベントと動作時間を持つテーブルに複数のトリガーを定義できます。例えば、テーブルには2つの BEFORE UPDATE トリガーを持つことができます。デフォルトでは、同じトリガーイベントと動作時間を持つトリガーは、作成された順序で有効化されます。
trigger_order 句は、キーワード FOLLOWS と PRECEDES を使用して、同じトリガーイベントと動作時間を持つトリガーの順序を指定できます。FOLLOWS キーワードは、新しいトリガーが既存のトリガーの後に有効化されることを示します。PRECEDES キーワードは、新しいトリガーが既存のトリガーの前に有効化されることを示します。
trigger_body は、トリガーが有効化されたときに実行されるステートメントです。複数のステートメントを実行するには、BEGIN ... END の複合ステートメントを使用します。
トリガー本体では、エイリアス OLD と NEW を使用して、メインテーブル(トリガーに関連付けられるテーブル)の列を参照できます。OLD.column_name は、現在の行を更新または削除する前の列を指します。NEW.column_name は、挿入される新しい行または更新後の現在の行の列を指します。トリガーは NEW.col_name と OLD.column_name を使用して生成列を参照することはできません。
DEFINER 句は、トリガーが有効化されてアクセス権限がチェックされる際に使用されるアカウントを指定します。DEFINER 句が存在する場合、user 値は 'user_name'@'host_name' として指定されたアカウント(例えば 'admin'@'oblocalhost')または CURRENT_USER() 関数によって取得されるアカウントである必要があります。DEFINER 句が省略されている場合、デフォルトの定義者は CREATE TRIGGER ステートメントを実行したユーザーであり、これは DEFINER = CURRENT_USER と同じです。
以下のトリガー権限をチェックする際には、DEFINER ユーザーが関与します:
CREATE TRIGGERステートメントを使用してトリガーを作成するユーザーにはTRIGGER権限が付与されていなければなりません。トリガーが有効化されると、
DEFINERユーザーに基づいて権限がチェックされます。このユーザーには、以下の権限が付与されていなければなりません:メインテーブルの
TRIGGER権限。トリガー本体で
OLD.col_nameまたはNEW.col_nameを使用してテーブル列を参照する場合、メインテーブルのSELECT権限が付与されていなければなりません。テーブル列がトリガー本体の
SET NEW.col_name = valueによって代入される場合、メインテーブルのUPDATE権限が付与されていなければなりません。トリガーが実行するステートメントに通常必要なその他の権限。
トリガー本体では、CURRENT_USER() 関数によって返されるトリガーが有効化されたときに権限をチェックするために使用されるアカウントは、トリガーを有効化した操作を実行したユーザーではなく、DEFINER ユーザーに属します。
トリガーの作成に関する詳細な例については、トリガーを参照してください。