Attiva il fuoco nonostante non siano interessate le file


10

Questa è una domanda più generale, ma la motivazione di questa domanda è stata un problema che ho riscontrato durante l'utilizzo di SQL Server.

Ho questo trigger collegato a un evento Insert su una tabella che contiene una logica che, come effetto collaterale, genererebbe un errore se non fossero inserite righe. Dopo ulteriori indagini, ho scoperto che il grilletto stava sparando nonostante nessuna riga fosse inserita.

Il linguaggio utilizzato in Microsoft Docs sui trigger DML sembra contraddire questo comportamento:

I trigger DML sono un tipo speciale di stored procedure che ha effetto automaticamente quando si verifica un evento DML che influisce sulla tabella o sulla vista definita nel trigger.

È un comportamento predefinito tra i DBMS? C'è un motivo particolare per attivare un trigger quando non sono interessate righe?

Risposte:


24

Per le azioni DML, esistono trigger basati su righe e istruzioni.

  • La riga attiva il fuoco quando (prima, dopo o invece di) ogni riga è interessata (inserita / aggiornata / eliminata). Quindi spareranno 100 volte se sono interessate 100 righe e per niente se ne sono interessate 0.

  • L'istruzione attiva il fuoco quando INSERT / UPDATE / DELETEviene eseguita un'istruzione. Non importa se nessuna riga è interessata. Il livello di istruzione attiva comunque il fuoco e solo una volta per un'istruzione (sia 0, 100 o un miliardo di righe interessate).

Alcuni DBMS hanno solo trigger a livello di riga (MySQL).

Altri (come SQL Server * che è il tuo DBMS) hanno solo trigger a livello di istruzione.

Alcuni altri (DB2, Oracle, Postgres) hanno entrambi i tipi di trigger.


* Stato dei CREATE TRIGGERdocumenti di SQL Server :

I trigger DML vengono eseguiti quando un utente tenta di modificare i dati tramite un evento DML (data manipulation language). Gli eventi DML sono INSERT, UPDATEo DELETEistruzioni su una tabella o vista. Questi trigger si attivano quando viene generato un evento valido, indipendentemente dal fatto che siano interessate o meno le righe della tabella.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.