Ich habe eine Datenbank mit einer NOT NULL-Einschränkung für ein Feld und möchte diese Einschränkung entfernen. Der komplizierende Faktor ist, dass diese Einschränkung einen systemdefinierten Namen hat und der Name dieser Einschränkung zwischen dem Produktionsserver, dem Integrationsserver und den verschiedenen Entwicklerdatenbanken unterschiedlich ist. Unser aktueller Prozess ist das Einchecken von Änderungsskripten, und eine automatisierte Aufgabe führt die entsprechenden Abfragen über sqlplus für die Zieldatenbank aus. Daher würde ich eine Lösung bevorzugen, die direkt an sqlplus gesendet werden kann.
In meiner eigenen Datenbank wäre das SQL, um dies zu löschen, Folgendes:
alter table MYTABLE drop constraint SYS_C0044566
Ich kann die Einschränkung sehen, wenn ich die all_constraints
Ansicht abfrage :
select * from all_constraints where table_name = 'MYTABLE'
aber ich bin nicht sicher , wie man die Arbeit mit dem SEARCH_CONDITION
‚s LONG
Datentyp oder wie man am besten dynamisch löschen Sie die nachgeschlagenen up Zwang , auch nachdem ich seinen Namen kennen.
Wie kann ich also ein Änderungsskript erstellen, das diese Einschränkung basierend auf dem, was sie ist, und nicht auf dem Namen aufheben kann?
EDIT: @ Allans Antwort ist gut, aber ich bin besorgt (aufgrund meines Mangels an Oracle-Fachwissen), dass es möglicherweise nicht allgemein gültig ist, dass eine Einschränkung, die möglicherweise einen vom System generierten Namen hat, eine Möglichkeit zum Entfernen des Namens mit sich bringt Einschränkung, ohne den Namen kennen zu müssen. Stimmt es, dass es immer eine Möglichkeit gibt, zu vermeiden, dass der Name einer vom System benannten Einschränkung bekannt sein muss, wenn diese Einschränkung logisch gelöscht wird?
quelle
Antworten:
In Oracle werden automatisch keine Null-Einschränkungen erstellt, wenn für eine Spalte nicht null angegeben wird. Ebenso werden sie automatisch gelöscht, wenn die Spalte geändert wird, um Nullen zuzulassen.
Klärung der überarbeiteten Frage : Diese Lösung gilt nur für Einschränkungen, die für Spalten "nicht null" erstellt wurden. Wenn Sie in der Spaltendefinition "Primärschlüssel" oder eine Prüfbedingung angeben, ohne sie zu benennen, erhalten Sie einen vom System generierten Namen für die Einschränkung (und den Index für den Primärschlüssel). In diesen Fällen müssen Sie den Namen kennen, um ihn löschen zu können. Der beste Rat ist, das Szenario zu vermeiden, indem Sie sicherstellen, dass Sie einen Namen für alle Einschränkungen außer "nicht null" angeben. Wenn Sie sich in einer Situation befinden, in der Sie eine dieser Einschränkungen generisch aufheben müssen, müssen Sie wahrscheinlich auf PL / SQL und die Datendefinitionstabellen zurückgreifen.
quelle
not null
Einschränkungen die einzigen systemnamen in meinem Schema sind, die mich wahrscheinlich jemals auf diese Weise beeinflussen werden.Versuchen:
quelle
Denken Sie daran, wenn das Feld, das Sie auf Null setzen möchten, Teil eines Primärschlüssels ist, können Sie dies nicht. Primärschlüssel dürfen keine Nullfelder haben.
quelle
Verwenden Sie den folgenden Code, um die verwendeten Einschränkungen zu ermitteln:
Dies zeigt im Wesentlichen eine create-Anweisung für die Erstellung der referenzierten Tabelle. Wenn Sie wissen, wie die Tabelle erstellt wird, können Sie alle Tabelleneinschränkungen anzeigen.
Antwort aus Michael McLaughlins Blog: http://michaelmclaughlin.info/db1/lesson-5-querying-data/lab-5-querying-data/ Aus seiner Klasse Database Design I.
quelle
Ich hatte das gleiche Problem beim Versuch, eine benutzerdefinierte Überprüfungsbeschränkung zu umgehen, die ich aktualisieren musste, um unterschiedliche Werte zuzulassen. Das Problem ist, dass ALL_CONSTRAINTS nicht erkennen kann, auf welche Spalte die Einschränkung (en) angewendet werden. Ich habe es geschafft, indem ich stattdessen ALL_CONS_COLUMNS abgefragt habe, dann jede der Einschränkungen nach ihrem Namen gelöscht und neu erstellt habe.
Wählen Sie den Einschränkungsnamen aus all_cons_columns aus, wobei table_name = [TABLE_NAME] und column_name = [COLUMN_NAME];
quelle
So etwas ist mir passiert, als ich Kopien von Strukturen in temporäre Tabellen erstellt habe, also habe ich die Nicht-Null entfernt.
quelle
Wenn beim Erstellen einer Tabelle eine Einschränkung für die Spalte STATUS ohne Namen erstellt wurde, weist Oracle ihr einen zufälligen Namen zu. Leider können wir die Einschränkung nicht direkt ändern.
Schritte zum Löschen einer unbenannten Einschränkung, die mit der Spalte STATUS verknüpft ist
Benennen Sie STATUS2 in STATUS um
ALTER TABLE MY_TABLE ADD STATUS2 NVARCHAR2(10) DEFAULT 'OPEN'; ALTER TABLE MY_TABLE ADD CONSTRAINT MY_TABLE_CHECK_STATUS CHECK (STATUS2 IN ('OPEN', 'CLOSED')); UPDATE MY_TABLE SET STATUS2 = STATUS; ALTER TABLE MY_TABLE DROP COLUMN STATUS; ALTER TABLE MY_TABLE RENAME COLUMN STATUS2 TO STATUS;
quelle