it-swarm.com.de

Wie kann ich eine Einschränkung "nicht null" in Oracle löschen, wenn ich den Namen der Einschränkung nicht kenne?

Ich habe eine Datenbank mit einer NOT NULL-Einschränkung für ein Feld, und ich möchte diese Einschränkung entfernen. Der komplizierende Faktor ist, dass diese Einschränkung einen vom System definierten Namen hat und der Name der Einschränkung zwischen Produktionsserver, Integrationsserver und den verschiedenen Entwicklerdatenbanken unterschiedlich ist. Unser aktueller Prozess ist das Einchecken von Änderungsskripten, und eine automatisierte Task führt die entsprechenden Abfragen über sqlplus gegen 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, das gelöscht werden sollte, 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'

ich bin mir jedoch nicht sicher, wie ich mit dem Datentyp LONG von SEARCH_CONDITION arbeiten soll oder wie die gesuchte Einschränkung am besten dynamisch gelöscht werden kann, auch wenn ich deren Namen kenne.

Wie kann ich also ein Änderungsskript erstellen, das diese Einschränkung auf der Grundlage dessen, was es ist, und nicht anhand des Namens löschen kann?


BEARBEITEN: @ Allans Antwort ist eine gute, aber ich bin besorgt (wegen meines Mangels an Oracle-Kenntnissen), dass es nicht allgemein zutreffend ist, dass eine Einschränkung, die einen vom System generierten Namen haben könnte, eine Möglichkeit hat Um die Einschränkung zu entfernen, ohne ihren Namen zu kennen. Stimmt es, dass es immer eine Möglichkeit gibt, zu vermeiden, dass Sie den Namen einer Einschränkung mit Systemnamen kennen müssen, wenn diese Einschränkung logisch aufgehoben wird?

72
Chris Farmer
alter table MYTABLE modify (MYCOLUMN null);

In Oracle werden keine NULL-Einschränkungen automatisch erstellt, wenn für eine Spalte kein NULL angegeben wird. Ebenso werden sie automatisch gelöscht, wenn die Spalte geändert wird, um Nullen zuzulassen.

Klären der überarbeiteten Frage : Diese Lösung gilt nur für Einschränkungen, die für "nicht null" -Spalten erstellt wurden. Wenn Sie in der Spaltendefinition "Primärschlüssel" oder eine Prüfbedingung angeben, ohne sie zu benennen, erhalten Sie am Ende 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 zu löschen. 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 löschen müssen, müssen Sie wahrscheinlich auf PL/SQL und die Datendefinitionstabellen zurückgreifen.

146
Allan

Versuchen:

alter table <your table> modify <column name> null;
16
vasanth

Denken Sie daran, wenn das Feld, das Sie als nullbar markieren möchten, Teil eines Primärschlüssels ist, können Sie .. .. nicht. Primärschlüssel können keine Nullfelder enthalten.

1
Mary C

Verwenden Sie den folgenden Code, um die verwendeten Einschränkungen zu ermitteln:

-- Set the long data type for display purposes to 500000.

SET LONG 500000

-- Define a session scope variable.

VARIABLE output CLOB

-- Query the table definition through the <code>DBMS_METADATA</code> package.

SELECT dbms_metadata.get_ddl('TABLE','[Table Described]') INTO :output FROM dual;

Dies zeigt im Wesentlichen eine create-Anweisung, wie die referenzierte Tabelle erstellt wird. Wenn Sie wissen, wie die Tabelle erstellt wird, können Sie alle Tabelleneinschränkungen sehen.

Antwort aus dem Blog von Michael McLaughlin: http://michaelmclaughlin.info/db1/lesson-5-querying-data/lab-5-querying-data/ Aus seiner Database Design I-Klasse.

1
Guentersniden

Ich hatte das gleiche Problem, als ich versuchte, eine benutzerdefinierte Check-Einschränkung zu umgehen, die ich aktualisieren musste, um verschiedene Werte zuzulassen. Das Problem ist, dass ALL_CONSTRAINTS keine Möglichkeit hat, festzustellen, auf welche Spalte die Einschränkung (en) angewendet werden. Ich habe es geschafft, indem ich stattdessen ALL_CONS_COLUMNS abfragt, dann die Einschränkungen nach ihrem Namen löscht und neu erstellt.

wählen Sie den Constraint_Name aus allen Konsolspalten .__ aus. Dabei steht Tabellenname = [TABLE_NAME] und column_name = [COLUMN_NAME];

0
CaduMaciel