Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛЕКЦИИ УПРАВЛЕНИЕ ДАННЫМИ 2012.doc
Скачиваний:
3
Добавлен:
01.04.2025
Размер:
2.54 Mб
Скачать

6. Триггеры, хранимые процедуры, события

Триггер - это отдельная хранимая в БД подпрограмма, связанная с таблицей или представлением, которая автоматически включается, когда в таблицу или представление вставляется (триггер добавления), модифицируется (триггер модификации) или удаляется (триггер удаления) строка.

Триггеры позволяют:

  • Контролировать входные данные, обеспечивая достоверность информации и ее логическую непротиворечивость.

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

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

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

  • Повысить независимость прикладного программного обеспечения. Изменение схемы контроля в триггере автоматически отражается во всех приложениях, не требуя внесения в них каких-либо изменений.

Хранимая процедура – отдельная подпрограмма, хранящаяся и выполняющаяся на сервере СУБД. Она может получать входные параметры и возвращать значения вызвавшим её клиентским приложениям. Хранимые процедуры могут обрабатывать и возвращать отдельные записи и множество записей.

SQL для триггеров и хранимых процедур содержит множество операторов императивного программирования: конкатенацию строк, арифметические операции, операции сравнения, логические (not, and, or), операторы структурного программирования (IF, FOR, WHILE), объявление переменных (DECLARE), возврат значений выхода переменных (SUSPEND), выход из процедуры (EXIT), генерацию события (POST_EVENT), обработку ошибок (WHEN), вызов процедуры (EXECUTE). Эти операторы используются совместно с операторами декларативного программирования INSERT, UPDATE, DELETE и SELECT. В современных СУБД код хранимых процедур и триггеров может писаться на смеси диалектов SQL и языков высокого уровня, например, в Oracle – на PL/SQL или Java. Фактически запросы, написанные на декларативном языке, вкладываются в процедуры, написанные на императивном языке (см. Рис. 26).

Рис. 26. Языковая структура хранимой процедуры и триггера

Пример хранимой процедуры приведен на Лист. 50. Она написана для базы данных «библиотека», состоящей из таблиц «книги», «авторы» и промежуточной таблицы, показывающей взаимосвязь авторов и книг. Хранимая процедура по коду книги возвращает авторов книги, записанных в одну строковую переменную. Процедура написана для СУБД Interbase и ее процедурная часть напоминает язык Pascal. Внутри нее «спрятан» SQL запрос, возвращающих авторов книги. Используя оператор For, идет обработка каждой записи, возвращаемой запросом. При этом поля из декларативной части помещаются в переменные процедурной части с помощью оператора INTO.

Лист. 50. Пример хранимой процедуры

CREATE PROCEDURE PBUTHOR (CODE INTEGER)

RETURNS (AUTHORS VARCHAR(250))

AS

DECLARE VARIABLE AUNAME VARCHAR(60);

DECLARE VARIABLE UNIKEY INTEGER;

DECLARE VARIABLE WS INTEGER;

BEGIN

WS=-1;

FOR SELECT A.UNIKEY, B.AUNAME

FROM TBOOK A, TAUTHOR B, TBOOK_AUTHOR C

WHERE (A.UNIKEY=:CODE AND A.UNIKEY=C.BOOKKEY AND C.AUTHOR=B.AUTHOR)

INTO :UNIKEY, :AUNAME

DO

BEGIN

IF (WS=-1) THEN AUTHORS=AUNAME;

ELSE AUTHORS = AUTHORS || ‘, ‘ || AUNAME;

WS = UNIKEY;

END

IF (WS!=-1) THEN SUSPEND;

END

Пример триггера приведен в Лист. 51. Это триггер, который выполняет вставку нового автора и предварительно проверяет, не пустое ли имя автора. Если пустое – то генерируется исключение.

Лист. 51. Пример триггера

CREATE TRIGGER I_TAUTHOR_1 FOR TAUTHOR

ACTIVE BEFORE INSERT POSITION 0

AS

BEGIN

IF (NEW.AUTHOR IS NULL) THEN

NEW.AUTHOR=GEN_ID(SYSNUMBER, 1);

IF (NEW.AUNAME IS NULL) THEN EXCEPTION NO_AUTHOR;

IF (NEW.COMMENT IS NULL) THEN NEW.COMMENT=” ”;

END

Событие – это вызов СУБД внешних или внутренних действий. Хранимая процедура или триггер генерирует событие, выдавая команду post_event eventname1. Обработка события строится по схеме: приложение формирует список событий event init requestname (eventname1, eventname2…); то или другое приложение выдает команду event wait requestname; по этой команде приложение останавливается и ждет события.

Обработка исключений похожа на обработку событий и строится по формату, приведенному на Лист. 52. В данном случае перехватывается исключение, сгенерированное триггером на Лист. 51 (пустое имя автора).

Лист. 52. Формат обработки исключений

WHEN NO_AUTHOR

DO

BEGIN…END

Подробнее о триггерах, хранимых процедурах и событиях см. [11].

Вопросы для самопроверки:

1. Чем триггер отличается от хранимой процедуры?