Создание и управление индексами. Создание и управление встроенными процедурами. Оптимизация производительности запросов. Управление транзакциями и блокировками, страница 22

*  Таблицы могут иметь несколько триггеров для любого действия. Сервер SQL позволяет вкладывать несколько триггеров на одну таблицу. Каждый триггер может быть объявлен для нескольких или одного действия.

*  Владелец таблицы может указывать первый и последний триггеры. Когда несколько триггеров помещены на таблицу, владелец может использовать процедуру sp_settriggerorder для указания первого выполняемого триггера и последнего. Порядок остальных триггеров не может устанавливаться.

*  Вы должны обладать правами на все используемые объекты.

*  Владельцы таблицы не могут создавать триггеры на просмотрщики и временные таблицы. Однако, триггеры могут ссылаться на просмотрщики и временные таблицы.

*  Владельцы таблицы могут создавать триггеры INSTEAD OF на таблицы и просмотрщики.

*  Триггеры не должны возвращать результирующих наборов. Триггеры могут возвращать результирующие наборы, но это не рекомендуется, потому что пользователи не увидят этого результата при выполнении INSERT, UPDATE или DELETE.

*  Триггеры могут иметь многострочные действия.

*  Для определения, сколько строк подлежат воздействию, используйте функцию @@ROWCOUNT.

11.2 Объявление триггеров

В этой секции описывается процесс создания, обновления и удаления триггеров. Здесь также описываются необходимые права и рекомендации, которым надо следовать при объявлении триггеров.

Создание триггеров

Для создания триггеров используйте оператор CREATE TRIGGER. В операторе указывается таблица, для которой объявляется триггер, событие, для которого триггер выполняется и индивидуальные инструкции для триггера.

Синтаксис:

CREATE TRIGGER trigger_name

ON { table | view }

[ WITH ENCRYPTION ]

{

{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }

[ WITH APPEND ]

[ NOT FOR REPLICATION ]

AS

[ { IF UPDATE ( column )

[ { AND | OR } UPDATE ( column ) ]

[ ...n ]

| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )

{ comparison_operator } column_bitmask [ ...n ]

} ]

sql_statement [ ...n ]

}

}

Когда определяется FOR UPDATE действие, опция IF UPDATE(имя колонки) может использоваться для фокусирования действия на определённую колонку, которая обновляется.

Опции FOR и AFTER имеют общий синтаксис создания схожего типа триггера, который вызывается после инициализации действий добавления, обновления или удаления.

Триггеры INSTEAD OF отменяют действие триггера и выполняют взамен новую функцию.

Когда вы создаёте триггер, информация о триггере вставляется в системные таблицы sysobjects и syscomments. Если триггер создаётся с таким же именем, как и существующий, новый триггер перезаписывает существующий.

Сервер SQL не поддерживает добавления триггеров объявлённых пользователем на системные таблицы, поэтому вы не можете создавать их для системных таблиц.

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

*  ALTER DATABASE

*  CREATE DATABASE

*  DISK INIT

*  DISK RESIZE

*  DROP DATABASE

*  LOAD DATABASE

*  LOAD LOG

*  RECONFIGURE

*  RESTORE DATABASE

*  RESTORE LOG

Для определения таблиц с триггером, выполните процедуру sp_depends. Для просмотра объявления триггера используйте sp_helptext. Для определения, какие триггеры существуют на определённую таблицу, и на какие действия выполните процедуру sp_helptrigger.

Пример

Следующий пример создаёт триггер на таблицу Employees, который запрещает пользователю удалять более чем одного работника за одну операцию. Триггер срабатывает каждый раз, когда удаляется какая-нибудь запись или группа записей. Триггер проверяет количество записей удалённых запросом. Если удаляется более одной строки, то пользователь увидит сообщение и транзакция будет отменена.

USE ClassNorthwind

GO

CREATE TRIGGER Empl_Delete ON Employees

FOR DELETE

AS

IF (SELECT COUNT (*) FROM Deleted)>1

BEGIN

RAISERROR('Вы не можете удалить более одной строки', 16,1)

ROLLBACK TRANSACTION

END