Разница между триггерами FOR и AFTER?

120

В чем разница между FORи AFTERспусковой?

sqlchild
источник
5
+1: Я прочитал статью о триггерах в электронной документации по SQL Server и в итоге получил тот же вопрос
pfunk
Я нашел эту статью полезной: dotnettricks.com/learn/sqlserver/…
Мэтт,

Ответы:

154

Нет никакой разницы, они делают то же самое.

CREATE TRIGGER trgTable on dbo.Table FOR INSERT,UPDATE,DELETE

Такой же как

CREATE TRIGGER trgTable on dbo.Table AFTER INSERT,UPDATE,DELETE

INSTEAD OFТриггер отличается, и срабатывает перед и вместо вставки и может быть использован на представлениях, для того , чтобы вставить соответствующие значения в базовых таблицы.

Бен
источник
14
Мне понравился комментарий о вставках в представления с использованием триггеров. Очень полезная информация. Приветствия.
Мариуш
Простите, мистер @Ben, какой сценарий нужно вставить в представление? Спасибо ^ - ^
Jeancarlo Fontalvo 09
@JeancarloFontalvo, 1) совместимость. Базовые таблицы могут измениться при условии, что представление останется прежним. 2) контроль доступа, определенные пользователи могут иметь разрешение на запись только в определенные столбцы.
Бен
17

@Ben абсолютно прав.

Вот статья MSDN Изучение триггеров SQL Server

Абзац из статьи:

Этот синтаксис также приемлем в более старых версиях SQL Server. Однако теперь, когда в SQL Server 2000 есть два типа триггеров, я предпочитаю называть триггеры FOR триггерами AFTER. Таким образом, в оставшейся части этой статьи я буду ссылаться на триггеры AFTER или INSTEAD OF.

Как и триггер AFTER, который вы видели ранее, этот триггер предотвращает внесение изменений в поле фамилии. Однако это бизнес-правило реализуется иначе, чем в предыдущем примере. Поскольку триггер INSTEAD OF срабатывает вместо оператора UPDATE, триггер INSTEAD OF затем оценивает, прошел ли тест бизнес-правила или нет. Если проверка бизнес-правила прошла успешно, для того, чтобы обновление произошло, триггер INSTEAD OF должен снова явно вызвать оператор UPDATE.

Waqas Raja
источник
4

AFTER указывает, что триггер DML запускается только тогда, когда все операции, указанные в запускающем операторе SQL, выполнены успешно. Все ссылочные каскадные действия и проверки ограничений также должны быть успешными, прежде чем сработает этот триггер. AFTER - это значение по умолчанию, если указано единственное ключевое слово FOR.

Триггеры AFTER не могут быть определены для представлений.

INSTEAD OF Указывает, что триггер DML выполняется вместо запускающего оператора SQL, таким образом, переопределяя действия запускающих операторов. INSTEAD OF нельзя указать для DDL или триггеров входа в систему.

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql

Нур Эль-Хода
источник
1
Эта фраза «ПОСЛЕ» используется по умолчанию, когда указано единственное ключевое слово FOR ». очень сбивает с толку. Они могли бы сформулировать это лучше.
FMFF