Для рассмотрения операций с триггерами определим следующую базу данных productsdb:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| 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.
Определим триггер, который будет срабатывать после добавления:
1
2
3
4
5
6
7
8
9
| 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:
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 productsdb GO CREATE TRIGGER Products_DELETE ON Products AFTER DELETE AS INSERT INTO History (ProductId, Operation) SELECT Id, 'Удален товар ' + ProductName + ' фирма ' + Manufacturer FROM DELETED |
Здесь, как и в случае с предыдущим триггером, помещаем информацию об удаленных товарах в таблицу History.
Выполним команду на удаление:
1
2
3
4
5
| USE productsdb; DELETE FROM Products WHERE Id=2 SELECT * FROM History |
Изменение данных
Триггер обновления данных срабатывает при выполнении операции UPDATE. И в таком триггере мы можем использовать две виртуальных таблицы. Таблица INSERTED хранит значения строк после обновления, а таблица DELETED хранит те же строки, но до обновления.
Создадим триггер обновления:
1
2
3
4
5
6
7
8
9
| USE productsdb GO CREATE TRIGGER Products_UPDATE ON Products AFTER UPDATE AS INSERT INTO History (ProductId, Operation) SELECT Id, 'Обновлен товар ' + ProductName + ' фирма ' + Manufacturer FROM INSERTED |
И при обновлении данных сработает данный триггер:
Комментариев нет:
Отправить комментарий