Реализация триггеров 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, присвойте параметру 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 для представления цепочка владения разрывается, если владелец представления не владеет также базовыми таблицами, на которые ссылаются представление и триггер. Если владелец представления не владеет базовой таблицей, ее владелец должен отдельно предоставить необходимые разрешения пользователю, читающему или обновляющему представление. Если представление и его базовые таблицы принадлежат одному пользователю, он должен предоставить другим пользователям разрешения, связанные только с представлением, а не с отдельными базовыми таблицами. Дополнительные сведения см. в разделе Цепочки владения.

Создание триггера описывается в следующем разделе: