Zoeken…


Syntaxis

  • CREATE [DEFINER = {user | CURRENT_USER}] TRIGGER trigger_name trigger_time trigger_event ON tbl_name VOOR ELKE RIJ [trigger_order] trigger_body
  • trigger_time: {VOORDAT | NA }
  • trigger_event: {INSERT | UPDATE | VERWIJDEREN}
  • trigger_order: {FOLLOWS | PRECEDES} other_trigger_name

Opmerkingen

Twee punten moeten uw aandacht trekken als u al triggers op andere DB gebruikt:

VOOR ELKE RIJ

FOR EACH ROW is een verplicht onderdeel van de syntaxis

U kunt een statement- trigger (eenmaal per query) niet zoals Oracle doen. Het is meer een probleem met de prestaties dan een echte ontbrekende functie

CREËER OF VERVANG TRIGGER

CREATE OR REPLACE wordt niet ondersteund door MySQL

MySQL staat deze syntaxis niet toe, u moet in plaats daarvan het volgende gebruiken:

DELIMITER $$

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

$$
DELIMITER ;

Wees voorzichtig, dit is geen atomaire transactie :

  • je verliest de oude trigger als CREATE mislukt
  • bij een zware belasting kunnen andere bewerkingen plaatsvinden tussen de DROP en de CREATE , gebruik een LOCK TABLES myTable WRITE; eerst om inconsistentie van gegevens te voorkomen en UNLOCK TABLES; na het CREATE om de tabel vrij te geven

Basic Trigger

Maak een tabel

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

Maak een trigger

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)

De instructie CREATE TRIGGER maakt een trigger met de naam ins_sum die aan de accounttabel is gekoppeld. Het bevat ook clausules die de activeringstijd van de trigger, de activeringsgebeurtenis en wat te doen wanneer de trigger wordt geactiveerd specificeren

Waarde invoegen

Om de trigger te gebruiken, stelt u de accumulatievariabele (@sum) in op nul, voert u een INSERT-instructie uit en bekijkt u vervolgens welke waarde de variabele achteraf heeft:

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 dit geval is de waarde van @sum nadat de INSERT-instructie is uitgevoerd 14.98 + 1937.50 - 100 of 1852.48.

Drop Trigger

mysql> DROP TRIGGER test.ins_sum;

Als u een tabel neerzet, worden alle triggers voor de tabel ook verwijderd.

Soorten triggers

timing

Er zijn twee activeringsmodificaties voor activering:

  • BEFORE trigger wordt geactiveerd voordat het verzoek wordt uitgevoerd,
  • AFTER trigger vuur na verandering.

Triggering event

Er zijn drie gebeurtenissen waaraan triggers kunnen worden gekoppeld:

  • INSERT
  • UPDATE
  • DELETE

Vóór het trigger-voorbeeld invoegen

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 ;

Voor update trigger voorbeeld

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 ;

Na Verwijderen trigger voorbeeld

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow