Триггер INSTEAD OF срабатывает вместо операции с данными. Он определяется в принципе также, как триггер AFTER, за тем исключением, что он может определяться только для одной операции - INSERT, DELETE или UPDATE. И также он может применяться как для таблиц, так и для представлений (триггер AFTER применяется только для таблиц).
Например, создадим следующие базу данных и таблицу:
1
2
3
4
5
6
7
8
9
10
11
| CREATE DATABASE prods; GO USE prods; CREATE TABLE Products ( Id INT IDENTITY PRIMARY KEY , ProductName NVARCHAR(30) NOT NULL , Manufacturer NVARCHAR(20) NOT NULL , Price MONEY NOT NULL , IsDeleted BIT NULL ); |
Здесь таблица содержит столбец IsDeleted, который указывает, удалена ли запись. То есть вместо жесткого удаления полностью из базы данных мы хотим выполнить мягкое удаление, при котором запись остается в базе данных.
Определим триггер для удаления записи:
1
2
3
4
5
6
7
8
9
| USE prods GO CREATE TRIGGER products_delete ON Products INSTEAD OF DELETE AS UPDATE Products SET IsDeleted = 1 WHERE ID =( SELECT Id FROM deleted) |
Добавим некоторые данные в таблицу и выполним удаление из нее:
1
2
3
4
5
6
7
8
9
10
| USE prods; INSERT INTO Products(ProductName, Manufacturer, Price) VALUES ( 'iPhone X' , 'Apple' , 79000), ( 'Pixel 2' , 'Google' , 60000); DELETE FROM Products WHERE ProductName= 'Pixel 2' ; SELECT * FROM Products; |
Таким образом, удаляемые записи на самом деле не будут удаляться, просто у них будет устанавливаться значение для столбца IsDeleted: