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
DDDoriginal
2024-12-31 14:19:14630parcourir

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
    ...

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

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!

Déclaration:
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