Создание триггера
После создания функции check_shipment_addition() в таблице shipments устанавливается триггер для ее вызова.
Триггер создается на основе существующей функции. PostgreSQL позволяет создавать функции на разных языках программирования, в том числе на SQL, PL/pgSQL и С. В PostgreSQL триггеры могут вызывать функции, написанные на любом языке, но за одним исключением: функция не может быть полностью реализована на SQL.
В определении триггера указывается, должна ли заданная функция вызываться до или после выполнения некоторой операции с таблицей. Синтаксис определения триггера:
CREATE TRIGGER триггер
{ BEFORE | AFTER } { событие [ OR событие ...]}
ON таблица
FOR EACH { ROW STATEMENT }
EXECUTE PROCEDURE функция ( аргументы )
Ниже приводятся краткие описания компонентов этого определения.
– CREATE TRIGGER триггер. В аргументе триггер указывается произвольное имя создаваемого триггера. Имя может совпадать с именем триггера, уже существующего в базе данных – при условии, что этот триггер установлен для другой таблицы. Кроме того, по аналогии с большинством других несистемных объектов баз данных, имя триггера (в сочетании с таблицей, для которой он устанавливается) должно быть уникальным лишь в контексте базы данных, в которой он создается.
– {BEFORE AFTER}. Ключевое слово BEFORE означает, что функция должна выполняться перед попыткой выполнения операции, включая все встроенные проверки ограничений данных, реализуемые при выполнении команд INSERT и DELETE. Ключевое слово AFTER означает, что функция вызывается после завершения операции, приводящей в действие триггер.
– {событие [OR событие ... ]}. События SQL, поддерживаемые в PostgreSQL При перечислении нескольких событий в качестве разделителя используется ключевое слово OR.
– ON таблица. Имя таблицы, модификация которой заданным событием приводит к срабатыванию триггера.
– FOR EACH {ROW STATEMENT}. Ключевое слово, следующее за конструкцией FOR EACH и определяющее количество вызовов функции при наступлении указанного события. Ключевое слово ROW означает, что функция вызывается для каждой модифицируемой записи. Если функция должна вызываться всего один раз для всей команды, используется ключевое слово STATEMENT.
– EXECUTE PROCEDURE функция ( аргументы ). Имя вызываемой функции с аргументами.
ПРИМЕЧАНИЕ. Создание триггеров разрешено только владельцу базы данных или суперпользователю.
Механизм ограничений PostgreSQL позволяет реализовать простое сравнение данных со статическими значениями, но иногда проверка входных данных должна производиться по более сложным критериям. Это типичный пример ситуации, в которой удобно воспользоваться триггером.
Проверка входных данных с применением триггеров может осуществляться перед вставкой данных в таблицу или перед их обновлением в таблице. Функция триггера может убедиться в том, что новые данные удовлетворяют сложной системе ограничений, и даже вернуть признак ошибки через систему регистрации ошибок PostgreSQL.
Предположим, вы написали на процедурном языке функцию, которая проверяет данные, переданные при вызове команды INSERT или UPDATE для таблицы shipments, и затем обновляет таблицу stock, снимая поставленный товар со складского учета. Такую функцию можно написать на любом языке, поддерживаемом PostgreSQL (кроме «чистого» SQL, о чем говорилось выше).
Прежде всего функция убеждается в том, что переданный код покупателя (customer_id) и код ISBN (isbn) присутствуют в таблицах customers и editions. Если хотя бы один из кодов отсутствует, функция возвращает признак ошибки. Если оба кода присутствуют в таблицах, команда SQL выполняется, и после успешного завершения количество товара на складе в таблице stock автоматически уменьшается в соответствии с объемом поставки.
Триггер, создаваемый в листинге 6.45, срабатывает непосредственно перед выполнением команды INSERT или UPDATE в таблице shipments. Триггер вызывает функцию check_shipment _addition() для каждой изменяемой записи.
Листинг 6.45. Создание триггера check_shipment
CREATE TRIGGER check_shipment
BEFORE INSERT OR UPDATE
ON shipments
FOR EACH ROW
EXECUTE PROCEDURE check_shipment_addition();
Триггер check_shipment настроен на выполнение функции check_shipment_addition() для команд INSERT и UPDATE, поэтому он достаточно надежно обеспечивает логическую целостность данных в полях customer_id и isbn. Ключевое слово ROW гарантирует, что каждая добавляемая или модифицируемая запись будет обработана функцией проверки check_shipment _addition().
Функция check_shipment_addition() вызывается без аргументов, поскольку для проверки записей в ней используются внутренние переменные PL/pgSQL.
Дата добавления: 2015-02-03; просмотров: 1514;