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


         

Триггеры - часть 2


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

  • Нельзя использовать в теле триггера операции создания объектов БД (новой БД, новой таблицы, нового индекса, новой хранимой процедуры, нового триггера, новых индексов, новых представлений).
  • Нельзя использовать в триггере команду удаления объектов 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
  • 273

    271 :: 272 :: 273 :: Содержание




    Содержание  Назад  Вперед