Создает триггер
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 можно использовать только в триггерах событий, где они имеют смысл:
Если задано условие 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 customersBEGINUPDATE orders SET address = new.addressWHERE 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
Предыдущий раздел: перейти