Déclencher le tir malgré qu'aucune ligne ne soit affectée

10

Il s'agit plus d'une question générale, mais la motivation de cette question était un problème que j'ai rencontré lors de l'utilisation de SQL Server.

J'ai ce déclencheur attaché à un événement Insert sur une table qui contient une logique qui, comme effet secondaire, déclencherait une erreur si aucune ligne n'était insérée. Après une enquête plus approfondie, j'ai découvert que la gâchette était en train de tirer malgré qu'aucune rangée n'était insérée.

Le langage utilisé dans Microsoft Docs on DML Triggers semble contredire ce comportement:

Les déclencheurs DML sont un type spécial de procédure stockée qui prend automatiquement effet lorsqu'un événement DML se produit et affecte la table ou la vue définie dans le déclencheur.

S'agit-il d'un comportement par défaut entre les SGBD? Y a-t-il une raison particulière de déclencher un déclencheur lorsqu'aucune ligne n'est affectée?

Luís Gabriel de Andrade
la source

Réponses:

24

Pour les actions DML, il existe des déclencheurs basés sur des lignes et des instructions.

  • Les lignes déclenchent le déclenchement lorsque (avant, après ou au lieu de) chaque ligne est affectée (insérée / mise à jour / supprimée). Ils tireront donc 100 fois si 100 lignes sont affectées et pas du tout si 0 lignes sont affectées.

  • L'instruction déclenche le déclenchement lorsqu'une INSERT / UPDATE / DELETEinstruction est exécutée. Peu importe si aucune ligne n'est affectée. Les déclencheurs de niveau d'instruction se déclenchent quand même et une seule fois pour une instruction (que ce soit 0, 100 ou un milliard de lignes affectées).

Certains SGBD n'ont que des déclencheurs de niveau ligne (MySQL).

D'autres (comme SQL Server * qui est votre SGBD) n'ont que des déclencheurs de niveau instruction.

Certains autres (DB2, Oracle, Postgres) ont les deux types de déclencheurs.


* État des CREATE TRIGGERdocuments SQL Server :

Les déclencheurs DML s'exécutent lorsqu'un utilisateur essaie de modifier des données via un événement DML (Data Manipulation Language). Événements DML sont INSERT, UPDATEou des DELETEdéclarations sur une table ou une vue. Ces déclencheurs se déclenchent lorsqu'un événement valide est déclenché, que des lignes de table soient affectées ou non.

ypercubeᵀᴹ
la source