Wie ändere ich eine vorhandene Prüfbedingung?

74

Gibt es eine andere Möglichkeit, eine vorhandene Prüfbedingung für eine Tabelle zu ändern, als sie zu löschen und neu zu erstellen ?

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
schurik
quelle
Ich denke, dass das Problem ist, dass Sie Ihren Ausdruck umgeben, und nach "überprüfen" muss es ein Leerzeichen sein
enrique manzano gil

Antworten:

125

Sie müssen es löschen und neu erstellen, aber Sie müssen nicht die Kosten für die erneute Validierung der Daten tragen, wenn Sie dies nicht möchten.

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

Die enable novalidateKlausel erzwingt das Erzwingen der Einschränkung für Einfügungen oder Aktualisierungen, erzwingt jedoch keinen vollständigen Tabellenscan für die Tabelle, um zu überprüfen, ob alle Zeilen übereinstimmen.

Adam Musch
quelle
2
Dies ist in Ordnung, wenn keine Verbindungen zur Datenbank bestehen. Lesen Sie diese Antwort, bevor Sie die Änderung in einem allgemeinen Fall vornehmen.
Marmite Bomber
1
DDL für eine Tabelle erfordert eine X-Sperre, aber eine Transaktion könnte sich zwischen die beiden schleichen. Ich denke, ein besserer Ansatz wäre, eine neue Einschränkung zu erstellen, eine alte Einschränkung zu löschen und eine neue Einschränkung in einen alten Einschränkungsnamen umzubenennen. In dem veröffentlichten Fall waren die beiden Einschränkungen jedoch ausschließlich für einander.
Adam Musch
8

Erstellen Sie zuerst eine neue Einschränkung und löschen Sie dann die alte.
Auf diese Weise stellen Sie sicher, dass:

  • Einschränkungen sind immer vorhanden
  • Bestehende Zeilen verletzen keine neuen Einschränkungen
  • Es werden keine illegalen INSERT / UPDATEs versucht, nachdem Sie eine Einschränkung gelöscht haben und bevor eine neue angewendet wird.
Witold Kaczurba
quelle
Dies funktioniert nicht, wenn Sie den Namen der Einschränkung beibehalten möchten. Sie müssen zuerst die Einschränkung löschen und dann eine neue erstellen.
Tomáš Na'vi Koválik
2

NEIN, du kannst es nicht anders machen.

Oleg Danu
quelle
0

Nein. Wenn eine solche Funktion vorhanden wäre, würde sie in dieser Syntaxabbildung aufgeführt . (Obwohl es möglich ist, dass es eine undokumentierte SQL-Funktion gibt, oder vielleicht ein Paket, das mir nicht bekannt ist.)

Jon Heller
quelle
2
Das ist genau das Problem. Diese Funktion ist in der Dokumentation aufgeführt . Aber es funktioniert nicht.
schurik
9
Das Ändern einer Einschränkung ist dokumentiert, aber die Art der Änderung, nach der Sie suchen, ist nicht dokumentiert. Es ist nur das Ändern des Einschränkungsstatus zulässig. zB aktivieren, deaktivieren, validieren usw.
Jon Heller