Пример 3. Таким образом, если возникает ситуация, когда на складе количество деталей какого-либо типа становиться меньше требуемого
Таким образом, если возникает ситуация, когда на складе количество деталей какого-либо типа становиться меньше требуемого, запускается процедура базы данных, которая заказывает недостающее количество деталей этого типа. Заказ сводится к посылке письма (например, по электронной почте) на завод или в цех, который изготавливает нужные детали. Процедура проверяет, был ли ранее сделан заказ, если - нет, то посылает письмо. Все это происходит автоматически, без вмешательства пользователя. Пример этот, разумеется, упрощенный - в нем не учтено, что заказ мог быть сделан и раньше.
Важнейшая цель механизма правил - обеспечить целостность базы данных. Один из аспектов целостности - целостность по ссылкам (referential integrity) - относится к связи двух таблиц между собой. Напомним, что эта связь поддерживается внешними ключами.
Пусть, например, таблица Руководитель содержит сведения о начальниках, а таблица Сотрудник - о сотрудниках некоторой организации (см. пример в 1.1.). Столбец Номер руководителя является внешним ключом таблицы Сотрудник и является ссылкой этой таблицы к таблице Руководитель.
Для обеспечения целостности ссылок должны быть учтены два требования. Во-первых, если в таблицу Сотрудник добавляется новая строка, значение столбца Номер_руководителя должно быть взято из множества значений столбца Номер таблицы Руководитель (сотрудник может быть подчинен только реальному руководителю). Во-вторых, при удалении любой строки из таблицы Руководитель в таблице Сотрудник не должно остаться ни одной строки, в которой в столбце Номер руководителя было бы значение, тождественное значению столбца Номер в удаляемой строке (все сотрудники, если их руководитель уволился, должны перейти в подчинение другому).
Как учесть эти требования на практике? Очевидно, должны быть созданы правила, их реализующие. Первое правило Добавить_сотрудника срабатывает при включении строки в таблицу Сотрудник; его применение заключается в вызове процедуры Проверить_руководителей, проверяющей, существует ли среди множества значений столбца Номер_руководителя значение, тождественное значению поля Номер добавляемой строки. Если это не так, процедура должна ее отвергнуть. Второе правило применяется при попытке удалить строку из таблицы Руководитель; оно состоит в вызове процедуры, которая сравнивает значения в столбце Номер_руководителя таблицы Сотрудник со значением поля Номер в удаляемой строке. В случае совпадения значения в столбце Номер_руководителя обновляются (Пример 4.)
CREATE RULE Добавить_сотрудника
AFTER INSERT INTO Сотрудник
EXECUTE PROCEDURE Проверить_руководителя (Номер = Сотрудник.Номер);
{ СОЗДАТЬ ПРАВИЛО Добавить_сотрудника
ПОСЛЕ ВКЛЮЧЕНИЯ В Сотрудник
ВЫПОЛНИТЬ ПРОЦЕДУРУ Проверить_руководителя (Номер=Сотрудник.Номер)
}
События в базе данных
Механизм событий в базе данных (database events) позволяет прикладным программам и серверу базы данных уведомлять другие программы о наступлении в базе данных определенного события и тем самым синхронизировать их работу. Операторы языка SQL, обеспечивающие уведомление, часто называют сигнализаторами событий в базе данных (database event alerters). Функции управления событиями целиком ложатся на сервер базы данных.
|
|
|
RBASE DBEVENT RBASE DBEVENT RBASE DBEVENT
Сервер
Уведомление о событии
|
Рисунок 1.
События в базе данных.
Рис.1 иллюстрирует один из примеров использования механизма событий: различные прикладные программы и процедуры вызывают события в базе данных, а сервер оповещает монитор прикладных программ об их наступлении. Реакция монитора на события заключается в выполнении действий, которые предусмотрел его разработчик.
Механизм событий используется следующим образом. Вначале в базе данных для каждого события создается флажок, состояние которого будет оповещать прикладные программы о том, что некоторое событие имело место (оператор CREATE DBEVENT - СОЗДАТЬ СОБЫТИЕ). Далее во все прикладные программы, на ход выполнения которых может повлиять это событие, включается оператор REGISTER DBEVENT (ЗАРЕГИСТРИРОВАТЬ СОБЫТИЕ), который оповещает сервер базы данных, что данная программа заинтересована в получении сообщения о наступлении события. Теперь любая прикладная программа или процедура базы данных может вызвать событие оператором RAISE DBEVENT (ВЫЗВАТЬ СОБЫТИЕ). Как только событие произошло, каждая зарегистрированная программа может получить его, для чего должна запросить очередное сообщение из очереди событий (оператор GET DBEVENT - ПОЛУЧИТЬ СОБЫТИЕ) и запросить информацию о событии, в частности, его имя (оператор SQL INQUIRE_SQL).
Пример 6 иллюстрирует обработку всех событий из очереди.
loop
EXEC SQL GET DBEVENT;
EXEC SQL INQUIRE_SQL (:event_name = DBEVENTNAME);
if (event_name = "event_1"
обработать событие event_1
else if (event_name = "event_2")
обработать событие event_2
else
...
endif
until event_name = " "
{ цикл
ПОЛУЧИТЬ СОБЫТИЕ
ПОЛУЧИТЬ ИМЯ СОБЫТИЯ
если (имя события = "первое событие")
обработать первое событие
иначе если (имя события = "второе событие")
обработать второе событие
иначе
...
конец если
пока имя события не равно пустой строке
}
Дата добавления: 2014-11-29; просмотров: 775;