Domanda

mi piacerebbe avere una colonna nel mio DB accessibile tramite due nomi di colonna temporanea.

Perché? Il nome della colonna è stato male scelto, vorrei refactoring. Come voglio che il mio webapp a rimanere stabile mentre si cambia il nome della colonna, sarebbe bene per

  1. avere un (chiamiamola così) link simbolico chiamato better_column_name che punta alla colonna bad_column_name
  2. cambiare il webapplication all'uso better_column_name
  3. eliminare la colonna link simbolico e rinomina a better_column_name

"Database Refactoring" propone di aggiungere effettivamente una seconda colonna che è sincronizzato sul impegnarsi per conseguire questo. Sto solo sperando che ci potrebbe essere un modo più semplice con Oracle, con meno lavoro e meno spese generali.

È stato utile?

Soluzione

Fino a quando si dispone di codice che utilizza entrambi i nomi di colonna, non vedo un modo per aggirare il fatto che avrete due (reali) le colonne in tale tabella.

Vorrei aggiungere la nuova colonna con il nome corretto e quindi creare un trigger che controlli che colonna è stato modificato e aggiorna la colonna "altro" modo corrispondente. Quindi, tutto ciò che è in corso di aggiornamento, il valore viene synch'ed con l'altra colonna.

Una volta che tutto è stato migrato il codice che utilizza l'antica colonna, rimuovere il grilletto e far cadere il vecchio colonna.

Modifica

Il grilletto avrebbe così fare qualcosa di simile:

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;

L'ordine dei controlli dichiarazioni IF che il cambiamento ha un "più alta priorità" nel caso in cui qualcuno ha aggiornato entrambe le colonne allo stesso tempo.

Altri suggerimenti

Rinominare la tabella:

alter table mytable rename to mytable_old;

Creare una visualizzazione con il nome della tabella originale sia bad_column_name e better_column_name questo punto alla stessa colonna (e naturalmente tutti le altre colonne):

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

Dal momento che questo punto di vista è aggiornabile per default (presumo che qui MyTable ha una chiave primaria), è possibile inserire / aggiornare / cancellare dalla vista e non importa se si utilizza bad_column_name o better_column_name.

Dopo il refactoring, goccia la vista e rinomina la tabella e la colonna:

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

La migliore soluzione a questo è disponibile solo in Oracle 11g Release 2: Ridefinizione basati Edition. Questa caratteristica davvero cool ci permette di mantenere diverse versioni di tabelle di database e il codice PL / SQL, utilizzando i trigger speciali e punti di vista. saperne di più .

In sostanza si tratta di Oracle built-in esecuzione di @ di AHorseWithNoName suggerimento .

è possibile creare una vista per la tabella. E porta l'applicazione per utilizzare che vista al posto della tabella.

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;

Se siete su voi 11g potrebbe guardare con una colonna virtuale. Probabilmente sarei tentato di cambiare un po 'l'ordine; Rinominare la colonna reale e creare quello virtuale utilizzando il vecchio (cattivo) nome, che possono poi essere sceso a piacere. Si può essere limitato, ovviamente, e ci possono essere ripercussioni su altri oggetti che vengono invalidati che rendono questo ordine di meno adatto per voi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top