Базы данных - модели, разработка, реализация

Триггеры


Фактически триггер - это специальный вид хранимой процедуры, которую 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]
  • 271

  • AS
  • SQL-операторы (Тело триггера)


  • Имя триггера является идентификатором во встроенном языке программирования СУБД и должно удовлетворять соответствующим требованиям.

    В параметре FOR задается одна или несколько операций модификации, которые запускают данный триггер.

    Параметр WITH ENCRIPTING имеет тот же смысл, что и для хранимых процедур, он скрывает исходный текст тела триггера.

    Существует несколько правил, которые ограничивают набор операторов, которые могут быть использованы в теле триггера.




    Так, в большинстве СУБД действуют следующие ограничения:

  • Нельзя использовать в теле триггера операции создания объектов БД (новой БД, новой таблицы, нового индекса, новой хранимой процедуры, нового триггера, новых индексов, новых представлений).


  • Нельзя использовать в триггере команду удаления объектов DROP для всех типов базовых объектов БД.


  • Нельзя использовать в теле триггера команды изменения базовых объектов ALTER TABLE. ALTER DATABASE.


  • Нельзя изменять права доступа к объектам БД, то есть выполнять команду GRAND или REVOKE.


  • Нельзя создать триггер для представления (VIEW) .


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


  • Рассмотрим пример триггера, который срабатывает при удалении экземпляра некоторой книги, например, в случае утери этой книги читателем. Что же может делать этот триггер? А он может выполнять следующую проверку: проверять, остался ли еще хоть один экземпляр данной книги в библиотеке, и если это был последний экземпляр книги в библиотеке, то резонно удалить описание книги из предметного каталога, чтобы наши читатели зря не пытались заказать эту книгу.

    Текст этого триггера на языке 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 /* только для операции удаления */


  • 272

  • AS


  • /* опишем локальные переменные */


  • DECLARE @Ntek int /* количество оставшихся экземпляров удаленной книги */


  • DECLARE @DEL_EX VARCHAR(12) /* шифр удаленного экземпляра*/


  • Begin /* по временной системной таблице, содержащей удаленные записи,


  • определяем шифр книги, соответствующей последнему удаленному экземпляру */


  • SELECT @DEL_EX = ISBN From deleted


  • /* вызовем хранимую процедуру, которая определит количество экземпляров книги


  • с заданным шифром */


  • EXEC @Ntek = COUNT_EX @DEL_EX


  • /* Если больше нет экземпляров данной книги, то мы удаляем запись о книге из


  • таблицы BOOKS */


  • IF @Ntek = О DELETE from BOOKS WHERE BOOKS.ISBN = @DEL EXENDGO


  • Содержание раздела