144
Следующий пример содержит именованное ограничение, связывающее
значения в двух столбцах:
CREATE TABLE dept (
dname char(10),
budget money,
expenses money,
CONSTRAINT check_amount CHECK (budget > 0 and expenses <=
budget)
);
{Бюджет должен быть положительным, а расходы не должны выходить
за рамки бюджета}
Ссылочные ограничения отвечают за
целостность связей между
таблицами. Подобное ограничение требует, чтобы каждому значению в
столбце или группе столбцов одной таблицы соответствовало ровно одно
значение в другой таблице. Название ограничения объясняется тем, что такие
значения играют роль ссылок между таблицами в реляционной модели.
Приведем пример ссылочного ограничения:
CREATE TABLE emp (
ename char(10),
edept char(10) references dept(dname)
);
{Ни один работник не должен числиться в неизвестном отделе}
Ограничения всех видов накладываются владельцем таблицы и влияют
на исход последующих операций с данными. Перед завершением
выполнения
SQL-оператора
производится
проверка
имеющихся
ограничений. При обнаружении нарушений
СУБД сигнализирует о
ненормальном завершении и аннулирует внесенные оператором изменения.
Отметим, что для наложения ссылочного ограничения необходимо
обладать привилегией REFERENCES по отношению к таблице, на которую
делается ссылка (dept в примере выше).
145
Ограничения можно не только накладывать, но и отменять.
При этом
между ограничениями могут существовать зависимости, и отмена одного из
них может потребовать ликвидации других (ссылочных) ограничений,
зависящих от первоначального. Рассмотрим следующий пример:
CREATE TABLE dept (
name char(10) NOT NULL,
location char(20),
CONSTRAINT dept_unique UNIQUE(name)
);
CREATE TABLE emp (
name char(10),
salary decimal(10,2),
edept char(10) CONSTRAINT empref REFERENCES dept(name)
);
Если
требуется
удалить
ограничение
dept_unique,
можно
воспользоваться следующим оператором:
ALTER TABLE dept
DROP CONSTRAINT dept_unique cascade;
Слово cascade означает, что следует
удалить также все ограничения,
прямо или косвенно зависящие от dept_unique. В данном случае будет изъято
ограничение empref. Если вместо cascade указать restrict, то есть сделать
попытку удалить только ограничение dept_unique, СУБД зафиксирует
ошибку. Тем самым обеспечивается целостность системы ограничений.
В СУБД INGRES делается попытка примирить контроль ограничений и
эффективность функционирования. При массовом копировании данных
контроль ограничений отключается. Это
значит, что необходимо дополнять
копирование запуском процедуры глобальной проверки целостности.
Do'stlaringiz bilan baham: