Триггеры для операций INSERT, UPDATE, DELETE

Последнее обновление: 09.11.2017

Для рассмотрения операций с триггерами определим следующую базу данных 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
INSERT Trigger in MS SQL Server

Удаление данных

При удалении все удаленные данные помещаются в виртуальную таблицу 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
DELETE Trigger in MS SQL Server

Изменение данных

Триггер обновления данных срабатывает при выполнении операции 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

И при обновлении данных сработает данный триггер:

UPDATE Trigger in MS SQL Server
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850