Разрешение и запрет ограничений

Oracle SQL позволяет запретить или разрешить проверку ограничения, например, для ускорения загрузки большого количества строк. После выполнения операции, которую может сильно замедлить проверка ограничений, действие ограничений можно опять разрешить. Для запрета и разрешения ограничений используются ключевые слова DISABLE и ENABLE.

ALTER TABLE [схема.]имя_таблицы {ENABLE | DISABLE} CONSTRAINT имя_ограничения [CASCADE]

При разрешении ограничений UNIQUE и PRIMARY KEY автоматически создаются соответствующие индексы. Запретить и разрешить действие ограничения можно, также, при создании таблицы командой CREATE TABLE. Для запрета всех зависимых ограничений используйте ключевое слово CASCADE.

SQL> SELECT constraint_name, constraint_type, status

2 FROM user_constraints WHERE table_name IN ('T1', 'T2');

CONSTRAINT_NAME C STATUS

------------------------------ - --------

T1_PK P ENABLED

T2_FIRST_FK R ENABLED

SQL> ALTER TABLE t1 DISABLE CONSTRAINT t1_pk CASCADE;

Table altered.

SQL> SELECT constraint_name, constraint_type, status

2 FROM user_constraints WHERE table_name IN ('T1', 'T2');

CONSTRAINT_NAME C STATUS

------------------------------ - --------

T1_PK P DISABLED

T2_FIRST_FK R DISABLED

Если Вы разрешаете ограничения, все данные в таблице должны ему соответствовать. В противном случае сервер Оracle вернет ошибку.

Например, пустая таблица t1 имеет первичный ключ. Таблица t2 имеет колонку, на которую наложено ограничение внешнего ключа, ссылающееся на таблицу t1. Запрещение действия ограничения внешнего ключа позволило вставить в таблицу t2 строки, содержащие внешний ключ, значения которого не соответствуют ни одному значению первичного ключа в таблице t1. Однако при попытке разрешить ограничение внешнего ключа сервер Oracle выдает ошибку, сообщающую о том, что родительский ключ для ограничения не найден.

SQL> SELECT * FROM t1;

no rows selected

SQL> SELECT * FROM t2;

FIRST NAME

--------- --------------------

1 One

2 Two

SQL> ALTER TABLE t1 ENABLE CONSTRAINT t1_pk;

Table altered.

SQL> ALTER TABLE t2 ENABLE CONSTRAINT t2_first_fk;

ALTER TABLE t2 ENABLE CONSTRAINT t2_first_fk

*

ERROR at line 1:

ORA-02298: cannot validate (INSTRUCTOR.T2_FIRST_FK) - parent keys not found

SQL> INSERT INTO t1 VALUES (1, 1);

1 row created.

SQL> INSERT INTO t1 VALUES (2, 2);

1 row created.

SQL> ALTER TABLE t2 ENABLE CONSTRAINT t2_first_fk;

Table altered.