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 ステートメントによっても有効化されます。
同じトリガーイベントと実行タイミングを持つテーブルに対して複数のトリガーを定義できます。例えば、1つのテーブルに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 ユーザーに属します。
トリガー作成の詳細な例については、トリガーを参照してください。