Frage

Ich möchte eine Spalte in meinem DB über zwei Spaltennamen vorübergehend zugänglich haben.

Wieso den? Der Spaltenname wurde schlecht ausgewählt, ich möchte ihn neu aufstellen. Wie ich möchte, dass mein WebApp stabil bleibt, während er den Spaltennamen ändern würde, wäre es gut zu

  1. Haben Sie einen (nennen wir es nennen) Symlink namens Better_column_Name Zeigen auf die Spalte bad_column_name
  2. Ändern Sie die zu verwendende Webapplikation Better_column_Name
  3. Lassen Sie die Spalte Symlink und umbenennen Better_column_Name

"Refactoring -Datenbanken" schlägt vor, tatsächlich eine zweite Spalte hinzuzufügen, die im Commit synchronisiert wird, um dies zu erreichen. Ich hoffe nur, dass es mit Oracle, mit weniger Arbeit und weniger Overhead einen einfacheren Weg zu geben könnte.

War es hilfreich?

Lösung

Solange Sie Code haben, der beide Spaltennamen verwendet, sehe ich keinen Weg, um die Tatsache zu umgehen, dass Sie zwei (echte) Spalten in dieser Tabelle haben.

Ich würde die neue Spalte mit dem richtigen Namen hinzufügen und dann einen Auslöser erstellen, der überprüft, welche Spalte geändert wurde, und die Spalte "Andere" entsprechend aktualisiert. Was auch immer aktualisiert wird, der Wert wird mit der anderen Spalte synchronisiert.

Sobald der gesamte Code, der die alte Spalte verwendet, migriert wurde, entfernen Sie den Auslöser und lassen Sie die alte Spalte fallen.

Bearbeiten

Der Auslöser würde also so etwas tun:

CREATE OR REPLACE TRIGGER ...
    ...
    UPDATE OF bad_column_name, better_column_name ON the_table 
    ...
BEGIN
  IF UPDATING ('BAD_COLUMN_NAME') THEN 
     :new.better_column_name = :new.bad_column_name
  END IF;

  IF UPDATING ('BETTER_COLUMN_NAME') THEN 
     :new.bad_column_name = :new.better_column_name
  END IF;
END;

Die Reihenfolge der IF Aussagen kontrollieren, welche Änderungen eine "höhere Priorität" haben, falls jemand beide Spalten gleichzeitig aktualisiert hat.

Andere Tipps

Die Tabelle umbenennen:

alter table mytable rename to mytable_old;

Erstellen Sie eine Ansicht mit dem Original -TabLehename mit Bad_column_Name und Better_column_Name Dieser Punkt auf dieselbe Spalte (Und natürlich alle anderen Spalten):

create or replace view mytable as
  select column1
  , column2
  , ...
  , bad_column_name
  , bad_column_name better_column_name
  from mytable_old
;

Da diese Ansicht standardmäßig aktualisiert werden kann (ich nehme hier an, dass mytable einen Primärschlüssel hat), können Sie aus der Ansicht einfügen/aktualisieren/löschen und es spielt keine Rolle, ob Sie bad_column_name oder esser_column_name verwenden.

Lassen Sie nach dem Refactoring die Ansicht fallen und benennen Sie die Tabelle und Spalte um:

drop view mytable;
alter table mytable_old rename column bad_column_name to better_column_name;
alter table mytable_old rename to mytable;

Die beste Lösung dafür ist nur in Oracle 11g Release 2: Edition-basierte Neudefinition erhältlich. Diese wirklich coole Funktion ermöglicht es uns, verschiedene Versionen von Datenbanktabellen und PL/SQL -Code unter Verwendung von speziellen Auslöser und Ansichten zu verwalten. Finde mehr heraus.

Im Wesentlichen ist dies die integrierte Implementierung von Oracle von @Ahorsewithnoname Vorschläge.

Sie können eine Ansicht für die Tabelle erstellen. Und portieren Sie Ihre Anwendung, um diese Ansicht anstelle der Tabelle zu verwenden.

create table t (bad_name varchar2(10), c2 varchar2(10));
create view vt as select bad_name AS good_name, c2 from t;

insert into vt (good_name, c2) values ('blub', 'blob');

select * from t;
select * from vt;

Wenn Sie sich auf 11G befinden, können Sie eine virtuelle Spalte verwenden. Ich wäre wahrscheinlich versucht, die Bestellung leicht zu ändern; Benennen Sie die reale Spalte um und erstellen Sie den virtuellen mit dem alten (schlechten) Namen, der dann in der Freizeit fallen gelassen werden kann. Sie können natürlich eingeschränkt sein, und es kann Auswirkungen auf andere Objekte geben, die diese Reihenfolge für Sie weniger geeignet machen.

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