Триггерная функция check_shipment_addition()
Листинг 11.52. Триггерная функция check_shipment_addition()
CREATE FUNCTION check_shipment_addition () RETURNS opaque AS '
DECLARE
-- Объявление переменной для хранения кода покупателя,
idjiumber integer;
-- Объявление переменной для хранения кода ISBN.
book_isbn text;
BEGIN
-- Если в таблице customers существует код. совпадающий с кодом
-- покупателя в таблице new. присвоить его переменной idjiumber.
SELECT INTO idjiumber id FROM customers WHERE id = NEW.customer_id:
-- Если совпадение не найдено, инициировать исключение.
IF NOT FOUND THEN
RAISE EXCEPTION "Invalid customer ID number.":
END IF;
-- Если в таблице editions существует код ISBN, совпадающий с кодом
-- ISBN в таблице new. присвоить его переменной bookjsbn.
SELECT INTO bookjsbn isbn FROM editions WHERE isbn = NEW.isbn;
-- Если совпадение не найдено, инициировать исключение.
IF NOT FOUND THEN
RAISE EXCEPTION "Invalid ISBN.";
END IF:
-- Если обе предыдущие проверки завершились успешно.
-- обновить количество экземпляров.
IF TG_OP - "INSERT" THEN
UPDATE stock SET stock = stock -1 WHERE isbn = NEW.isbn;
END IF:
RETURN NEW:
END;
' LANGUAGE 'plpgsql':
После создания функции check_shi pment_addi ti on() в таблице shi pments устанавливается триггер для ее вызова. В листинге 11.53 приведен синтаксис команды, создающей триггер check_shipment в базе данных booktown (для клиента psql).