Триггеры базы данных
В приложениях часто необходимо задавать сложные рабочие правила, которые невозможно выразить с помощью ограничений целостности. Вместо того. чтобы прибегать к сложному правилу целостности в самом приложении, вы можете использовать триггеры базы данных, с помощью которых 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, ...)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.