Разработка приложений в системе клиент/сервер Oracle7, страница 5

Триггеры базы данных

В приложениях часто необходимо задавать сложные рабочие правила, которые невозможно выразить с помощью ограничений целостности. Вместо того. чтобы прибегать к сложному правилу целостности в самом приложении, вы можете использовать триггеры базы данных, с помощью которых Oracle7 обеспечивает применение данного правила, которые позволяют задавать сложные рабочие правила и дают вам преимущества простоты создания, централизованного определе­ния правил и устранения ненужного сетевого ввода-вывода.

Триггеры базы данных вы можете использовать также для централизации и автоматизации других типов операций приложения. Рассмотрим, например, стол­бец TOTAL таблицы ITEM. Значение в столбце TOTAL - это произведение числа заказанных единиц на цену каждой единицы. Цена единицы содержится в таблице STOCK. Как приложение должно вычислять значение столбца TОТАL при вставке нового элемента строки? Один из способов состоит в выполнении этой операция в приложении с помощью операторов SQL:

DECLARE

 partprice REAL;

BEGIN

SELECT unitprice INTO partprice

FROM stock

 WHERE id = 4

--другие операции приложения для вычисления

 INSERT INTO item VALUES (...)

END;

Заметим, что для получения цены единицы приложение дает запрос по сети. а затем вставляет строку и вычисляет сумму. Нужно иметь в виду, что приложение должно также содержать аналогичную логику для тех ситуаций, когда пользовате­ли обновляют величину элемента строки в таблице ITEM. Кроме того, многие пользователи могут включать и обновлять заказы в одно и то же время Короче говоря, такой метод вычисления столбца TOTAL может создавать  в системе  клиент/сервер интенсивный сетевой трафик.

В качестве альтернативного способа, когда пользователь вставляет новые строки или обновляет в таблице ITEM столбец QUANTITY, вы можете для автомати­ческого получения для строки значения TOTAL без какого-либо сетевого доступа  использовать триггер базы данных. Приведем пример:

CREATE TRIGGER linetotal

BEFORE INSERT OR UPDATE OF quantity, stockid ON item

FOR EACH ROW

 DECLARE

iteinprice REAL;

        BEGIN

SELECT unitprice INTO itemprice

FROM stock WHERE id= :new.stockid:

:new.total := :new.quantity * itemprice;

        END linetotal;

После создания триггера LINETOTAL при программировании приложения перед его разработчиками не будет стоять проблема поддержания текущего состо­яния столбца TOTAL. Кроме того, уменьшение сетевого ввода-вывода положи­тельно влияет на всех клиентов сетевой СУБД.

Это лишь один из примеров того, как разработчики могут в системе базы данных Oracle7 с выгодой использовать триггеры базы данных. (О триггерах базы данных подробнее рассказывалось в главе 2. а в главе 8 объясняется как создавать триггеры базы данных для схемы приложения.)

Процедуры и пакеты

В предыдущих двух разделах пояснялось, что в СУБД Oracle7 можно умень­шить сетевой ввод-вывод перемещением логики приложения в форме ограничений целостности и триггеров базы данных на сервер СУБД. Еще больше вы можете уменьшить сетевой ввод-вывод приложения клиент/сервер путем переноса на сер­вер и других операций приложения, для чего применяются хранимые процедуры. Так вместо использования интенсивно загружающих сеть операторов SQL. выпол­няющих серверные операции базы данных, приложения могут применять простые и эффективные вызовы хранимых процедур. Инкапсулировать в базе данных не­сколько родственных процедур можно с помощью пакетов.

Хранимые процедуры Чтобы проиллюстрировать разницу между использова­нием SQL и применением хранимых процедур, предположим, что вы хотите вклю­чить в таблицу информацию о новом заказе с некоторыми видами продукции:

INSERT INTO orders VALUES (...)

 INSERT INTO item VALUES (1, ...)