Фактически триггер — это специальный вид хранимой процедуры, которую SQL Server
вызывает при выполнении операций модификации соответствующих таблиц. Триггер
автоматически активизируется при выполнении операции, с которой он связан. Триггеры
связываются с одной или несколькими операциями модификации над одной таблицей.
В разных
коммерческих СУБД рассматриваются разные триггеры. Так, в MS SQL Server триггеры
определены только как постфильтры, то есть такие триггеры, которые выполняются
после свершения события.
В СУБД Oracle
определены два типа триггеров: триггеры, которые могут быть запущены перед реализацией
операции модификации, они называются BEFORE-триггерами, и триггеры, которые
активизируются после выполнения соответствующей модификации, аналогично триггерам
MS SQL Server, — они называются AFTER-тригерами.
Триггеры
могут быть эффективно использованы для поддержки семантической целостности БД,
однако приоритет их ниже, чем приоритет правил-ограничений (constraints), задаваемых
на уровне описания таблиц и на уровне связей между таблицами. При написании
триггеров всегда надо помнить об этом, при нарушении правил целостности по связям
(DRI declarative Referential Integrity) триггер просто может никогда не сработать.
В стандарте
SQL1 ни хранимые процедуры, ни триггеры были не определены. Но в добавлении
к стандарту SQL2, выпущенному в 1996 году, те и другие объекты были стандартизированы
и определены.
Для создания
триггеров используется специальная команда:
CREATE TRIGGER
<имя_триггера> ON <имя_таблицы>
FOR {[INSERT][.
UPDATE] [, DELETE] } [WITH ENCRIPTING]
AS
SQL-операторы
(Тело триггера)
Имя триггера
является идентификатором во встроенном языке программирования СУБД и должно
удовлетворять соответствующим требованиям.
В параметре
FOR задается одна или несколько операций модификации, которые запускают данный
триггер.
Параметр
WITH ENCRIPTING имеет тот же смысл, что и для хранимых процедур, он скрывает
исходный текст тела триггера.
Существует
несколько правил, которые ограничивают набор операторов, которые могут быть
использованы в теле триггера.
Так, в большинстве
СУБД действуют следующие ограничения:
Рассмотрим
пример триггера, который срабатывает при удалении экземпляра некоторой книги,
например, в случае утери этой книги читателем. Что же может делать этот триггер?
А он может выполнять следующую проверку: проверять, остался ли еще хоть один
экземпляр данной книги в библиотеке, и если это был последний экземпляр книги
в библиотеке, то резонно удалить описание книги из предметного каталога, чтобы
наши читатели зря не пытались заказать эту книгу.
Текст этого
триггера на языке Transact SQL приведен ниже:
/* Проверка
существования данного триггера в системном каталоге */
if exists (select * from sysobjects
where id = object_id('dbo.DEL_EXEMP')
and sysstat & Oxf = 8)
drop trigger dbo.DEL_EXEMP
GO
CREATE TRIGGER DEL_EXEMP ON dbo.EXEMPLAR
/* мы создаем
триггер для таблицы EXEMPLAR */
FOR DELETE /*
только для операции удаления */
AS
/* опишем локальные
переменные */
DECLARE @Ntek int
/* количество
оставшихся экземпляров удаленной книги */
DECLARE @DEL_EX VARCHAR(12)
/* шифр удаленного
экземпляра*/
Begin
/* по временной
системной таблице, содержащей удаленные записи, определяем шифр книги, соответствующей
последнему удаленномуэкземпляру */
SELECT @DEL_EX
= ISBN From deleted
/* вызовем хранимую
процедуру, которая определит количество экземпляров книги с заданным шифром
*/
ЕХЕС @Ntek =
COUNT_EX @DEL_EX
/* Если больше
нет экземпляров данной книги, то мы удаляем запись о книге из таблицы BOOKS
*/
IF @Ntek = 0
DELETE from BOOKS WHERE BOOKS.ISBN = @DEL_EXENDGO