CREATE
    [DEFINER = { user | CURRENT_USER }]
    TRIGGER trigger_name trigger_time trigger_event
    ON tbl_name FOR EACH ROW trigger_stmt
        このステートメントによって、新しいトリガーが生成されます。トリガーは名称を持つ、テーブルに付属するデータベースオブジェクトで、テーブルに対して特定イベントが発生すると有効にされます。トリガーは、tbl_name
        なる名称を持つテーブルと連携するようになり、これによって、トリガーはパーマネントテーブルを参照しなければならなくなります。トリガーを
        TEMPORARY
        テーブルあるいはビューと連携させることはできません。
      
        CREATE TRIGGER
        には、トリガーに関連付けられたテーブルに対する
        TRIGGER
        権限が必要です。(MySQL 5.1.6
        より前のバージョンでは、このステートメントには
        SUPER
        権限が必要です。)
      
        DEFINER
        節によって、トリガーの有効化時にアクセス権限を確認するときに使用されるセキュリティーコンテキストが決定されます。
      
        trigger_time
        はトリガーのアクションタイムです。この値は、各行が変更される前またはあとにトリガーを有効にすることを示す
        BEFORE または
        AFTER
        にすることができます。
      
        trigger_event
        はトリガーを有効にするステートメントの種類を示します。trigger_event
        では、以下の中から 1 つを選ぶことができます:
      
            INSERT:トリガーは、新しい行がテーブルに挿入されると必ず、たとえば
            INSERT、LOAD
            DATA 並びに
            REPLACE
            の各ステートメントを通して有効にされます。
          
            UPDATE:トリガーは、行が修正されると必ず、たとえば
            UPDATE
            ステートメントを通して有効にされます。
          
            DELETE:トリガーは、新しい行がテーブルから削除されると必ず、たとえば
            DELETE
            ステートメント並びに
            REPLACE
            ステートメントを通して有効にされます。しかし、テーブル上の
            DROP TABLE
            ステートメントおよび
            TRUNCATE
            ステートメントは
            DELETE
            を使用していないので、このトリガーを有効化
            しません。パーティションをドロップすると、DELETE
            トリガーも有効にされません。項8.2.10. 「TRUNCATE 構文」
            を参照してください。
          
        trigger_event
        は、それがテーブル操作の型を表している場合には、トリガーを有効にする
        SQL
        ステートメントのリテラル型を表さないと理解することが重要です。たとえば、ステートメントは両方共行をテーブルに挿入するので、INSERT
        トリガーは、INSERT
        ステートメントのみならず、LOAD
        DATA
        ステートメントによっても有効にされます。
      
        これと混同される可能性のある例として、INSERT
        INTO ... ON DUPLICATE KEY UPDATE ...
        構文があります。BEFORE
        INSERT
        トリガーはすべての行に対して有効にし、その行に重複キーが存在したかどうかに応じて、そのあとに
        AFTER INSERT
        トリガーまたは BEFORE
        UPDATE トリガーと AFTER
        UPDATE
        トリガーの両方のどちらかが続きます。
      
        同じトリガーアクションタイムとトリガーイベントを持つテーブルに対して、2
        つのトリガーは存在することはできません。たとえば、1
        個のテーブルに対して 2 つの
        BEFORE UPDATE
        トリガーを持つことはできません。しかし、BEFORE
        UPDATE トリガーと BEFORE
        INSERT トリガーまたは
        BEFORE UPDATE トリガーと
        AFTER UPDATE
        トリガーを持つことができます。
      
        trigger_stmt
        はトリガーを有効にするときに実行させるステートメントです。複数の命令を実行させたい場合には、BEGIN
        ... END
        複合文構造構文を使ってください。これは、ストアドルーチン内で許されているのと同じステートメントも使うことができるようにします。詳しくは項8.8.1. 「BEGIN ... END
        複合ステートメント構文」を参照してください。トリガー内で許可されないステートメントもあります。Restrictions on Stored Routines, Triggers, and Events
        を参照してください。
      
        MySQL は
        sql_mode
        システム中に、トリガーが生成されたときに有効であった変数設定を記憶し、現サーバーの
        SQL
        モードに関係なく、この設定でトリガーを実際に実行します。
      
トリガーは現在、転送された外部キーアクションによって有効にされません。この制限はできるだけ早く撤廃されるでしょう。
        MySQL 5.1 では、この例に示されている
        testref
        という名前のトリガーなどの、名前によるテーブルへの直接参照を含むトリガーを記述できます。
      
CREATE TABLE test1(a1 INT);
CREATE TABLE test2(a2 INT);
CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
CREATE TABLE test4(
  a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  b4 INT DEFAULT 0
);
delimiter |
CREATE TRIGGER testref BEFORE INSERT ON test1
  FOR EACH ROW BEGIN
    INSERT INTO test2 SET a2 = NEW.a1;
    DELETE FROM test3 WHERE a3 = NEW.a1;
    UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
  END;
|
delimiter ;
INSERT INTO test3 (a3) VALUES
  (NULL), (NULL), (NULL), (NULL), (NULL),
  (NULL), (NULL), (NULL), (NULL), (NULL);
INSERT INTO test4 (a4) VALUES
  (0), (0), (0), (0), (0), (0), (0), (0), (0), (0);
        以下の値をテーブル
        test1
        に、ここに示すように挿入すると仮定します:
      
mysql>INSERT INTO test1 VALUES->(1), (3), (1), (7), (1), (8), (4), (4);Query OK, 8 rows affected (0.01 sec) Records: 8 Duplicates: 0 Warnings: 0
結果として、4 つのテーブル中のデータは以下の通りになります:
mysql>SELECT * FROM test1;+------+ | a1 | +------+ | 1 | | 3 | | 1 | | 7 | | 1 | | 8 | | 4 | | 4 | +------+ 8 rows in set (0.00 sec) mysql>SELECT * FROM test2;+------+ | a2 | +------+ | 1 | | 3 | | 1 | | 7 | | 1 | | 8 | | 4 | | 4 | +------+ 8 rows in set (0.00 sec) mysql>SELECT * FROM test3;+----+ | a3 | +----+ | 2 | | 5 | | 6 | | 9 | | 10 | +----+ 5 rows in set (0.00 sec) mysql>SELECT * FROM test4;+----+------+ | a4 | b4 | +----+------+ | 1 | 3 | | 2 | 0 | | 3 | 1 | | 4 | 2 | | 5 | 0 | | 6 | 0 | | 7 | 1 | | 8 | 1 | | 9 | 0 | | 10 | 0 | +----+------+ 10 rows in set (0.00 sec)
        エイリアス OLD
        とエイリアス NEW
        を使うことによって、サブジェクトテーブル
        (トリガーに添付されたテーブル)
        中のカラムを参照することができます。OLD.
        は既存の行のカラムが更新または削除される前に確認します。col_nameNEW.
        は挿入すべき新しい行あるいは更新された既存の行のカラムを参照します。
      col_name
        DEFINER
        節は、トリガーの有効化においてアクセス権を確認するときに使用すべき
        MySQL
        アカウントを指定します。user
        値を附与する場合、それを「'フォーマット
        (user_name'@'host_name'GRANT
        ステートメントに使用したと同じフォーマット)
        の中にある MySQL
        アカウントとするべきです。user_name
        の値と host_name
        の値が両方共要求されます。定義者はまた、CURRENT_USER
        または
        CURRENT_USER()
        として指定することもできます。DEFINER
        のデフォルト値は
        CREATE TRIGGER
        ステートメントを実行するユーザーです。(これは
        DEFINER = CURRENT_USER
        と同じです)。
      
        DEFINER
        節を指定する場合は、これらの規則によって正当な
        DEFINER
        ユーザー値が決定されます。
      
            SUPER
            権限を持っていない場合、文字によるか、CURRENT_USER
            を使って規定されている
            user
            値だけが有効なユーザーアカウントとなります。定義子をほかのアカウントに設定することはできません。
          
            SUPER
            権限を持っている場合、構文的に有効なアカウントネームを規定することができます。そのアカウントが実在しない場合、警告が生成されます。
          
            存在しない DEFINER
            値を使用してトリガーを作成できますが、定義者が実際に存在するまで、このようなトリガーを有効にしないようにすることをお勧めします。さもなければ、権限確認に関する挙動パターンは定義されません。
          
        注意:MySQL 5.1.6 以前のバージョンでは、MySQL は
        CREATE TRIGGER
        を使用するために
        SUPER
        権限を要求するので、前の規則の 2
        番目の規定だけが適用されます。5.1.6
        では、CREATE
        TRIGGER は
        TRIGGER
        権限を要求し、SUPER
        権限は、DEFINER
        に自身のアカウント値以外の値を設定することを可能にするためだけに要求されます。
      
        MySQL
        は、次のように、トリガー権限を確認するときに
        DEFINER
        ユーザーを考慮に入れます。
      
            CREATE
            TRIGGER
            の時点で、ステートメントを発行するユーザーは
            TRIGGER
            権限を持っている必要があります。(MySQL 5.1.6
            より前のバージョンでは
            SUPER。)
          
            トリガーを有効にするとき、権限が
            DEFINER
            ユーザーのものであるか確認されます。このユーザーは、これらの権限を持っていなければなりません:
          
                TRIGGER
                権限。(MySQL 5.1.6 より前のバージョンでは
                SUPER。)
              
                テーブルカラムへの参照がトリガー定義内の
                OLD.
                または
                col_nameNEW.
                を介して実行される場合は、サブジェクトテーブルに対する
                col_nameSELECT
                権限。
              
                テーブルカラムがトリガー定義内の
                SET
                NEW.
                割り当てのターゲットである場合は、サブジェクトテーブルに対する
                col_name =
                valueUPDATE
                権限。
              
トリガーによってステートメントが実行されるために一般に要求されるその他一切の権限。
        トリガー内では、CURRENT_USER()
        関数が、トリガーの有効化時に権限を確認するために使用されるアカウントを返します。これは、トリガーを有効にする原因となったアクションを実行したユーザーではなく、DEFINER
        ユーザーです。トリガー内のユーザー監査については、Auditing MySQL Account Activity
        を参照してください。
      
        項8.4.5.2. 「LOCK TABLES
          とトリガー」
        で説明されているように、LOCK
        TABLES
        を使用してトリガーを含むテーブルをロックすると、そのトリガー内で使用されているテーブルもロックされます。
      

