Изучение SQL: триггеры
Сегодня на работе была задача по созданию триггеров на таблицу БД.
Суть заключалась в том, что надо сделать механизм, при котором update/insert в одну таблицу, переносил данные в другую таблицу, а предыдущую удалял.
Так как я раньше не работал с триггерами, пришлось немного почитать и сделать для себя эту заметку.
Типы триггеров.
- AFTER — выполняется после выполнения действия. Определяется только для таблиц. Можно определять несколько действий через запятую.
- INSTEAD OF — выполняется вместо действия (то есть по сути действие — добавление, изменение или удаление — вообще не выполняется). Определяется для таблиц и представлений. Можно определять только одно действие.
Создание простого триггера
CREATE TRIGGER User_Insert_Update_TR
ON Users
AFTER INSERT, UPDATE -- сработает как для INSERT так и для UPDATE скриптов.
AS
BEGIN
INSERT UsersLog (UserId)
SELECT Id FROM inserted
ENDУправление триггером
Удаление
DROP TRIGGER User_Insert_Update_TRОтключение
DISABLE TRIGGER User_Insert_Update_TR ON UsersВключение
ENABLE TRIGGER User_Insert_Update_TR ON UsersРабота со значениями запроса
Внутри каждого триггера можно работать с данными, которые изменяет тот или иной триггер.
- Добавление — виртуальная табличка INSERTED.
- Удаление — виртуальная табличка DELETED.
- Изменение — содержит 2 таблички.
INSERTED хранит строки после обновления.
DELETED до обновления.
INSTEAD OF
Данный тип триггеров работает вместо операций с данными. Также его можно применять не только для таблиц но и для представлений.
Пример
Данный триггер не будет удалять данный из таблицы Users, он просто деактивирует запись
CREATE TRIGGER User_Delete_TR
ON Users
INSTED OF DELETE
AS
BEGIN
UPDATE Users
SET IsActive = 0
WHERE Id = (SELECT Id FROM deleted)
END