CREATE
    [DEFINER = { user | CURRENT_USER }]
    TRIGGER trigger_name trigger_time trigger_event
    ON tbl_name FOR EACH ROW trigger_stmt
      Diese Anweisung erzeugt einen neuen Trigger. Ein Trigger ist ein
      benanntes Datenbankobjekt, das mit einer Tabelle verbunden ist und
      aktiviert wird, wenn für diese Tabelle ein bestimmtes Ereignis
      eintritt. Gegenwärtig ist zur Ausführung von CREATE
      TRIGGER das TRIGGER-Recht für die
      Tabelle erforderlich, zu welcher der Trigger gehört. (Vor MySQL
      5.1.6 war für diese Anweisung das SUPER-Recht
      notwendig.)
    
      Der Trigger wird mit der Tabelle
      tbl_name verbunden, die eine permanante
      Tabelle sein muss. Mit einer als TEMPORARY
      definierten Tabelle oder View lässt sich kein Trigger verbinden.
    
      Wenn der Trigger aktiviert wird, legt die
      DEFINER-Klausel fest, welche Rechte angewendet
      werden. Genaueres erfahren Sie weiter unten in diesem Kapitel.
    
      Die trigger_time ist der Zeitpunkt der
      Trigger-Aktion. Sie kann BEFORE oder
      AFTER sein, je nachdem, ob der Trigger sich vor
      oder nach der Anweisung einschaltet, die ihn aktivierte.
    
      Das trigger_event gibt an, welche Art
      von Anweisung den Trigger aktiviert. Das
      trigger_event kann eines der folgenden
      Ereignisse sein:
    
          INSERT: Der Trigger wird immer dann
          aktiviert, wenn eine neue Zeile in die Tabelle eingefügt
          wird, beispielsweise mit INSERT-,
          LOAD DATA- und
          REPLACE-Anweisungen.
        
          UPDATE: Der Trigger wird immer dann
          aktiviert, wenn eine Zeile in der Tabelle geändert wird,
          beispielsweise mit UPDATE-Anweisungen.
        
          DELETE: Der Trigger wird immer dann
          aktiviert, wenn eine Zeile aus der Tabelle gelöscht wird,
          beispielsweise mit DELETE- und
          REPLACE-Anweisungen.
        
      Es ist wichtig, zu verstehen, dass das
      trigger_event weniger eine Art von
      SQL-Anweisung ist, die den Trigger aktiviert, als vielmehr eine
      Art von Tabellenoperation. So wird beispielsweise ein
      INSERT-Trigger nicht nur von
      INSERT-Anweisungen, sondern auch von
      LOAD DATA-Anweisungen aktiviert, weil beide
      Anweisungen Zeilen in eine Tabelle einfügen.
    
      Ein potenziell verwirrendes Beispiel dafür ist die Syntax von
      INSERT INTO ... ON DUPLICATE KEY UPDATE ...:
      Für jede Zeile wird ein BEFORE INSERT-Trigger
      aktiviert, gefolgt entweder von einem AFTER
      INSERT-Trigger oder von dem Triggerpaar aus
      BEFORE UPDATE und AFTER
      UPDATE, je nachdem, ob ein doppelter Schlüssel für die
      Zeile vorlag oder nicht.
    
      Es dürfen keine zwei Trigger einer Tabelle dieselbe Aktionszeit
      und dasselbe Trigger-Ereignis haben. Zum Beispiel können Sie
      keine zwei BEFORE UPDATE-Trigger für eine
      Tabelle definieren. Sie können jedoch einen BEFORE
      UPDATE- und einen BEFORE
      INSERT-Trigger oder einen BEFORE
      UPDATE- und einen AFTER
      UPDATE-Trigger definieren.
    
      trigger_stmt ist die Anweisung, die
      ausgeführt wird, wenn der Trigger in Aktion tritt. Wenn Sie
      mehrere Anweisungen ausführen möchten, verwenden Sie das
      Konstrukt BEGIN ... END für zusammengesetzte
      Anweisungen. So können Sie auch dieselben Anweisungen wie in
      gespeicherten Routinen verwenden. Siehe auch
      Abschnitt 19.2.5, „BEGIN ... END-Syntax für komplexe Anweisungen“.
    
Hinweis: Zurzeit werden Trigger nicht von kaskadierenden Fremdschlüsselaktionen aktiviert. Dieser Mangel wird jedoch so bald wie möglich behoben.
      In MySQL 5.1 können Sie Trigger schreiben, die
      Direktverweise auf Tabellennamen enthalten, wie der Trigger
      testref im folgenden Beispiel:
    
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);
      Angenommen, Sie setzen die folgenden Werte in die Tabelle
      test1 ein, wie hier gezeigt:
    
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
Die Daten in den vier Tabellen stellen sich dann folgendermaßen dar:
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)
      Die Spalten der Subjekttabelle (der Tabelle, zu welcher der
      Trigger gehört) können Sie mit den Aliasnamen
      OLD und NEW ansprechen.
      OLD. bezieht
      sich auf eine Spalte mit einer vorhandenen Zeile, bevor diese
      geändert oder gelöscht wurde, und
      col_nameNEW. auf die
      Spalte mit einer neu eingefügten oder geänderten Zeile.
    col_name
      Die DEFINER-Klausel gibt an, welches
      MySQL-Konto zur Prüfung der Zugriffsberechtigungen bei
      Aktivierung des Triggers herangezogen wird. Wenn ein
      user-Wert angegeben ist, dann als
      MySQL-Konto im Format
      '
      (dasselbe Format wird auch in der
      user_name'@'host_name'GRANT-Anweisung verwendet). Die Werte
      user_name und
      host_name sind beide obligatorisch.
      CURRENT_USER kann auch als
      CURRENT_USER() angegeben werden. Der
      Standardwert für DEFINER ist der Benutzer, der
      die CREATE TRIGGER-Anweisung ausführt. (Dies
      ist dasselbe wie DEFINER = CURRENT_USER.)
    
      Wenn Sie die DEFINER-Klausel angeben, dürfen
      Sie den Wert auf kein anderes als Ihr eigenes Konto einstellen,
      wenn Sie nicht über das SUPER-Recht verfügen.
      Die zulässigen Werte für den DEFINER-Benutzer
      richten sich nach folgenden Regeln:
    
          Wenn Sie nicht das SUPER-Recht haben, ist
          der einzig zulässige user-Wert Ihr
          eigenes Konto, das entweder buchstäblich oder über
          CURRENT_USER angegeben werden kann. Auf ein
          anderes Konto können Sie den DEFINER nicht
          einstellen.
        
          Wenn Sie das SUPER-Recht haben, können Sie
          jeden gültigen Kontonamen angeben, der syntaktisch zulässig
          ist. Existiert das Konto in Wirklichkeit nicht, wird eine
          Warnung ausgegeben.
        
      Hinweis: In älteren Versionen als MySQL 5.1.6 wird das
      SUPER-Recht für die Benutzung von
      CREATE TRIGGER verlangt, sodass für diese
      älteren Releases nur die zweite der oben genannten Regeln gilt.
      Seit der Version 5.1.6 ist SUPER nur noch
      erforderlich, wenn der DEFINER auf etwas
      anderes als das eigene Konto eingestellt werden soll.
    
MySQL prüft Trigger-Berechtigungen folgendermaßen:
          Zur CREATE TRIGGER-Zeit muss der Benutzer,
          der die Anweisung gibt, das TRIGGER-Recht
          besitzen. (Vor MySQL 5.1.6 war sogar das
          SUPER-Recht erforderlich.)
        
          Zum Zeitpunkt der Trigger-Aktivierung werden die
          Berechtigungen mit denen des
          DEFINER-Benutzers verglichen. Dieser
          benötigt folgende Berechtigungen:
        
              Das TRIGGER-Recht (vor MySQL 5.1.6 das
              SUPER-Recht).
            
              Das SELECT-Recht für die
              Subjekttabelle, wenn mit
              OLD.
              oder
              col_nameNEW.
              in der Trigger-Definition auf Tabellenspalten verwiesen
              wird.
            col_name
              Das UPDATE-Recht für die
              Subjekttabelle, wenn ihre Spalten Ziel von SET
              NEW.-Zuweisungen in
              der Trigger-Definition sind.
            col_name =
              value
Zusätzlich alle anderen Rechte, die normalerweise für die vom Trigger ausgeführten Anweisungen erforderlich sind.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.

