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