Триггеры (trigger) – это SQL предложения, которые инициируются при выполнении определенных операций над объектами базы данных. Мы рассмотрим в качестве объектов базы данных – таблицы, а в качестве операций – вставку, удаление и замену строк. Триггеры – это один из механизмов поддержания целостности базы данных.
В простейшем виде спецификация триггера имеет следующий синтаксис:
CREATE TRIGGER trigger_name
FOR { DELETE, INSERT, UPDATE [OF columns_list], }
ON table_name
[WHEN (condition)]
SQL_Statements
Смысл его следующий. При выполнении операции INSERT, UPDATE или DELETE над таблицей table_name и при выполнении условия condition выполнить предложения из SQL_Statements. Конструкция FOR…ON называется инициирующим предложением (triggering statement), WHEN – условием инициирования триггера (WHEN clause), а SQL_Statements – действием триггера (trigger body). Рассмотрим несколько примеров.
1) При вставке или обновлении строки в таблице DEPARTMENT установить значение поля Fund в таблице FACULTY равным сумме фондов всех кафедр соответствующего факультета.
CREATE TRIGGER Faculty_Fund_Update
FOR INSERT, UPDATE
ON DEPARTMENT
UPDATE FACULTY
SET Fund = SELECT SUM(Fund)
FROM DEPARTMENT
WHERE DEPARTMENT.#F = DEPARTMENT.NEW.#F
WHERE FACULTY.#F = DEPARTMENT.NEW.#F
Доступ к старым и новым значениям строк. Если производится обновление строк таблицы, то в триггере допускается обращение к старым и новым значениям обновляемых строк. Это достигается использованием квалификатора NEW/OLD перед именем колонки. Такие квалификаторы допускается использовать как в условии триггера, так и в описании его действия.
2) При удалении информации о кафедре удалить сведения о всех преподавателях кафедры
CREATE TRIGGER Department_Delete
FOR DELETE
ON DEPARTMENT
DELETE FROM TEACHER
WHERE TEACHER.#D = DEPARTMENT.#D
3) При удалении строки о преподавателе установить значение NULL во всех тех столбцах #Curator таблицы GROUP, в которых этот преподаватель был куратором.
CREATE TRIGGER Teacher_Delete
FOR DELETE
ON TEACHER
UPDATE GROUP
SET #Curator = NULL
WHERE GROUP.#T = TEACHER.#T
Триггеры и транзакции. Неявно подразумевается, что действия по выполнению основной операции и выполняемые в триггере, составляют единую транзакцию. Это означает выполнение следующих действий:
· Перед выполнением вставки, обновления, удаления неявно инициируется команда BEGIN TRANSACTION.
· Выполняется операция вставки/обновления/удаления.
· Вызывается и выполняется триггер.
· Либо триггер явно производит откат транзакции, либо по умолчанию триггер завершается.
Таким образом, при необходимости триггер может инициировать откат транзакции.
4) Строка о кафедре может быть вставлена только в том случае, когда существует строка о факультете, которому принадлежит кафедра (кафедра без факультета не может существовать в базе данных)
CREATE TRIGGER Department_Insert
ON DEPARTMENT
FOR INSERT
WHEN NOT EXIST ( SELECT * FROM FACULTY WHERE FACULTY.#F = DEPARTMENT.#F )
begin
ROLLBACK TRANSACTION
end
Как видим, в качестве SQL предложений во фразе AS можно использовать команду if. В этом примере проверяется, существует ли факультет с таким номером, который указывается во вставляемой строке кафедры, и если нет, то производится откат транзакции.
Вложенность триггеров. Триггеры могут быть вложенными. Это означает следующее: манипулирование строкой одной таблицы может инициировать триггер, который производит манипулирование строками другой таблицы. В свою очередь, манипулирование строками второй таблицы может инициировать триггер, который производит манипулирование строками третьей таблицы, и т.д.
Помните, что вложенность триггеров может приводить к их "зацикливанию".
Ограничение на использование триггеров:
· Триггеры не могут определяться к виртуальным таблицам.
· При удалении таблицы, все связанные с ним триггеры также удаляются.
· Триггеры могут определяться только к уже созданным таблицам.