Лекция 3 Триггеры
.docxТриггеры - программный код, подвид процедуры, который выполняется без участия пользователя.
-
Реагируют при работе с определенной таблицей
-
Реагируют при работе с базой данных целиком (события, связанные с базой данных)
Задачи:
-
Поддержка ссылочный целостности;
-
Для создания хитрых ограничений;
-
Корректировать действия;
-
Исполнение определенного кода;
-
Для создания журнала.
Виды триггеров:
-
На вставку;
-
На удаление;
-
На изменение;
-
Комбинированные - усложняют код.
Особенности триггеров:
-
Пользователь не контролирует выполнение триггера;
-
Нет входных и возвращаемых параметров;
-
Триггеры связаны с конкретной таблицей;
-
Триггеры не запускаются и не выполняются при массовых вставках (информация о которых не идет в log).
Теоретически существует три типа триггеров:
-
После-триггер - срабатывает после действия;
-
Совершаются вместо действия;
-
Пре-триггер - срабатывает до события, не реализованы в SQL Server из-за политики безопасности.
-
FOR - всегда действуют за событием
-
After - сработает после того, как будет выполнено все действие, то есть должны отработаться все действия, на одну таблицу можно делать нерегламентированное количество
-
Instant of - вместо действия, по одному триггеру на действие
Синтаксис:
create trigger <name>
on <name table/представление>
for/after/instant of
Действие, которое будет являться инициатором запуска триггера (одно или комбинация) = insert/update/delete
as
Код
Параметры триггеров:
-
With excription - для защиты
-
Not for replication - не будет запускаться при репликации
-
With append - триггер будет корректно работать с серверами старых версий
Для триггера insert: как только срабатывает одна из операций и система знает, что есть триггер, появляется таблица inserted, которая является копией начальной таблицей по названию столбцов, но содержимое будет состоять из того, что хотели вставить. Такая таблица видна только внутри кода триггера. Для удаления таблица deleted. Для update будет создаваться обе эти таблицы.
Sp_settrigerrorder - установление какой триггер будет первым и последним
Включение/выключение триггеров:
Alter <table name> enable (disable) <name trigger>
Пример:
Create trigger t1
On CD
For Insert Update
As
Declare @tmax int
Declare @maxs int
Select @maxs=maxs from Сотр where id=(select iCo from inserted)
Select @tmax=count(*) from CD where idD = (select idD from inserted)
If (@tmax>@maxs)
Begin
RaiseError()
Rollback
End
При вызове операции модификации данных из триггера на туже таблицу, на которую запущен триггер, триггер повторно не запускается (не инициализирует рекурсию)
Create trigger t2
On CD
For Insert Update
As
Declare @ido int
Select @ido from inserted
Declare @ids int
Select @ids = ids from Inserted
If (select title from OTD where Id=@ido)=руководство
Begin
Update co set bonus = salary * 0.1 where ids = @ids
End
Триггеры могут быть источником исключений для внешних программ.
Триггер могут обрабатывать вставки данных эксклюзивных таблиц