Решение
Триггер – это набор инструкций SQL Server, который выглядит и действует подобно хранимой процедуре, но триггер нельзя вызвать с помощью команды EXEC. Триггеры активизируются при выполнении пользователем определенной инструкции Transact-SQL. Существует два вида триггеров:
- DML запускаются с помощью инструкций INSERT, UPDATE или DELETE.
- DDL с помощью инструкций CREATE, ALTER, DROP.
Если вы не хотите, чтобы триггеру передавались записи, нужно добавить команду ROLLBACK в соответствующее место в коде. Команда ROLLBACK указывает серверу остановить обработку модификации и запретить транзакцию.
Существует также команда RAISEERROR с помощью которой вы можете отправить сообщение об ошибке пользователю.
Триггеры INSERT
Триггеры INSERTзапускаются при каждой попытке создать новую запись в таблице с помощью команды INSERT. При попытке вставить новую запись в таблицу SQLServerкопирует эту запись в таблицу триггеров БД и специальную таблицу inserted.
пример: допустим у нас есть таблица «Sotrydnik» БД “Ludi”. Необходимо запретить вставлять запись о сотруднике оклад которого, менее 20000 рублей.
1. Открыть SQL Server Management Studio. В окне Object Explorer развернутьпапкуБД «Ludi” - Programmability – Triggers.
2. Щелкаем правой кнопкой мыши на папке Triggersи выбираем команду NewTriggers.
3. В нашем случае триггер будет выглядеть следующим образом:
CREATE TRIGGER primer1
ON sotrydnik
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
if (select oklad from inserted)<'20000'
Rollback
print'Вы не можете вставлять запись о сотруднике с окладом менее 20 000 рублей'
END
GO
4. Выполняем триггер, нажав на кнопку на панели инструментов. В результате в нижней части экрана мы увидим строчку «Command(s) completedsuccessfully».
5. Далее сохраняем триггер, щелкнув по кнопке Save
Чтобы протестировать новый триггер, необходимо создать запрос, нажав на кнопку New Query , следующего содержания
USE LUDI
INSERT SOTRYDNIK
VALUES (‘S28’,’Петров’,’Валерий’,’Михайлович’,’10000’,’2’,’1’)
Выполняем запрос, щелкнув по кнопке , в нижней части окна увидим сообщение об ошибке, что такую запись вставлять нельзя.
Итак, я создал триггер, который при вставке новой записи, проверяет вводимый оклад.
Триггеры DDL.
Триггеры DDL применются для инструкций CREATE, ALTER, DROP и т.д.
пример: создадим триггер, который предотвратит удаление или изменение таблиц в БД.
1. Создадим запрос, нажав на кнопку New Query , следующего содержания:
USE LUDI
GO
CREATE TRIGGER CANTDROPSOTRYDNIK
ON DATABASE
FOR DROP_TABLE, ALTER_TABLE
AS
PRINT ‘Вы не можете удалять или изменять БД’
ROLLBACK
2. Проверим созданный триггер. Создадим запрос, нажав на кнопку New Query ,
следующего содержания:
DROP_TABLES SOTRYDNIK
3. Вы увидите сообщение об ошибке:
Вы не можете удалять или изменять БД
Вывод: рассмотрел основные виды триггеров, которые повышают производительность БД и «облегчают жизнь программистам»