Dispare disparando a pesar de que no haya filas afectadas

10

Esta es una pregunta más general, pero la motivación para esta pregunta fue un problema que enfrenté al usar SQL Server.

Tengo este desencadenante adjunto a un evento Insertar en una tabla que contiene cierta lógica que, como efecto secundario, generaría un error si no se insertaran filas. Tras una investigación adicional, descubrí que el gatillo estaba disparando a pesar de que no se insertaron filas.

El lenguaje utilizado en Microsoft Docs en DML Triggers parece contradecir este comportamiento:

Los activadores DML son un tipo especial de procedimiento almacenado que surte efecto automáticamente cuando se produce un evento DML que afecta la tabla o vista definida en el activador.

¿Es este un comportamiento predeterminado en los DBMS? ¿Hay alguna razón particular para disparar un disparador cuando no hay filas afectadas?

Luís Gabriel de Andrade
fuente

Respuestas:

24

Para las acciones DML, hay activadores basados ​​en filas y en declaraciones.

  • La fila dispara cuando (antes, después o en lugar de) cada fila se ve afectada (insertada / actualizada / eliminada). Por lo tanto, se dispararán 100 veces si se ven afectadas 100 filas y nada si se ven afectadas 0 filas.

  • La declaración activa el disparo cuando INSERT / UPDATE / DELETEse ejecuta una declaración No importa si no hay filas afectadas. El nivel de declaración activa el disparo de todos modos y solo una vez para una declaración (ya sea 0, 100 o mil millones de filas afectadas).

Algunos DBMS solo tienen activadores de nivel de fila (MySQL).

Otros (como SQL Server *, que es su DBMS) solo tienen activadores de nivel de instrucción.

Algunos otros (DB2, Oracle, Postgres) tienen ambos tipos de disparadores.


* Estado de CREATE TRIGGERdocumentos de SQL Server :

Los activadores DML se ejecutan cuando un usuario intenta modificar datos a través de un evento de lenguaje de manipulación de datos (DML). Los eventos DML son INSERT, UPDATEo DELETEdeclaraciones en una tabla o vista. Estos disparadores se activan cuando se activa cualquier evento válido, independientemente de si las filas de la tabla se ven afectadas o no.

ypercubeᵀᴹ
fuente