Теория баз данных

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



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

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

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

  • Нельзя использовать в триггере команду удаления объектов 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 /* только для операции удаления */

    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




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