Maison > base de données > tutoriel mysql > Comment puis-je empêcher les déclencheurs récursifs dans SQL Server ?

Comment puis-je empêcher les déclencheurs récursifs dans SQL Server ?

DDD
Libérer: 2024-12-31 14:19:14
original
625 Les gens l'ont consulté

How Can I Prevent Recursive Triggers in SQL Server?

Prévention des déclencheurs récursifs dans SQL Server

Dans SQL Server 2008, un déclencheur sur la table tblMedia, [dbo].[tblMediaAfterInsertOrUpdate], provoque par inadvertance un comportement récursif. Ce comportement se produit lorsque le déclencheur est à la fois déclenché et se déclenche ensuite lui-même.

Pour comprendre le problème, examinons le déclencheur :

ALTER TRIGGER [dbo].[tblMediaAfterInsertOrUpdate]
ON [dbo].[tblMedia]
BEFORE INSERT, UPDATE
AS
BEGIN
    ...
Copier après la connexion

Après l'insertion ou la mise à jour : Le déclencheur est exécuté avant que les insertions ou les mises à jour ne soient validées.

Récursion potentielle : L'instruction de mise à jour à l'intérieur du trigger tente de modifier la table tblMedia. Cette modification pourrait potentiellement déclencher à nouveau le même déclencheur, conduisant à une boucle infinie.

Prévenir la récursion : Pour éviter ce comportement récursif, nous pouvons utiliser la fonction TRIGGER_NESTLEVEL() pour vérifier le niveau d'imbrication du déclencheur. Si le niveau d'imbrication est supérieur à 1, le déclencheur est invoqué par un autre déclencheur et doit être ignoré.

ALTER TRIGGER [dbo].[tblMediaAfterInsertOrUpdate]
ON [dbo].[tblMedia]
BEFORE INSERT, UPDATE
AS
BEGIN
    IF TRIGGER_NESTLEVEL() <= 1 /* Prevent recursion */
    BEGIN
        ...
    END
END
Copier après la connexion

Explication :

  • Le TRIGGER_NESTLEVEL () renvoie le nombre de niveaux de déclenchement imbriqués. Si le déclencheur actuel est le déclencheur le plus externe (le premier à être exécuté), le niveau d'imbrication sera 1.
  • Si le niveau d'imbrication est supérieur à 1, le déclencheur est invoqué par un autre déclencheur et doit être ignoré pour éviter la récursion.
  • Si le niveau d'imbrication est 1, le déclencheur n'est pas invoqué de manière récursive et peut poursuivre son action normale exécution.

En incorporant cette vérification dans le déclencheur, nous l'empêchons de se répéter indéfiniment et garantissons que les modifications de données nécessaires ne sont effectuées qu'une seule fois.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal