Sök…


Syntax

  • SKAPA [DEFINER = {användare | CURRENT_USER}] TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW [trigger_order] trigger_body
  • trigger_time: {FÖRE | EFTER }
  • trigger_event: {INSERT | UPPDATERING | DELETE}
  • trigger_order: {FOLLOWS | PRECEDES} other_trigger_name

Anmärkningar

Två punkter måste uppmärksamma dig om du redan använder triggers på andra DB:

FÖR VARJE RAD

FOR EACH ROW är en obligatorisk del av syntaxen

Du kan inte göra en uttalande trigger (en gång efter fråga) som Oracle gör. Det är mer en prestationsrelaterad fråga än en verklig saknad funktion

SKAPA ELLER Byt ut TRIGGER

CREATE OR REPLACE stöds inte av MySQL

MySQL tillåter inte denna syntax, du måste istället använda följande:

DELIMITER $$

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

$$
DELIMITER ;

Var försiktig, detta är inte en atomtransaktion :

  • du tappar den gamla utlösaren om CREATE misslyckas
  • på en tung belastning kan andra operationer inträffa mellan DROP och CREATE , använd LOCK TABLES myTable WRITE; först för att undvika UNLOCK TABLES; och UNLOCK TABLES; efter CREATE att släppa tabellen

Grundläggande utlösare

Skapa bord

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

Skapa triggare

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)

CREATE TRIGGER-uttalandet skapar en trigger som heter ins_sum som är associerad med kontotabellen. Den innehåller också klausuler som anger tidpunkten för utlösningsåtgärd, utlösningshändelse och vad man ska göra när utlösaren aktiveras

Infoga värde

För att använda avtryckaren ställer du in ackumulatorvariabeln (@sum) på noll, kör ett INSERT-uttalande och ser sedan vilket värde variabeln har efteråt:

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               |
+-----------------------+

I det här fallet är värdet på @sum efter INSERT-uttalandet 14,98 + 1937,50 - 100 eller 1852,48.

Drop Trigger

mysql> DROP TRIGGER test.ins_sum;

Om du tappar ett bord, släpps också alla triggers för tabellen.

Typer av utlösare

timing

Det finns två modifierare för utlösning av åtgärdstider:

  • BEFORE trigger aktiveras innan begäran körs,
  • AFTER utlösa brand efter byte.

Triggerande händelse

Det finns tre händelser som triggers kan kopplas till:

  • INSERT
  • UPDATE
  • DELETE

Innan du sätter in triggerexempel

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 ;

Exempel före uppdatering

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 ;

Efter Radera exempel

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow