Триггер INSTEAD OF
Триггер INSTEAD OF срабатывает вместо операции с данными. Он определяется в принципе также, как триггер AFTER, за тем исключением, что он может определяться только для одной операции - INSERT, DELETE или UPDATE. И также он может применяться как для таблиц, так и для представлений (триггер AFTER применяется только для таблиц).
Например, создадим следующие базу данных и таблицу:
1 2 3 4 5 6 7 8 9 10 11 | CREATE DATABASE prods;GOUSE 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 prodsGOCREATE TRIGGER products_deleteON ProductsINSTEAD OF DELETEASUPDATE ProductsSET IsDeleted = 1WHERE 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:
