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 le DROP et le CREATE , utilisez un LOCK TABLES myTable WRITE; tout d'abord pour éviter les incohérences de données et UNLOCK TABLES; après le CREATE 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 ;


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow