Утверждения в 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), то при сравнении строки условие может нарушиться, но не проверяется.


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




Статистика