Запуск стрельбы, несмотря на то, что ряды не затронуты

10

Это более общий вопрос, но мотивация для этого вопроса была проблемой, с которой я столкнулся при использовании SQL Server.

У меня есть этот триггер, присоединенный к событию Вставка в таблице, которая содержит некоторую логику, которая, как побочный эффект, вызвала бы ошибку, если бы не было вставлено ни одной строки. После дальнейшего расследования я обнаружил, что курок срабатывает, несмотря на то, что не было вставлено ни одной строки.

Язык, используемый в Документах Microsoft по триггерам DML, кажется, противоречит этому поведению:

Триггеры DML - это особый тип хранимых процедур, которые автоматически вступают в силу, когда происходит событие DML, которое влияет на таблицу или представление, определенные в триггере.

Это поведение по умолчанию в СУБД? Есть ли особая причина для запуска триггера, когда строки не затрагиваются?

Луис Габриэль де Андраде
источник

Ответы:

24

Для действий DML существуют триггеры на основе строк и операторов.

  • Строки запускаются, когда (до, после или вместо) затрагивается каждая строка (вставлена ​​/ обновлена ​​/ удалена). Таким образом, они будут запускаться 100 раз, если затронуто 100 строк, и совсем не так, если затронуто 0 строк.

  • Оператор вызывает срабатывание при выполнении INSERT / UPDATE / DELETEоператора. Неважно, если строки не затронуты. Триггеры уровня оператора срабатывают в любом случае и только один раз для оператора (будь то затронутые 0, 100 или миллиард строк).

Некоторые СУБД имеют только триггеры уровня строки (MySQL).

Другие (например, SQL Server *, который является вашей СУБД) имеют только триггеры уровня операторов.

Некоторые другие (DB2, Oracle, Postgres) имеют оба вида триггеров.


* Состояние CREATE TRIGGERдокументов SQL Server :

Триггеры DML выполняются, когда пользователь пытается изменить данные с помощью события языка манипулирования данными (DML). DML события INSERT, UPDATEили DELETEзаявления на таблицы или представления. Эти триггеры срабатывают при срабатывании любого действительного события независимо от того, затронуты ли какие-либо строки таблицы.

ypercubeᵀᴹ
источник