Frage

Unsere Anwendung verwendet eine Oracle 10g Datenbank, in der mehrere Primärschlüssel an den Endverbraucher ausgesetzt sind. Product und so. Leider ist es zu spät, etwas damit zu tun, wie es Tonnen von Berichten und benutzerdefinierte Skripts gibt, die wir haben keine Kontrolle über. Wir können nicht die Primärschlüssel oder mess up der Datenbankstruktur neu zu definieren.

Nun wollen einige Kunden einige der Primärschlüsselwerte ändern. Was sie wollten zunächst CAT23MOD1 genannt werden P23A1 sollte jetzt anrufen (kein reales Beispiel, aber Sie meine Bedeutung bekommen.)

Gibt es eine einfache Möglichkeit, dies zu tun? Ich würde ein Skript von einer Art bevorzugen, die parametrisiert werden könnten andere Tabellen und Schlüssel zu passen, aber externe Tools wären akzeptabel, wenn keine andere Möglichkeit besteht.

War es hilfreich?

Lösung

Das Problem ist vermutlich mit dem Fremdschlüssel, die die PK verweisen. Sie müssen die Fremdschlüssel als „aufschiebbaren zunächst sofort“ definieren, wie in diesem Tom Kyte Artikel beschrieben: http://www.oracle.com/technology/oramag/oracle/03-nov/o63asktom.html Das lässt Sie ...

  1. Später die Einschränkungen
  2. Ändern Sie den Stammwert
  3. Ändern der Kinder Werte
  4. Commit die Änderung

Einfach.

Andere Tipps

Oops. Ein wenig Googeln macht es den Anschein, dass, aus unerklärlichen Gründen nicht Oracle nicht ON UPDATE CASCADE implementieren, nur ON DELETE CASCADE. Abhilfen ORACLE ON UPDATE CASCADE Für Google. Hier ist ein Link auf Erstellen eines Cascade Update Set von Tabellen in Oracle.

Original Antwort:

Wenn ich richtig verstehe, wollen Sie die Werte ändern von Daten in Primärschlüsselspalten, nicht die tatsächlichen Einschränkung Namen der Tasten selbst.

Wenn das wahr ist, kann es sehr leicht alle Fremdschlüssel erreicht werden, neu zu definieren, die die betroffene Primärschlüsselbedingung als ON UPDATE CASCADE verweisen. Das bedeutet, dass, wenn Sie eine Änderung an den Primärschlüsselwert zu machen, wird der Motor automatisch alle zugehörigen Werte in Fremdschlüsseltabellen aktualisieren.

Bitte beachten Sie, dass, wenn diese in einer Menge Veränderungen müßte, könnte es in einem Produktionssystem unerschwinglich teuer sein.

Wenn Sie dies auf einem Live-System zu tun haben, ohne DDL Änderungen an die beteiligten Tabellen, dann denke ich, die einzige Möglichkeit ist, um (für jeden Wert des PK, die geändert werden muss):

  1. Geben Sie in der übergeordneten Tabelle eine Kopie der Zeile mit dem PK-Wert ersetzt
  2. Für jedes Kind Tabelle, aktualisieren Sie den FK Wert auf den neuen PK Wert
  3. Löschen Sie die übergeordnete Tabellenzeile mit dem alten PK-Wert

Wenn Sie eine Liste von übergeordneten Tabellen und die PK-Werte haben umbenannt werden, es sollte nicht allzu schwer sein, ein Verfahren zu schreiben, das dies tut - die Informationen in USER_CONSTRAINTS verwendet werden können, die FK-bezogenen Tabellen für eine bekommen gegeben geordneten Tabelle.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top