CREATE [DEFINER = {user
| CURRENT_USER }] TRIGGERtrigger_name
trigger_time
trigger_event
ONtbl_name
FOR EACH ROWtrigger_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_name
NEW.
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_name
NEW.
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.