Wyzwalanie wyzwalania pomimo braku wpływu na rzędy

10

To jest bardziej ogólne pytanie, ale motywacją tego pytania był problem, który napotkałem podczas korzystania z SQL Server.

Mam ten wyzwalacz dołączony do zdarzenia Insert w tabeli, która zawiera pewną logikę, która jako efekt uboczny spowodowałaby błąd, gdyby nie wstawiono żadnych wierszy. Po dalszym dochodzeniu odkryłem, że spust uruchamia się pomimo braku wstawienia wierszy.

Język używany w Dokumentach Microsoft na temat wyzwalaczy DML wydaje się zaprzeczać takiemu zachowaniu:

Wyzwalacze DML to specjalny rodzaj procedury składowanej, która automatycznie działa, gdy ma miejsce zdarzenie DML, które wpływa na tabelę lub widok zdefiniowany w wyzwalaczu.

Czy jest to domyślne zachowanie w DBMS? Czy istnieje szczególny powód, aby uruchomić spust, gdy nie ma to wpływu na rzędy?

Luís Gabriel de Andrade
źródło

Odpowiedzi:

24

W przypadku akcji DML istnieją wyzwalacze oparte na wierszach i instrukcjach.

  • Wyzwalanie wiersza jest uruchamiane, gdy (przed, po lub zamiast) dotyczy każdego wiersza (wstawiony / zaktualizowany / usunięty). Więc wystrzelą 100 razy, jeśli wpłynie to na 100 rzędów, a wcale nie, jeśli wpłynie to na 0 rzędów.

  • Instrukcja uruchamia ogień, gdy INSERT / UPDATE / DELETEinstrukcja jest wykonywana. Nie ma znaczenia, czy nie ma to wpływu na wiersze. Poziom instrukcji i tak wyzwala ogień i tylko raz dla instrukcji (niezależnie od tego, czy dotyczy to 0, 100 czy miliarda wierszy).

Niektóre DBMS mają tylko wyzwalacze na poziomie wiersza (MySQL).

Inne (jak SQL Server *, który jest Twoim DBMS) mają tylko wyzwalacze poziomu instrukcji.

Niektóre inne (DB2, Oracle, Postgres) mają oba rodzaje wyzwalaczy.


* Stan CREATE TRIGGERdokumentacji SQL Server :

Wyzwalacze DML są wykonywane, gdy użytkownik próbuje zmodyfikować dane za pomocą zdarzenia języka manipulacji danymi (DML). Zdarzenia DML to INSERT, UPDATElub DELETEinstrukcje w tabeli lub widoku. Te wyzwalacze są uruchamiane po uruchomieniu dowolnego ważnego zdarzenia, niezależnie od tego, czy ma to wpływ na wiersze tabeli.

ypercubeᵀᴹ
źródło