Suche…


Syntax

  • CREATE [DEFINER = {Benutzer | CURRENT_USER}] TRIGGER trigger_name trigger_time trigger_event ON tbl_name Für jede Zeile [trigger_order] trigger_body
  • trigger_time: {VOR VOR | NACH DEM }
  • trigger_event: {INSERT | UPDATE | LÖSCHEN}
  • trigger_order: {FOLLOWS | PRECEDES} other_trigger_name

Bemerkungen

Wenn Sie bei anderen DBs bereits Trigger verwenden, müssen Sie zwei Punkte beachten:

FÜR JEDE REIHE

FOR EACH ROW ist ein obligatorischer Teil der Syntax

Sie können keine Anweisung auslösen (einmal durch Abfrage) wie Oracle. Es handelt sich eher um ein leistungsbezogenes Problem als um ein wirklich fehlendes Feature

TRIGGER ERSTELLEN ODER ERSETZEN

Das CREATE OR REPLACE wird von MySQL nicht unterstützt

MySQL erlaubt diese Syntax nicht, Sie müssen stattdessen Folgendes verwenden:

DELIMITER $$

DROP TRIGGER IF EXISTS myTrigger;
$$
CREATE TRIGGER myTrigger
-- ...

$$
DELIMITER ;

Seien Sie vorsichtig, dies ist keine atomare Transaktion :

  • Sie verlieren den alten Auslöser, wenn CREATE fehlschlägt
  • LOCK TABLES myTable WRITE; Last können andere Operationen zwischen DROP und CREATE werden. Verwenden Sie LOCK TABLES myTable WRITE; zuerst, um Dateninkonsistenz und UNLOCK TABLES; zu vermeiden UNLOCK TABLES; nach dem CREATE , um die Tabelle freizugeben

Grundauslöser

Tabelle erstellen

mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
Query OK, 0 rows affected (0.03 sec)

Trigger erstellen

mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
    -> FOR EACH ROW SET @sum = @sum + NEW.amount;
Query OK, 0 rows affected (0.06 sec)

Die CREATE TRIGGER-Anweisung erstellt einen Auslöser mit dem Namen ins_sum, der der Kontentabelle zugeordnet ist. Sie enthält auch Klauseln, die die Auslöseraktionszeit, das auslösende Ereignis und die Vorgehensweise bei der Aktivierung des Auslösers angeben

Wert einfügen

Um den Trigger zu verwenden, setzen Sie die Akkumulatorvariable (@sum) auf Null, führen Sie eine INSERT-Anweisung aus und sehen Sie dann, welchen Wert die Variable danach hat:

mysql> SET @sum = 0;
mysql> INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00);
mysql> SELECT @sum AS 'Total amount inserted';
+-----------------------+
| Total amount inserted |
+-----------------------+
| 1852.48               |
+-----------------------+

In diesem Fall ist der Wert von @sum nach der Ausführung der INSERT-Anweisung 14.98 + 1937.50 - 100 oder 1852.48.

Abzug auslösen

mysql> DROP TRIGGER test.ins_sum;

Wenn Sie eine Tabelle löschen, werden auch alle Auslöser für die Tabelle gelöscht.

Arten von Auslösern

Zeitliche Koordinierung

Es gibt zwei Modifikatoren für die Auslöseraktion:

  • BEFORE Trigger aktiviert wird, bevor die Anforderung ausgeführt wird.
  • AFTER Auslösen des Feuers nach der Änderung.

Auslöseereignis

Es gibt drei Ereignisse, an die Trigger angehängt werden können:

  • INSERT
  • UPDATE
  • DELETE

Vor dem Trigger-Beispiel einfügen

DELIMITER $$

CREATE TRIGGER insert_date 
    BEFORE INSERT ON stack
    FOR EACH ROW
BEGIN
        -- set the insert_date field in the request before the insert
    SET NEW.insert_date = NOW();
END;

$$
DELIMITER ;

Vor dem Update-Trigger-Beispiel

DELIMITER $$

CREATE TRIGGER update_date 
    BEFORE UPDATE ON stack
    FOR EACH ROW
BEGIN
        -- set the update_date field in the request before the update
    SET NEW.update_date = NOW();
END;

$$
DELIMITER ;

Nach dem Löschbeispiel

DELIMITER $$

CREATE TRIGGER deletion_date 
    AFTER DELETE ON stack
    FOR EACH ROW
BEGIN
        -- add a log entry after a successful delete
    INSERT INTO log_action(stack_id, deleted_date) VALUES(OLD.id, NOW());
END;

$$
DELIMITER ;


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow