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