web-dev-qa-db-fra.com

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

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, en tant qu'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 tirait malgré qu'aucune rangée n'était insérée.

Le langage utilisé dans les 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 dans les SGBD? Y a-t-il une raison particulière de déclencher un déclencheur lorsqu'aucune ligne n'est affectée?

10

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 feu lorsqu'un INSERT / UPDATE / DELETE l'instruction 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).

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.


* Serveur SQL CREATE TRIGGER docs état:

Les déclencheurs DML s'exécutent lorsqu'un utilisateur tente de modifier des données via un événement DML (Data Manipulation Language). Les événements DML sont des instructions INSERT, UPDATE ou DELETE 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 ou non affectées.

24
ypercubeᵀᴹ