Реализация триггеров DML
Перед созданием триггера DML примите во внимание следующее:
- инструкция CREATE TRIGGER должна быть первой инструкцией пакета; все остальные инструкции пакета интерпретируются как часть определения инструкции CREATE TRIGGER;
- разрешение на создание триггеров DML принадлежит по умолчанию владельцу таблицы, который не может передавать его другим пользователям;
- триггеры DML являются объектами базы данных, и их имена должны соответствовать требованиям, предъявляемым к идентификаторам;
- создать триггер DML можно только в текущей базе данных, хотя он может ссылаться на внешние по отношению к ней объекты;
- триггер DML нельзя создать для временной или системной таблицы, хотя он может ссылаться на временные таблицы; на системные таблицы ссылаться в триггере DML не следует, используйте вместо этого представления информационной схемы;
- триггеры INSTEAD OF DELETE и INSTEAD OF UPDATE нельзя определить для таблицы, которая имеет внешний ключ, определенный с действием DELETE или UPDATE;
- несмотря на то, что инструкция TRUNCATE TABLE похожа на инструкцию DELETE без предложения WHERE (которая удаляет все строки), она не приводит к срабатыванию триггеров DELETE, потому что инструкция TRUNCATE TABLE не регистрируется;
- инструкция WRITETEXT не приводит к срабатыванию триггеров INSERT и UPDATE.
Важно! |
---|
Возможность возвращать результирующие наборы из триггеров будет удалена в следующей версии SQL Server. Триггеры, возвращающие результирующие наборы, могут вызвать непредвиденное поведение тех приложений, которые не предназначены для работы с ними. Не используйте в разрабатываемых приложениях триггеры, которые возвращают результирующие наборы, и запланируйте изменение приложений, которые сейчас используют их. Чтобы триггеры не возвращали результирующие наборы в SQL Server 2005, присвойте параметру disallow results from triggers значение 1 (см. раздел Параметр disallow results from triggers). В будущей версии SQL Server этот параметр будет иметь значение 1 по умолчанию. |
Создавая триггер DML, укажите следующее:
- имя триггера;
- таблицу, для которой определяется триггер;
- условия срабатывания триггера;
- инструкции модификации данных, приводящие к активации триггера. Возможны варианты INSERT, UPDATE и DELETE. Один триггер может активировать несколько инструкций модификации данных. Например, триггер может активироваться инструкциями INSERT и UPDATE;
- инструкции, выполняющие действие триггера.
Множественные триггеры DML
Таблица может иметь несколько триггеров AFTER конкретного типа, если они имеют разные имена; каждый триггер может выполнять несколько функций. Однако каждый триггер может быть применен только к одной таблице, хотя один триггер может быть применен к любому подмножеству трех пользовательских действий (UPDATE, INSERT и DELETE).
Таблица может иметь только один триггер INSTEAD OF конкретного типа.
Разрешения на использование триггеров и владение триггерами
Триггеры создаются в схеме таблицы или представления, для которых они определяются. Например, если триггер Trigger1 создается для таблицы HumanResources.Employee, именем триггера с квалификатором схемы будет HumanResources.Trigger1.
Разрешения на выполнение инструкции CREATE TRIGGER принадлежат по умолчанию владельцу таблицы, для которой определяется триггер, элементам фиксированной серверной роли sysadmin и элементам фиксированных ролей db_owner и db_ddladmin базы данных; передать эти разрешения другим пользователям нельзя.
При создании триггера INSTEAD OF для представления цепочка владения разрывается, если владелец представления не владеет также базовыми таблицами, на которые ссылаются представление и триггер. Если владелец представления не владеет базовой таблицей, ее владелец должен отдельно предоставить необходимые разрешения пользователю, читающему или обновляющему представление. Если представление и его базовые таблицы принадлежат одному пользователю, он должен предоставить другим пользователям разрешения, связанные только с представлением, а не с отдельными базовыми таблицами. Дополнительные сведения см. в разделе Цепочки владения.
Создание триггера описывается в следующем разделе: