Распечатать страницу

Триггеры в Microsoft Visual FoxPro

« Назад

Триггер оформляется в виде логического выражения, употребляемого для проверки корректности операций по модификации таблицы базы данных. Триггер может быть создан либо интерактивно (см. разд. 2.4), либо программно для проверки операции удаления, вставки или обновления.

Свободная, не входящая в базу данных таблица триггеров иметь не может.

Команда

CREATE TRIGGER ON TableName FOR DELETE | INSERT |
                   UPDATE AS lExpression

создает триггер удаления, вставки или обновления для таблицы TableName текущей базы данных.

Опции и параметр:

FOR DELETE | INSERT | UPDATE – задает тип триггера. Если SET SAFETY установлен в ON и триггер уже существует, то возникнет предупреждение.

AS lExpression – задает логическое выражение, оцениваемое при выполнении триггера. Может быть пользовательской функцией, размещенной, например, в хранимых процедурах базы данных.

Для анализа ошибки функция, реализующая lExpression, может включать AERROR( ).

Если при срабатывании триггера обнаружена ошибка (lExpression возвращает .T.), то выполнится ON ERROR-процедура, если она активизирована, или обработчик соответствующего события Error. При отсутствии процедуры (обработчика) сообщение об ошибке генерируется системным обработчиком VFP. Команда или событие, приведшее к отказу триггера, не выполняется.

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

  • триггер удаления:

DELETE;

запись получает пометку удаления интерактивно;

  • триггер вставки:

APPEND FROM или APPEND FROM ARRAY, или APPEND BLANK;

запись добавляется интерактивно;

IMPORT;

INSERT – SQL;

RECALL;

пометка удаления снимается интерактивно;

  • триггер обновления:

GATHER;

REPLACE или REPLACE FROM ARRAY;

UPDATE – SQL;

интерактивное изменение записи.

Замечание. Команда INSERT не может употребляться с таблицей, имеющей триггер вставки, взамен используется INSERT – SQL.

При работе с триггерами следует учитывать, что:

  • выполнение PACK не приводит к срабатыванию ни одного из триггеров;

  • выполнение ZAP не приводит к срабатыванию триггера удаления;

  • триггеры не выполняются, когда обновляется запись с пометкой удаления;

  • в зависимости от способа буферизации может возникнуть задержка выполнения триггера.

Пример:

close databases

open database d:\HomeLibrary\HomeLibrary.dbc

&& Создаем триггер обновления

create trigger on Authors for update as AuthorId >= 0

use Authors

&& Если теперь выполнить команду

&& replace AuthorId with –1

&& то откажет триггер обновления и возникнет ошибка

&& Record validation rule is violated

Системная переменная

_TRIGGERLEVEL = nExpression

содержит доступное только для чтения число, показывающее уровень вложения текущей процедуры триггера. Если триггер не исполняется, то _TRIGGERLEVEL содержит 0.

Команда

DELETE TRIGGER ON TableName FOR DELETE | INSERT | UPDATE

удаляет триггер удаления, вставки или обновления для таблицы TableName текущей базы данных.