MySQL
TRIGGERS
Recherche…
Syntaxe
- CREATE [DEFINER = {utilisateur | CURRENT_USER}] TRIGGER trigger_name trigger_time trigger_event ON nom_de_table POUR CHAQUE ROW [trigger_order] trigger_body
- trigger_time: {AVANT | APRÈS }
- trigger_event: {INSERT | Mise à jour | EFFACER }
- trigger_order: {suit | PRECEDES} other_trigger_name
Remarques
Deux points doivent attirer votre attention si vous utilisez déjà des déclencheurs sur d'autres bases de données:
POUR CHAQUE RANG
FOR EACH ROW
est une partie obligatoire de la syntaxe
Vous ne pouvez pas déclencher une instruction (une fois par requête) comme Oracle. C'est plus un problème de performance qu'une véritable fonctionnalité manquante
Créer ou remplacer un déclencheur
Le CREATE OR REPLACE
n'est pas supporté par MySQL
MySQL n'autorise pas cette syntaxe, vous devez plutôt utiliser les éléments suivants:
DELIMITER $$
DROP TRIGGER IF EXISTS myTrigger;
$$
CREATE TRIGGER myTrigger
-- ...
$$
DELIMITER ;
Attention, ce n’est pas une transaction atomique :
- vous perdrez l'ancien déclencheur si le
CREATE
échoue - sur une charge lourde, d'autres opérations peuvent se
LOCK TABLES myTable WRITE;
entre leDROP
et leCREATE
, utilisez unLOCK TABLES myTable WRITE;
tout d'abord pour éviter les incohérences de données etUNLOCK TABLES;
après leCREATE
pour libérer la table
Déclencheur de base
Créer une table
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
Query OK, 0 rows affected (0.03 sec)
Créer un déclencheur
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)
L'instruction CREATE TRIGGER crée un déclencheur nommé ins_sum associé à la table de compte. Il comprend également des clauses spécifiant le temps d'action du déclencheur, l'événement déclencheur et les actions à entreprendre lorsque le déclencheur est activé.
Insérer une valeur
Pour utiliser le déclencheur, définissez la variable d'accumulateur (@sum) sur zéro, exécutez une instruction INSERT, puis vérifiez la valeur de la variable:
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 |
+-----------------------+
Dans ce cas, la valeur de @sum après l'exécution de l'instruction INSERT est 14.98 + 1937.50 - 100 ou 1852.48.
Déclencheur de chute
mysql> DROP TRIGGER test.ins_sum;
Si vous déposez une table, tous les déclencheurs de la table sont également supprimés.
Types de déclencheurs
Timing
Il existe deux modificateurs de temps d’action du déclencheur:
-
BEFORE
déclencheur ne s'active avant d'exécuter la requête, -
AFTER
déclenchement du tir après le changement.
Événement déclencheur
Trois déclencheurs peuvent être associés à trois événements:
-
INSERT
-
UPDATE
-
DELETE
Avant Insérer exemple de déclenchement
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 ;
Avant mise à jour exemple de déclenchement
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 ;
Après Supprimer exemple de déclenchement
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 ;