Утверждения в SQL

Утверждения накладывает ограничение на содержимое всей БД, т.е. ограничивает содержимое нескольких таблиц, а также отношения между таблицами.
Затраты на выполнение проверок, связанных с утверждениями, бывают очень значительными.

1) Создание утверждения
CREATE ASSERTION <имя утверждения>
CHEK <предикат>
[[NOT] DEFERRABLE]
[INITIALLY IMMEDIATE|DEFERRED]

Примечание:
CHECK <предикат> определяет логическое выражение для проверки значения.
<предикат> может иметь ссылку на любую таблицу схемы и включать запрос

2) Удаление утверждения
DROP ASSERTION <имя ограничения>

3) Установка момента проверки ограничений
SET CONSTRAINTS MODE <имя ограничения, …>|ALL [IMMEDIATE|DEFERRED]

Примечание:
IMMEDIATE – ограничение, объявленные с DEFERRABLE, теперь проверяются сразу после каждого оператора.
DEFERRED – ограничения проверяются в конце транзакции.
После оператора COMMIT обычно проверка ограничения переводится в режим IMMEDIATE.

4) Сравнение различных ограничений

Тип ограничения Где описывается Когда действуют Обязательно ли выполняются
Основанное на атрибуте CHECK Вместе с атрибутом При изменении атрибута Нет, если включает подзапрос
Основанное на кортеже CHECK Как элемент базы данных При изменение кортежа Нет, если включает подзапрос
Утверждение Как элемент базы данных При изменении любого из упомянутых отношений Да

5) Примеры не срабатывания ограничений
a) Основанное на атрибуте ограничение
SNum Integer CHECK (SNum IN (SELECT SNum FROM SalesPeople)) – номер продавца должен соответствовать имеющемуся номеру из таблицы SalesPeople.

Если при определении таблицы Orders указать такое ограничение на значении атрибута SNum, то при добавлении и измени атрибута все будет работать нормально
Однако при удалении продавца из таблицы SalesPeople, данное ограничение проверяться не будет.

b) Основанное на кортеже ограничение
CHECK (1000>=All (SELECT SUM(Amt) FROM Orders GROUP BY SNum)) – условие касается любого кортежа, но в нем в явном виде не указан ни один атрибут. Вся работа выполняется в подзапросе.

При удалении кортежа из Orders условие продолжает выполняться, если выполнялось до этого.

Однако, если бы условие было обратным (<=ALL), то при сравнении строки условие может нарушиться, но не проверяется.


Комментарии запрещены.





Статистика

Рейтинг@Mail.ru