Compréhension approfondie des déclencheurs MySQL

Compréhension de base:

1. Utilisez occasion:

Les déclencheurs sont basés sur des événements, et l'événement principal est l'ajout, la suppression et la modification de MySQL, à savoir l'insertion, la suppression et la mise à jour.

2. Dénomination du déclencheur

Les noms de déclencheurs existent dans l'espace de noms de schéma, ce qui signifie que tous les déclencheurs doivent avoir des noms uniques dans un schéma. Les déclencheurs dans différents schémas peuvent avoir le même nom.

Étant donné que le déclencheur se trouve dans l'espace de noms d'une seule table, le nom du déclencheur de la même table doit être différent. Différentes tables peuvent avoir le même nom de déclencheur.

3. Déclencher l'ordre d'exécution

S'il existe le même déclencheur de mise à jour (ou suppression, insertion), il sera exécuté en fonction de l'heure de création.

Et FOLLOWS et PRECEDES peuvent modifier l'ordre d'exécution du déclencheur

Par exemple, le cas officiel:

mysql> CREATE TRIGGER ins_transaction AVANT D'INSERER SUR le compte

      POUR CHAQUE RANG PRÉCÈDE ins_sum

      ENSEMBLE

      @deposits = @deposits + IF (NEW.amount> 0, NEW.amount, 0),

      @withdrawals = @withdrawals + IF (NEW.amount <0, -NEW.amount, 0);

Requête OK, 0 lignes affectées (0,01 sec)

ins_transaction et ins_sum sont les noms des deux déclencheurs.

4. Le rôle du déclencheur :

1. Sécurité. L'utilisateur peut avoir certains droits pour exploiter la base de données en fonction de la valeur de la base de données.

1) Le fonctionnement de l'utilisateur peut être limité en fonction du temps, par exemple, il n'est pas autorisé de modifier les données de la base de données après le travail et les vacances.

2) L'opération de l'utilisateur peut être restreinte en fonction des données de la base de données, par exemple, le montant d'achat d'un seul produit n'est pas autorisé à être supérieur à une valeur fixe.

2. Audit. Peut suivre les opérations des utilisateurs sur la base de données. 

 1) Audit des déclarations de la base de données des opérations utilisateur.

 2) Écrivez les mises à jour des utilisateurs dans la base de données dans la table d'audit.

Je ne l'ai pas utilisé depuis que je ne l'ai pas utilisé, je l'ajouterai plus tard.

3. Mettre en œuvre des règles d'intégrité des données complexes

Implémentez des contrôles et des contraintes d'intégrité des données non standard. Les déclencheurs peuvent produire des restrictions plus complexes que les règles. Contrairement aux règles, les déclencheurs peuvent référencer des colonnes ou des objets de base de données. Par exemple, un déclencheur peut annuler tous les contrats à terme qui tentent de manger plus que sa propre marge.

4. Implémentez des règles d'intégrité liées aux bases de données non standard complexes .

1) Les déclencheurs peuvent mettre à jour les tables liées en série dans la base de données. Il s'agit d'une fonction de réalisation plus fréquemment utilisée.

2) Le déclencheur peut rejeter ou annuler les modifications qui nuisent à l'intégrité pertinente et annuler la transaction qui tente de mettre à jour les données. Ce type de déclencheur fonctionne lors de l'insertion d'une clé externe qui ne correspond pas à sa clé primaire.

Dans l'exemple suivant, je décrirai ces deux fonctionnalités plus en détail.

5. Synchronisez les données de la table en temps réel.

6. Calculez automatiquement la valeur des données, si la valeur des données répond à certaines exigences, puis effectuez un traitement spécifique.

Par exemple, si les fonds sur le compte de l'entreprise sont inférieurs à 50 000 yuans, envoyez immédiatement des données d'avertissement au personnel financier.

( 1 ) Insérer des données:

Lorsqu'un utilisateur ajoute une commande, nous devons apporter des modifications correspondantes au stockage dans la table des produits

mysql> créer shop_goods de déclenchement
     -> après insertion sur shoppingcar
     -> pour chaque rangée
     -> produits de mise à jour fixé storage = storage-new.amount où id = new.g_id
     -> ; 
Requête OK, 0 lignes affectées ( 0,03 sec) 

mysql > insérer dans les valeurs shoppingcar (1,1,2);

Résultats de la requête:

marchandises 表
 + ------- + --------- + ------------- + --------- + 
| id | gname | description | stockage | 
+ ------- + --------- + ---------- - + --------- + 
| 1 | huawei | rongyao9 | 198 | 
| 2 | iphone | iphoneX | 100 | 
+ ------- + --------- + ------------- + --------- + 

shoppingcar 表
 + ---- - - + ----- - + -------- + 
| u_id | g_id | montant | 
+ ------- + ------- + -------- + 
| 1 | 1 | 2 | 
+ ------- + ------- + -------- +

À propos de l'utilisation des nouveaux et anciens

new représente une nouvelle ligne de données et old représente une ancienne ligne de données

( 2 ) Supprimer les données

Par exemple, lorsqu'un utilisateur annule une commande, nous devons rajouter la quantité de marchandises

mysql> create trigger shop_good1
     -> après suppression sur shoppingcar
     -> pour chaque ligne
     -> produits de mise à jour = stockage mis en stockage + old.amount où id = old.g_id; 
Requête OK, 0 lignes affectées ( 0,01 sec)
删除 前 :
mysql > sélectionnez * parmi les marchandises;
+ ----- + --------- + ------------- + --------- + 
| id | gname | description | stockage | 
+ ----- + --------- + ------------- + --------- + 
| 1 | huawei | rongyao9 | 198 | 
| 2 | iphone | iphoneX | 100 | 
+ ----- + --------- + ------------- + --------- + 
2 lignes dans l' ensemble (0,00 sec) 


mysql > sélectionnez * dans le panier;
+ ------ + ------ + -------- + 
| u_id | g_id | montant | 
+ ------ + ------ + -------- + 
| 1 | 1 | 2 | 
+ ------ + ------ + -------- + 
1 lignes dans l' ensemble (0,00 sec)
Supprimer les données: 
mysql > supprimer de la voiture où g_id = 1 ; 
requête OK, 1 ligne affectée (0,03 sec)

Le résultat:

( 3 ) Mettre à jour les données (peut augmenter ou diminuer)

Lorsque l'utilisateur souhaite modifier la quantité d'un certain produit acheté en modifiant la quantité du panier, notre inventaire doit également être modifié.

mysql> créer un déclencheur shop_good2
     -> après la mise à jour sur shoppingcar
     -> pour chaque ligne
     -> mettre à jour le jeu de marchandises storage = storage-new.amount + old.amount où id = new.g_id / old.g_id ; 
Requête OK, 0 lignes affectées ( 0,14 sec)

Afficher les commandes de déclenchement

afficher les déclencheurs

Cette commande ne peut voir que les déclencheurs, mais pas les informations spécifiques des déclencheurs.

Toutes les informations sur les déclencheurs sont stockées dans la table des déclencheurs sous la base de données information_schema et peuvent être interrogées à l'aide des instructions SELECT. S'il existe de nombreux déclencheurs, il est préférable d'interroger un certain déclencheur via le champ TRIGGER_NAME.

Par exemple:

SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME = 'XXX';

(4) Restrictions

Les restrictions conditionnelles sont très importantes pour certaines occasions impliquant des montants (tels que mentionnés dans le premier paragraphe), et seront également appliquées dans le montant des restrictions d'achat sur le commerce électronique.

Le déclencheur utilise des délimiteurs, des blocs begin et if pour atteindre les conditions limites.

例如 :
mysql > délimiteur //            
mysql > créer un déclencheur shop_limit avant la mise à jour sur shoppingcar
     -> pour chaque ligne
     -> commencer
     ->    si new.amount> 3 puis
     -> set new.amount = 3 ;
    -> elseif new.amount < 0 puis
     -> set new.amount = 0;
    -> fin si ;
    -> fin; // 
mysql > délimiteur;

Les blocs d'instructions conditionnelles sont encapsulés avec début et fin

délimiteur: changez le caractère de fin, car; est le caractère de fin par défaut dans MySQL, si le symbole apparaît dans le bloc de programme, cela provoquera un conflit. Enfin, le terminateur doit être modifié en arrière. Notez qu'il y a un espace entre le délimiteur et le terminateur, sinon il ne sera pas possible de commuter.

Avant de mettre à jour les données:

Mettre à jour les données:

mysql> update shoppingcar set amount = 4 where u_id = 1 ; 
Requête OK, 1 ligne affectée (0,02 sec) 
Lignes correspondantes: 1 Modifiées: 1 Avertissements: 0

Après la mise à jour des données:

Le volume d'achat ne peut pas dépasser 3

À propos des déclencheurs et des transactions

Pour la table de transactions (Innodb), l' échec de l'instruction de jugement après l'instruction précédente entraînera l' annulation de toutes les modifications exécutées par l' instruction d'événement . L'échec du déclencheur entraînera l'échec de l'instruction, donc l'échec du déclencheur entraînera également une restauration. Pour les tables non transactionnelles (MyISAM), ce type de restauration ne peut pas être effectué, donc malgré l'échec de l'instruction, toutes les modifications effectuées avant le point d'erreur sont toujours valides.

Restrictions sur l'utilisation des déclencheurs

Le déclencheur a certaines limites:

1. Les déclencheurs ne peuvent pas utiliser l'instruction CALL pour renvoyer des données au client ou utiliser des procédures stockées SQL dynamiques. Cependant, la procédure stockée est autorisée à renvoyer des données au déclencheur via les paramètres OUT ou INOUT.

2. Trigger ne peut pas utiliser les instructions liées aux transactions, telles que START TRANSACTION, COMMIT ou ROLLBACK. Étant donné que le processus de déclenchement met à jour, supprime, insère et d'autres événements, et les exécute dans l'ordre d'avant, instruction SQL, et après, une fois qu'une certaine étape se passe mal, les données seront annulées. Si des transactions sont utilisées dans des déclencheurs, des conflits surviendront.

Je suppose que tu aimes

Origine www.linuxidc.com/Linux/2020-04/162980.htm
conseillé
Classement