Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
n Идентификатор заказа, order_id, numeric(5).
n Идентификатор товара, goods_id, numeric(3).
n Зарезервированное количество, count, numeric(2).
n Дата резервирования, date, date.
n Таблица «Предупреждения», warnings:
n Дата и время записи, date_time, timestamp.
n Содержание записи, messages, text.
n Дочерняя таблица order_warnings.
n Идентификатор заказа, order_id, numeric(5).
n Дочерняя таблица goods_warnings.
n Идентификатор товара, goods_id, numeric(3).
Поскольку предупреждения могут быть связаны как с заказом, так и с товаром, то для повышения наглядности воспользуемся такой возможностью PostgreSQL, как наследование таблиц. Родительская таблица warnings будет содержать все предупреждения, а дочерние order_warnings и goods_warnings – дополнять ее идентификаторами соответствующего заказа или товара.
Для решения указанных задач, как нетрудно догадаться, будем использовать триггеры. Напомню, что триггер – это связь хранимой процедуры с одной (или несколькими) из операций модификации, выполняемых над таблицей (UPDATE, INSERT, DELETE), автоматически запускающая эту процедуру (функцию) при получении соответствующего запроса. Нам понадобятся «базовый» триггер, выполняемый после операции добавления записи (INSERT) в таблицу orders – для решения задач 1-3, и триггер на операцию UPDATE таблицы warehouse для контроля обязательных остатков (задача 4). Функцию записи предупреждений каждый из этих триггеров будет выполнять в соответствии со своей «зоной ответственности».
Итак, создадим базу данных eshop, в которой и будем экспериментировать. В ней создаем структуру нашей БД:
create table orders(order_id serial, customer varchar, goods_id numeric(5), date date, count numeric(3), price numeric(7,2));
create table goods(goods_id serial, goods varchar, rest numeric(2));
create table warehouse(goods_id numeric(5), count numeric(5));
create table reserved(goods_id numeric(5), order_id numeric(5), count numeric(3), date date);
create table warnings(date date, message text);
create table order_warnings(order_id numeric(5)) inherits(warnings);
create table goods_warnings(goods_id numeric(5)) inherits(warnings);
Далее, нам нужно убедиться, что процедурный язык PL/pgSQL доступен в созданной базе. Для этого выполните следующую команду:
select * from pg_language;
Если plpgsql в полученном результате отсутствует, то из командной оболочки вашей ОС выполните следующую команду:
$ createlang –U pgsql plpgsql eshop
Опция –U задает пользователя – администратора БД, от имени которого будет выполняться данная операция.
Поддержка языка может быть включена и из программы-клиента (например, psql) выполнением следующих двух команд:
create function plpgsql_call_handler()