Команда CREATE TRIGGER

Создает для таблицы триггер Delete (удаления), Insert (добавления) или Update (обновления).

Синтаксис:

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

Параметры:
TableName
Задает таблицу в текущей базе данных, для которой создается триггер.
FOR DELETE | INSERT | UPDATE
Задает тип триггера, который создает Visual FoxPro.
Если триггер указанного типа уже существует и команда SET SAFETY установила значение ON, Visual FoxPro спросит, следует ли вести запись поверх существующего триггера. Если команда SET SAFETY установила значение OFF, запись будет автоматически вестись поверх существующего триггера.
AS lExpression
Задает логическое выражение, вычисляемое при выполнении триггера. В качестве lExpression может фигурировать функция, определенная пользователем, или хранимая процедура, возвращающая логическое значение. Хранимые процедуры можно создать для таблицы с помощью команды MODIFY PROCEDURE.
Пользовательская функция или хранимая процедура могут применять функцию AERROR( ), чтобы определить имя таблицы, для которой сработал триггер, и тип триггера.
Если вычисление выражения lExpression дает значение "истина" (.T.), выполняется команда или событие, которые привели к срабатыванию триггера.
Если значение выражения lExpression есть "ложь" (.F.), команда или событие, запустившие триггер, не выполняются. Если активна процедура ON ERROR, она будет выполнена вместо команды или события. Если процедура ON ERROR не является активной, команда или событие не выполняются, а выдает сообщение об ошибке.

Комментарии:
Пользуйтесь командой CREATE TRIGGER для того, чтобы отлавливать события, вызывающие удаление, добавление или изменение записей в таблице. Триггеры удаления, добавления или обновления можно создать только для таблицы, включенной в базу данных. Для создания базы данных используйте команду CREATE DATABASE, а для добавления в нее таблицы команду ADD TABLE.
Для команды CREATE TRIGGER необходимо монопольное использование базы данных. Чтобы открыть базу данных в монопольном режиме, включите предложение EXCLUSIVE в команду OPEN DATABASE.
В следующих списках перечисляются события, которые вызывают срабатывание триггеров Delete, Insert или Update.

Триггер Delete Выдана команда DELETE.
Запись помечается на удаление с помощью меню Table окна просмотра или окна редактирования.

Триггер Insert Выдана команда APPEND FROM.
Выдана команда APPEND FROM ARRAY
. Выдана команда APPEND BLANK.

Добавляется запись с помощью меню Table> окна просмотра или окна редактирования.
Выдана команда IMPORT.
Выдана команда INSERT - SQL.
Выдана команда RECALL.

Повторно вызывается запись с помощью меню Table окна просмотра или окна редактирования.

Триггер Update
Любое событие, вызывающее модификацию записи. Например, триггер Update срабатывает, когда какой-либо элемент управления в форме изменяет содержимое поля.
Выдана команда GATHER.
Выдана команда REPLACE.
Выдана команда REPLACE FROM ARRAY.
Выдана команда UPDATE - SQL.

В отношении триггеров, созданных с помощью команды CREATE TRIGGER, действуют следующие правила:
Команду INSERT нельзя выдавать для таблицы с триггером. Однако можно использовать команду INSERT - SQL.
Выдача команды PACK не приводит к срабатыванию триггеров.
Выдача команды ZAP не приводит к срабатыванию триггера Delete.
При обновлении записи, помеченной на удаление, никакие триггеры не срабатывают.
Режим буферизации может препятствовать немедленному срабатыванию триггера:
Если буферизация таблицы не действует, триггер Update срабатывает при обновлении записи, что происходит после проверки правил и ключей первичного индекса и индекса-кандидата.
Если буферизация таблицы действует, триггер Update срабатывает после выдачи команды TABLEUPDATE( ) и обновлении каждой буферизованной записи в таблице.

Пример:

* В следующем примере создается триггер Update, который
* предотвращает ввод в поле maxordamt таблицы customer значений свыше
* 50. Когда выполняется первая команда REPLACE из-за того, что значение
* поля maxordamt превысило 50, генерируется сообщение об ошибке. Вторая
* команда REPLACE не генерирует ошибку, поскольку значение в поле
* maxordamt не превышает 50.

CLOSE DATABASES
SET PATH TO (SYS(2004) + 'samples\data\')	&& Sets path to database
OPEN DATABASE testdata  && Open testdata database
USE customer  && Open customer table

CREATE TRIGGER ON customer FOR UPDATE AS maxordamt <= 50
ON ERROR  && Restore the system error handler
REPLACE maxordamt WITH 60  && Displays an error message
REPLACE maxordamt WITH 50  && Value is acceptable

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 14.12.2002