Оператор EXECUTE PROCEDURE

Оператор вызова другой хранимой процедуры:

EXECUTE PROCEDURE имя [параметр [, параметр … ] ] ;

[ RETURNING_VALUES параметр [, параметр … ] ];

Пример:

EXECUTE PROCEDURE AVG_KOLVO (:IN_TOVAR)

RETURNING_VALUE :AVG_KOLVO_TOVAR;

Оператор POST_EVENT

Оператор применяется для посылки сервером клиентским приложениям сообщения о наступлении какой-либо ситуации, связанной с именем события.

POST_EVENT “Имя события”;

После выполнения оператора наступает событие с указанным именем. Сервер БД уведомляет о наступлении этого события все активные приложения, зарегистрировавшие свой интерес к нему с помощью оператора EVENT INIT.

Обмен событиями между сервером и приложениями может широко использоваться. Например, с его помощью можно создать клиентское приложение, которое будет видеть все изменения, вносимые в БД другими пользователями. Для этого нужно, чтобы в соответствующий момент возбуждалось заданное событие. Получив сообщение, программа-наблюдатель отображает внесенные изменения.

Изменение и удаление ХП

Изменение ХП:

ALTER PROCEDURE ИмяПроцедур

[ ( входной_параметр тип_данных

[, входной_параметр тип_данных … ] ) ]

[ RETURNS

( выходной_параметр тип_данных

[ , выходной_параметр тип_данных … ] ) ]

AS

< тело процедуры>

Удаление ХП:

DROP PROCEDURE ИмяПроцедуры

Работа с триггерами

Общие сведения о триггерах

Триггеры - это хранимые процедуры, связанные с некоторыми событиями, происходящими во время работы базы данных. В качестве таких событий выступают операции вставки, обновления и удаления строк таблиц. Если в базе данных определен некоторый триггер, то он запускается автоматически всегда при возникновении события, с которым этот триггер связан. Очень важным является то, что пользователь не может обойти триггер. Триггер срабатывает независимо от того, кто из пользователей и каким способом инициировал событие, вызвавшее запуск триггера. Таким образом, основное назначение триггеров - автоматическая поддержка целостности базы данных. Триггеры могут быть как достаточно простыми, например, поддерживающими ссылочную целостность, так и довольно сложными, реализующими какие-либо сложные ограничения предметной области или сложные действия, которые должны произойти при наступлении некоторых событий. Например, с операцией вставки нового товара в накладную может быть связан триггер, который выполняет следующие действия - проверяет, есть ли необходимое количество товара, при наличии товара добавляет его в накладную и уменьшает данные о наличии товара на складе, при отсутствии товара формирует заказ на поставку недостающего товара и тут же посылает заказ по электронной почте поставщику.

 

По событию изменения триггеры различают на вызываемые при:

· Добавлении новой записи

· Изменении существующей записи

· Удалении записи

По отношению к событию, влекущему их вызов, триггеры различаются на:

· Выполняемые до наступления события

· Выполняемы после наступления события

 

Особенности триггеров:

· Непосредственно обратиться к триггеру нельзя

· Нельзя передавать параметры и получать значения выходных параметров

· Триггер всегда реализует действие

Преимущества использования триггеров:

· Автоматическое обеспечение каскадных воздействий, выполняющихся на сервере.

· Изменения в триггерах не влекут необходимости изменения клиентских приложений.

· Обязательное выполнение бизнес-правил, реализованных с использованием триггеров для всех приложений работающих с БД.

· Все изменения вносимые триггером выполняются в рамках одной транзакции. Как следствие, при откате транзакции откатываются также и все изменения, внесенные в БД триггерами.

Создание триггеров

Триггер создается оператором:

CREATE TRIGGER ИмяТриггера FOR ИмяТаблицы

[ ACTIVE | INACTIVE ]

{ BEFORE | AFTER }

{ DELETE | INSERT | UPDATE }

[ POSITION номер ]

AS

[<объявление локальных переменных>]

BEGIN

<оператор>

END

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

Заголовок триггера имеет следующие управляющие элементы:

ACTIVE | INACTIVE – указывает, активен триггер или нет. Можно определить триггер «про запас», установив для него INACTIVE. По умолчанию действует ACTIVE.

BEFORE | AFTER – указывает, будет выполнятьсятриггер до (BEFORE) или после (AFTER) запоминания изменений в БД.

DELETE | INSERT | UPDATE – указывает операцию над таблицей БД, при выполнении которой срабатывает триггер.

POSITION номер – указывает каким по счету будет выполняться триггер в случае наличия группы триггеров, обладающих одинаковыми характеристиками. Триггеры с меньшими номерами выполняются раньше

Пример.

Обеспечение каскадных воздействий):

CREATE TRIGGER AD_TOVARY FOR TOVARY

ACTIVE

AFTER DELETE

POSITION 1

AS

BEGIN

DELETE FROM RASHOD

WHERE RASHOD.TOVAR = TOVARY.TOVAR;

END

Значения OLD и NEW

Значение OLD.имя_столбца позволяет обратиться к состоянию столбца, имевшему место до внесения возможных изменений, а значение NEW.имя_столбца – к состоянию столбца, имевшему место после внесения возможных изменений.

Пример:

CREATE TRIGGER BU_TOVARY FOR TOVARY

ACTIVE

BEFORE UPDATE

AS

BEGIN

IF ( OLD.TOVAR <> NEW.TOVAR ) THEN

UPDATE RASHOD

SET TOVAR = NEW.TOVAR

WHERE TOVAR = OLD.TOVAR;

END

3.6.4. Изменение существующего триггера:

ALTER TRIGGER ИмяТриггера FOR ИмяТаблицы

[ ACTIVE | INACTIVE ]

{ BEFORE | AFTER }

{ DELETE | INSERT | UPDATE }

[ POSITION номер ]

AS <тело триггера>

3.6.5. Удаление триггера:

DROP TRIGGER ИмяТриггера