Для рассмотрения операций с триггерами определим следующую базу данных productsdb:
CREATE DATABASE productsdb; GO USE 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.
Определим триггер, который будет срабатывать после добавления:
USE productsdb GO CREATE TRIGGER Products_INSERT ON Products AFTER INSERT AS INSERT INTO History (ProductId, Operation) SELECT Id, 'Добавлен товар ' + ProductName + ' фирма ' + Manufacturer FROM INSERTED
Этот триггер будет добавлять в таблицу History данные о добавлении товара, которые берутся из виртуальной таблицы INSERTED.
Выполним добавление данных в Products и получим данные из таблицы History:
USE productsdb; INSERT INTO Products (ProductName, Manufacturer, ProductCount, Price) VALUES('iPhone X', 'Apple', 2, 79900) SELECT * FROM History
При удалении все удаленные данные помещаются в виртуальную таблицу DELETED:
USE productsdb GO CREATE TRIGGER Products_DELETE ON Products AFTER DELETE AS INSERT INTO History (ProductId, Operation) SELECT Id, 'Удален товар ' + ProductName + ' фирма ' + Manufacturer FROM DELETED
Здесь, как и в случае с предыдущим триггером, помещаем информацию об удаленных товарах в таблицу History.
Выполним команду на удаление:
USE productsdb; DELETE FROM Products WHERE Id=2 SELECT * FROM History
Триггер обновления данных срабатывает при выполнении операции UPDATE. И в таком триггере мы можем использовать две виртуальных таблицы. Таблица INSERTED хранит значения строк после обновления, а таблица DELETED хранит те же строки, но до обновления.
Создадим триггер обновления:
USE productsdb GO CREATE TRIGGER Products_UPDATE ON Products AFTER UPDATE AS INSERT INTO History (ProductId, Operation) SELECT Id, 'Обновлен товар ' + ProductName + ' фирма ' + Manufacturer FROM INSERTED
И при обновлении данных сработает данный триггер: