Операционная система ЗОСРВ «Нейтрино» > Руководство разработчика > Программные интерфейсы общего назначения > Прикладные библиотеки и технологии > Библиотека менеджера QDB > Справочник по командам SQL, поддерживаемым менеджером QDB > SQL: CREATE TRIGGER



SQL: CREATE TRIGGER

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

Прототип:

CREATE [TEMP | TEMPORARY] TRIGGER [IF NOT EXISTS] имя_триггера
[BEFORE | AFTER] событие_базы_данных ON [имя_базы_данных .]
имя_таблицы действие_по_триггеру
CREATE [TEMP | TEMPORARY] TRIGGER [IF NOT EXISTS] имя_триггера
INSTEAD OF событие_базы_данных ON [имя_базы_данных .]
имя_представления действие_по_триггеру
событие_базы_данных = DELETE |
INSERT |
UPDATE |
UPDATE OF список_столбцов
действие_по_триггеру = [FOR EACH ROW] [WHEN выражение]
BEGIN
ступень_триггера ; [ступень_триггера ;]*
END
ступень_триггера = оператор_update | оператор_insert |
оператор_delete | оператор_select

Описание:

Команда CREATE TRIGGER добавляет триггеры в схему базы данных. Триггеры — это операции (действие_по_триггеру), которые автоматически выполняются при наступлении определенного события, связанного с базой данных (событие_базы_данных).

Триггер может срабатывать при выполнении оператора DELETE, INSERT или UPDATE над конкретной таблицей базы данных либо при обновлении одного или нескольких заданных столбцов таблицы.

На текущий момент QDB поддерживает только триггеры FOR EACH ROW и не поддерживает триггеры FOR EACH STATEMENT; по этой причине указывать ключевые слова FOR EACH ROW не обязательно. При использовании цикла FOR EACH ROW указанные операторы SQL (ступени_триггера) могут выполняться (в зависимости от условия WHEN) для каждой строки, которая вставляется, обновляется или удаляется оператором, активировавшим триггер.

Для доступа к элементам вставляемой, удаляемой или обновляемой строки в условии WHEN и операторах ступени_триггера можно использовать ссылки вида NEW.имя_столбца и OLD.имя_столбца, где имя_столбца — имя столбца таблицы, с которой связан триггер. Ссылки OLD и NEW можно использовать только в триггерах событий, где они имеют смысл:

INSERT
NEW ссылки доступны для использования
UPDATE
NEW и OLD ссылки доступны для использования
DELETE
OLD ссылки доступны для использования

Если задано условие WHEN, операторы SQL, которые указаны в параметре ступени_триггера, выполняются только над строками, которые удовлетворяют этому условию. В отсутствие условия WHEN операторы выполняются над всеми строками.

Параметр время_активации_триггера определяет момент активации ступеней триггера по отношению к операции вставки, изменения или удаления соответствующей строки.

Условие ON CONFLICT можно указывать в ступени триггера UPDATE или INSERT. Тем не менее, если условие ON CONFLICT задано в операторе, который активирует триггер, применяется алгоритм разрешения конфликтов, указанный в этом условии.

Триггеры автоматически удаляются при удалении таблицы, с которой они связаны.

Можно создавать триггеры не только в обычных таблицах, но и в представлениях, указывая аргумент INSTEAD OF в операторе CREATE TRIGGER. Если в представлении определены один или несколько триггеров ON INSERT, ON DELETE, или ON UPDATE, выполнение соответствующего оператора INSERT, DELETE или UPDATE над этим представлением не является ошибкой и активирует указанные триггеры. Реальные таблицы, из которых сформировано представление, не изменяются (если программа-триггер не вносит в них изменения непосредственно).

Пример:

Если записи о клиентах хранятся в таблице customers(), а записи о заказах — в таблице orders(), следующий триггер перенаправляет все заказы клиента, который сменил свой адрес:

CREATE TRIGGER update_customer_address UPDATE OF address ON customers
BEGIN
UPDATE orders SET address = new.address
WHERE customer_name = old.name;
END;

После установки этого триггера при выполнении оператора:

UPDATE customers SET address = '1 Main St.'
WHERE name = 'Jack Jones';

автоматически выполняется оператор:

UPDATE orders SET address = '1 Main St.'
WHERE customer_name = 'Jack Jones';

Следует иметь в виду, что при выполнении триггеров таблиц, которые содержат поля INTEGER PRIMARY KEY, могут возникать проблемы. Если триггер BEFORE изменяет поле INTEGER PRIMARY KEY строки, которая затем обновляется оператором, активирующим триггер, это обновление может не срабатывать. Для устранения этой проблемы можно объявить таблицу со столбцом PRIMARY KEY вместо INTEGER PRIMARY KEY.

В триггере можно вызывать специальную функцию SQL с именем RAISE(), которая имеет следующий синтаксис:

RAISE ( ABORT, сообщение_об_ошибке ) |
RAISE ( FAIL, сообщение_об_ошибке ) |
RAISE ( ROLLBACK, сообщение_об_ошибке ) |
RAISE ( IGNORE )

Когда триггер вызывает функцию в одном из трех указанных форматов, выполняется соответствующий алгоритм ON CONFLICT (ABORT, FAIL или ROLLBACK) и текущий запрос завершается. Пользователю возвращается код ошибки SQLITE_CONSTRAINT и указанное сообщение об ошибке.

Вызов RAISE( IGNORE ) прекращает выполнение оставшейся части текущей программы-триггера, оператора, который активировал ее, и всех последующих программ, которые должны были быть выполнены. Изменения, внесенные в базу данных, не аннулируются. Если оператор, который активировал триггер, сам входит в состав триггера, выполнение триггера верхнего уровня возобновляется с начала следующей ступени.

Для удаления триггеров используется оператор SQL: DROP TRIGGER.

Тематические ссылки:

Выражения в SQL запросах, Ключевые слова, поддерживаемые QDB




Предыдущий раздел: перейти