Триггер – это хранимая процедура, которая начинает свою работу в случае выполнения действия, на которое триггер настроен. Триггеры применяются для решения задач поддержания целостности (корректности) данных, когда по каким-либо причинам невозможно (неудобно) использовать ограничения FOREIGN KEY (или ограничений на значения столбцов), и безопасности, когда, например, недопустимы какие-либо изменения в данных. Триггеры бывают нескольких типов: DML, DDL и LOGON. DML триггеры могут срабатывать при выполнении (после выполнения или вместо выполнения) команд INSERT, UPDATE и DELETE для таблиц или представлений. Этот тип триггеров присутствовал и в MS SQL Server 2000. DDL триггеры могут срабатывать при выполнении после выполнения команд CREATE, ALTER, DROP, GRANT, DENY, REVOKE, UPDATE STATISTICS и некоторых системных процедур. LOGON триггеры срабатывают после установки соединения с MS SQL Server. DDL и LOGON триггеры можно использовать только в MS SQL Server 2005, если уровень совместимости для БД установлен в значение 90.
Создание | изменение триггеров.
Рассмотрим общий вид создания / изменения DML триггера:
EXEC[UTE] AS {CALLER | SELF | OWNER | ‘имя_пользователя’}
}[,]
]
{ FOR [AFTER] | INSTEAD OF}
{[INSERT] [,] [UPDATE] [,] [DELETE]}
[WITH APPEND]
[NOT FOR REPLICATION]
AS
{
Перечень_команд_SQL |
EXTERNAL NAME имя_сборки.имя_класса.название_метода [;]
}
Следует отметить, что под термином «пространство_имен» (schema) подразумевается выделенное пространство имен, являющееся по сути «контейнером» для объектов. Пользователи могут владеть схемами, иметь права на доступ к схеме, но не являются синонимом понятия схемы, в отличие от предыдущих версий MS SQL Server. В случае изменения уже существующего триггера вместо команды CREATE необходимо использовать команду ALTER, причем при задании имени триггера использование компоненты пространство_имен становится обязательным.
Рассмотрим общий вид создания / изменения DDL и LOGON триггеров:
DDL триггер:
CREATE TRIGGER название_триггера
ON { ALL SERVER | DATABASE }
[WITH
{ ENCRYPTION |
EXEC[UTE] AS {CALLER | SELF | {‘имя_пользователя’ | ‘login_name’}}
}[,]
]
{ FOR [AFTER]}
{тип_события | группа событий}[,]
AS
{
Перечень_команд_SQL |
EXTERNAL NAME имя_сборки.имя_класса.название_метода [;]
}
LOGON триггер:
CREATE TRIGGER название_триггера
ON ALL SERVER
[WITH
{ ENCRYPTION |
EXEC[UTE] AS {CALLER | SELF ‘login_name’}
}[,]
]
{ FOR [AFTER]} LOGON
AS
{
Перечень_команд_SQL |
EXTERNAL NAME имя_сборки.имя_класса.название_метода [;]