Оператор 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 ИмяТриггера