CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name
trigger_time trigger_event
ON tbl_name FOR EACH ROW
trigger_body
trigger_time: { BEFORE | AFTER }
trigger_event: { INSERT | UPDATE | DELETE }
このステートメントは、新しいトリガーを作成します。トリガーとは、テーブルに関連付けられ、そのテーブルに対して特定のイベントが発生するとアクティブ化される名前付きデータベースオブジェクトのことです。トリガーは、tbl_name
という名前のテーブルに関連付けられます。これは、永続的なテーブルを指す必要があります。トリガーを TEMPORARY
テーブルまたはビューに関連付けることはできません。
トリガー名はスキーマの名前空間内に存在します。つまり、すべてのトリガーがスキーマ内で一意の名前を持つ必要があります。異なるスキーマ内のトリガーは同じ名前を持つことができます。
このセクションでは、CREATE TRIGGER
構文について説明します。詳細は、セクション20.3.1「トリガーの構文と例」を参照してください。
CREATE TRIGGER
には、このトリガーに関連付けられたテーブルに対する TRIGGER
権限が必要です。このセクションのあとの方で説明されているように、DEFINER
値によっては、このステートメントに SUPER
権限も必要になる可能性があります。バイナリロギングが有効になっている場合は、セクション20.7「ストアドプログラムのバイナリロギング」で説明されているように、CREATE TRIGGER
に SUPER
権限が必要になることがあります。
DEFINER
句は、このセクションのあとの方で説明されているように、トリガーのアクティブ化時にアクセス権限を確認するときに使用されるセキュリティーコンテキストを決定します。
trigger_time
は、このトリガーのアクション時間です。これは、トリガーが各行の変更の前またはあとにアクティブ化されることを示す BEFORE
または AFTER
にすることができます。
trigger_event
は、このトリガーをアクティブ化する操作の種類を示します。次の trigger_event
値が許可されます。
INSERT
: このトリガーは (たとえば、INSERT
、LOAD DATA
、およびREPLACE
ステートメントを使用して) 新しい行がテーブルに挿入されると常にアクティブ化されます。UPDATE
: このトリガーは (たとえば、UPDATE
ステートメントを使用して) 行が変更されると常にアクティブ化されます。DELETE
: このトリガーは (たとえば、DELETE
およびREPLACE
ステートメントを使用して) 行がテーブルから削除されると常にアクティブ化されます。テーブルに対するDROP TABLE
およびTRUNCATE TABLE
ステートメントは、DELETE
を使用しないため、このトリガーをアクティブ化しません。また、パーティションを削除してもDELETE
トリガーはアクティブ化されません。
trigger_event
は、トリガーをアクティブ化する SQL ステートメントのリテラル型を表しているのではなく、テーブル操作の種類を表しています。たとえば、INSERT
トリガーは、INSERT
ステートメントだけでなく、LOAD DATA
ステートメントでもアクティブ化されます。それは、どちらのステートメントもテーブルに行を挿入するためです。
この混乱を招く可能性がある例として、INSERT INTO ... ON DUPLICATE KEY UPDATE ...
構文があります。すべての行で BEFORE INSERT
トリガーがアクティブ化されたあと、その行に重複キーが存在したかどうかに応じて、AFTER INSERT
トリガーだけか、または BEFORE UPDATE
トリガーと AFTER UPDATE
トリガーの両方がアクティブ化されます。
カスケードされた外部キーアクションはトリガーをアクティブ化しません。
特定のテーブルに対して、トリガーイベントとアクション時間が同じ複数のトリガーが存在していてはいけません。たとえば、1 つのテーブルに対して 2 つの BEFORE UPDATE
トリガーを定義することはできません。ただし、BEFORE UPDATE
および BEFORE INSERT
トリガー、または BEFORE UPDATE
および AFTER UPDATE
トリガーは設定できます。
trigger_body
は、トリガーがアクティブ化されるときに実行されるステートメントです。複数のステートメントを実行するには、BEGIN ... END
複合ステートメント構造構文を使用します。また、これにより、ストアドルーチン内で許可されるのと同じステートメントを使用することもできます。セクション13.6.1「BEGIN ... END 複合ステートメント構文」を参照してください。一部のステートメントは、トリガー内では許可されません。セクションD.1「ストアドプログラムの制約」を参照してください。
トリガー本体内では、エイリアス OLD
と NEW
を使用して、対象テーブル (そのトリガーに関連付けられたテーブル) 内のカラムを参照できます。OLD.
は、更新または削除される前の既存の行のカラムを示します。col_name
NEW.
は、挿入された新しい行、または更新されたあとの既存の行のカラムを示します。
col_name
MySQL は、トリガーが作成されたときの有効な sql_mode
システム変数の設定を格納し、トリガーが実行を開始したときの現在のサーバー SQL モードには関係なく、常にそのトリガー本体を強制的にこの設定で実行します。
DEFINER
句は、トリガーのアクティブ化時にアクセス権限を確認するときに使用される MySQL アカウントを指定します。user
値を指定する場合は、'
(user_name
'@'host_name
'GRANT
ステートメントで使用されるのと同じ形式)、CURRENT_USER
、または CURRENT_USER()
として指定された MySQL アカウントにしてください。DEFINER
のデフォルト値は、CREATE TRIGGER
ステートメントを実行するユーザーです。これは、明示的に DEFINER = CURRENT_USER
を指定するのと同じです。
DEFINER
句を指定した場合は、次のルールによって有効な DEFINER
ユーザーの値が決定されます。
SUPER
権限がない場合、許可される唯一のuser
値は、リテラルで指定するか、またはCURRENT_USER
を使用して指定した自分のアカウントです。定義者をほかのアカウントに設定することはできません。SUPER
権限がある場合は、構文として有効な任意のアカウント名を指定できます。そのアカウントが実際に存在しない場合は、警告が生成されます。存在しない
DEFINER
アカウントでトリガーを作成することはできますが、そのアカウントが実際に存在するようになるまで、このようなトリガーをアクティブ化することはお勧めできません。それ以外の権限確認に関する動作は定義されていません。
MySQL は、トリガー権限を確認するときに、DEFINER
ユーザーを次のように考慮します。
CREATE TRIGGER
の時点で、このステートメントを発行するユーザーにはTRIGGER
権限が必要です。-
トリガーのアクティブ化時、権限は
DEFINER
ユーザーに対して確認されます。このユーザーには、次の権限が必要です。対象テーブルに対する
TRIGGER
権限。テーブルカラムへの参照がトリガー本体内の
OLD.
またはcol_name
NEW.
を使用して発生した場合は、対象テーブルに対するcol_name
SELECT
権限。テーブルカラムがトリガー本体内の
SET NEW.
割り当てのターゲットである場合は、対象テーブルに対するcol_name
=value
UPDATE
権限。その他のどのような権限も、通常、そのトリガーによって実行されるステートメントに必要です。
トリガーのセキュリティーの詳細は、セクション20.6「ストアドプログラムおよびビューのアクセスコントロール」を参照してください。
トリガー本体内で、CURRENT_USER()
関数は、トリガーのアクティブ化時に権限を確認するために使用されるアカウントを返します。これは、そのトリガーがアクティブ化される原因となるアクションを実行したユーザーではなく、DEFINER
ユーザーです。トリガー内のユーザー監査については、セクション6.3.13「SQL ベースの MySQL アカウントアクティビティーの監査」を参照してください。
LOCK TABLES
を使用してトリガーを含むテーブルをロックした場合は、セクション13.3.5.2「LOCK TABLES とトリガー」で説明されているように、そのトリガー内で使用されているテーブルもロックされます。
トリガーの使用の詳細は、セクション20.3.1「トリガーの構文と例」を参照してください。