В следующем коде демонстрируется создание триггера UPDATE updtProductReviewна таблице Production.ProductReviewбазы данныхAdventureWorks.
CREATE TRIGGER [updtProductReview] ON [Production].[ProductReview]
AFTER UPDATE NOT FOR REPLICATION AS
BEGIN
SET NOCOUNT ON;
UPDATE [Production].[ProductReview]
SET [Production].[ProductReview].[ModifiedDate] = GETDATE()
FROM inserted
WHERE inserted.[ProductReviewID] =
[Production].[ProductReview].[ProductReviewID];
Как работает триггер INSTEAD OF (ВМЕСТО)
Триггер INSTEAD OF выполняется вместо обычного действия триггера. Триггеры INSTEAD OF могут также быть определены на представлениях с одной или более базовыми таблицами, где они могут расширить действия операторов обновления, поддерживаемые представлениями.
Как работает триггер INSTEAD OF (ВМЕСТО)
Этот триггер выполняется вместо исходного действия триггера. Триггеры INSTEAD OF увеличивают разнообразие типов обновлений, которые Вы можете выполнить с представлениями. Каждая таблица или представление ограничено одним триггером INSTEAD OF для каждого триггерного действия (INSERT, UPDATE, или DELETE).
Вы можете определить триггер INSTEAD OF и на таблицах и на представлениях. Вы не можете создать триггер INSTEAD OF на представлениях, которые имеют опцию WITH CHECK OPTION.
В следующем списке в общих чертах приводятся главные преимущества INSTEAD OF триггеров:
■ Они позволяют представлениям, включающим множество базовых таблиц, поддерживать вставки, обновления, и удаления данных этих таблиц.
■ Они позволяют Вам кодировать логику, которая может отклонить часть пакета, позволяя успешно выполниться другой части пакета.
■ Они позволяют Вам определять альтернативное действие базы данных в ситуациях, отвечающих указанным условиям.
В следующем коде демонстрируется создание триггера INSTEAD OF delEmployeeна таблице HumanResources.Employeeбаза данныхAdventureWorks.
CREATE TRIGGER [delEmployee] ON [HumanResources].[Employee]
INSTEAD OF DELETE NOT FOR REPLICATION AS
BEGIN
SET NOCOUNT ON;
DECLARE @DeleteCount int;
SELECT @DeleteCount = COUNT(*) FROM deleted;
IF @DeleteCount > 0
BEGIN
RAISERROR
(N'Employees cannot be deleted. They can only be marked as not
current.', -- Message
10, -- Severity.
1); -- State.
-- Roll back any active or uncommittable transactions