![](/user_photo/2706_HbeT2.jpg)
Изменение и удаление хранимых процедур
Изменение хранимой процедуры производится оператором
ALTER PROCEDURE <имя процедуры>
[(<входной параметр > <тип данных>
[,<входной параметр > <тип данных> …])]
[RETURNS
[(<выходной параметр > <тип данных>
[,<выходной параметр > <тип данных> …])]
AS
<тело процедуры>;
Принципы построения оператора аналогичны изложенным выше принципам построения оператора CREATE PROCEDURE.
Для удаления хранимой процедуры из БД используется оператор
DROP PROCEDURE <имя процедуры>
Работа с триггерами
Триггер – процедура базы данных, автоматически вызываемая сервером при обновлении,, удалении или добавлении новой записи в таблицу. Нельзя обратиться к триггерам непосредственно из программы. Нельзя передавать триггерам входные параметры и получать от них значения выходных параметров, т.е. триггеры всегда реализуют действие.
По событию изменения таблицы БД триггеры различаются на вызываемые при
добавлении новой записи;
изменении существующей записи;
удалении записи.
По отношению к событию, влекущему их вызов, триггеры различают на:
выполняемые до наступления события;
выполняемые после наступления события;
Преимущества использования триггеров:
автоматическое обеспечение каскадных воздействий в дочерних таблицах, т.к. каскадные воздействия выполняет сервер, нет необходимости пересылать изменения таблицы в базе данных на сервер, что снижает нагрузку сети;
изменения в триггерах не влекут необходимости изменения программного кода в клиентских приложениях и не требуют распространения новых версий клиентских приложений.
При откате транзакции отменяются также и все изменения, внесенные в базу данных триггерами.
Создание триггеров.
Триггер создается оператором
CREATE TRIGGER <имя триггера> FOR <имя таблицы>
[ACTIVE/INACTIVE]
{BEFORE/AFTER}
{DELETE/INSERT/UPDATE}
[POSITION номер]
AS <тело триггера>
Для определения тела триггера используется процедурный язык (по аналогии с ХП). В него добавляется возможность доступа к старому и новому значениям столбцов изменяемой записи OLD и NEW – возможность недоступная при определении тела хранимых процедур.
Структура тела триггера:
[<объявление локальных переменных>]
BEGIN
<оператор>
[<оператор>…]
END
В заголовке триггера:
[ACTIVE/INACTIVE] – указывает, активен триггер или нет (по умолчанию ACTIVE) В процессе работы триггер можно переопределить как активный или неактивный.
{BEFORE/AFTER} – указывает, будет выполняться триггер до (BEFORE) или после (AFTER) запоминания изменений в базе данных.
{DELETE/INSERT/UPDATE} – указывает операцию над таблицей базы данных, при выполнении которой срабатывает триггер.
[POSITION номер] – указывает, каким по счету будет выполняться триггер в случае наличия группы триггеров, обладающих одинаковыми характеристиками операции и времени вызова триггера. Триггеры с меньшими номерами выполняются раньше.
Пример:
CREATE TRIGGER A FOR RASHOD
BEFORE INSERT POSITION 1 …
Значение 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
В этом примере триггер вносит соответствующие изменения в таблицу RASHOD, если в записи таблицы TOVARY изменилось значение столбца TOVAR.