Стрільба тригера, незважаючи на жодні рядки


10

Це більше загальне питання, але мотивація цього питання була проблемою, з якою я зіткнувся під час використання SQL Server.

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

Мова, що використовується в документах Microsoft Docs на триггерах 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заяви на таблиці або подання. Ці тригери спрацьовують, коли спрацьовує будь-яка дійсна подія, незалежно від того, впливають чи не будь-які рядки таблиці.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.