Как изменить существующее ограничение проверки? - PullRequest
61 голосов
/ 22 февраля 2011

Есть ли способ изменить существующее проверочное ограничение для таблицы кроме удаления и повторного создания ?

create table t ( n number);
ora10g> Tabelle wurde erstellt.

ora10g> alter table t add constraint ck check(n>0);

Tabelle wurde geõndert.

ora10g> alter table t modify constraint ck check(n<0);
alter table t modify constraint ck check(n<0)
                                   *
FEHLER in Zeile 1:
ORA-00933: SQL-Befehl wurde nicht korrekt beendet

Ответы [ 4 ]

110 голосов
/ 22 февраля 2011

Вы должны отбросить и воссоздать его, но вам не нужно платить за повторную проверку данных, если вы не хотите.

alter table t drop constraint ck ;
alter table t add constraint ck check (n < 0) enable novalidate;

Предложение enable novalidate заставит вставки или обновления принудительно применять ограничение, но не будет принудительно выполнять полное сканирование таблицы по таблице для проверки соответствия всех строк.

3 голосов
/ 01 июня 2017

Сначала создайте новое ограничение, а затем отбросьте старое.Таким образом, вы гарантируете, что:

  • ограничения всегда на месте
  • существующие строки не нарушают новые ограничения
  • после попытки сброса запрещенных попыток INSERT / UPDATE не предпринимаетсяограничение и до применения нового.
2 голосов
/ 22 февраля 2011

НЕТ, вы не можете сделать это иначе, чем так.

0 голосов
/ 23 февраля 2011

Нет. Если бы такая функция существовала, она была бы указана на этой синтаксической иллюстрации . (Хотя возможно, что есть недокументированная функция SQL, или, может быть, есть какой-то пакет, о котором я не знаю.)

...