MySQL
TRIGGERS
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 deCREATE
, gebruik eenLOCK TABLES myTable WRITE;
eerst om inconsistentie van gegevens te voorkomen enUNLOCK TABLES;
na hetCREATE
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 ;