Триггеры для операций INSERT, UPDATE, DELETE
Для рассмотрения операций с триггерами определим следующую базу данных productsdb:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | CREATE DATABASE productsdb;GOUSE productsdb;CREATE TABLE Products( Id INT IDENTITY PRIMARY KEY, ProductName NVARCHAR(30) NOT NULL, Manufacturer NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Price MONEY NOT NULL);CREATE TABLE History ( Id INT IDENTITY PRIMARY KEY, ProductId INT NOT NULL, Operation NVARCHAR(200) NOT NULL, CreateAt DATETIME NOT NULL DEFAULT GETDATE(),); |
Здесь определены две таблиц: Products - для хранения товаров и History - для хранения истории операций с товарами.
Добавление
При добавлении данных (при выполнении команды INSERT) в триггере мы можем получить добавленные данные из виртуальной таблицы INSERTED.
Определим триггер, который будет срабатывать после добавления:
1 2 3 4 5 6 7 8 9 | USE productsdbGOCREATE TRIGGER Products_INSERTON ProductsAFTER INSERTASINSERT INTO History (ProductId, Operation)SELECT Id, 'Добавлен товар ' + ProductName + ' фирма ' + ManufacturerFROM INSERTED |
Этот триггер будет добавлять в таблицу History данные о добавлении товара, которые берутся из виртуальной таблицы INSERTED.
Выполним добавление данных в Products и получим данные из таблицы History:
1 2 3 4 5 | USE productsdb;INSERT INTO Products (ProductName, Manufacturer, ProductCount, Price)VALUES('iPhone X', 'Apple', 2, 79900)SELECT * FROM History |

Удаление данных
При удалении все удаленные данные помещаются в виртуальную таблицу DELETED:
1 2 3 4 5 6 7 8 9 | USE productsdbGOCREATE TRIGGER Products_DELETEON ProductsAFTER DELETEASINSERT INTO History (ProductId, Operation)SELECT Id, 'Удален товар ' + ProductName + ' фирма ' + ManufacturerFROM DELETED |
Здесь, как и в случае с предыдущим триггером, помещаем информацию об удаленных товарах в таблицу History.
Выполним команду на удаление:
1 2 3 4 5 | USE productsdb;DELETE FROM ProductsWHERE Id=2SELECT * FROM History |

Изменение данных
Триггер обновления данных срабатывает при выполнении операции UPDATE. И в таком триггере мы можем использовать две виртуальных таблицы. Таблица INSERTED хранит значения строк после обновления, а таблица DELETED хранит те же строки, но до обновления.
Создадим триггер обновления:
1 2 3 4 5 6 7 8 9 | USE productsdbGOCREATE TRIGGER Products_UPDATEON ProductsAFTER UPDATEASINSERT INTO History (ProductId, Operation)SELECT Id, 'Обновлен товар ' + ProductName + ' фирма ' + ManufacturerFROM INSERTED |
И при обновлении данных сработает данный триггер:
