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

       

Триггеры


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



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



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

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

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




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