Pregunta

Me gustaría tener una columna en mi DB accesible a través de dos nombres de columnas temporalmente.

¿Por qué? El nombre de la columna fue mal elegido, me gustaría refactorizarlo. Como quiero que mi aplicación web se mantenga estable mientras cambia el nombre de la columna, sería bueno

  1. Tenga un (llamémoslo) llamado enlace simbólico better_column_name señalando la columna bad_column_name
  2. Cambiar la aplicación web para usar better_column_name
  3. Deja caer el enlace simbólico y cambiar el nombre de la columna a better_column_name

La "bases de datos de refactorización" sugiere agregar una segunda columna que se sincroniza en la confirmación para lograr esto. Solo espero que haya una manera más fácil con Oracle, con menos trabajo y menos gastos generales.

¿Fue útil?

Solución

Siempre que tenga un código que use ambos nombres de columnas, no veo una manera de evitar el hecho de que tendrá dos columnas (reales) en esa tabla.

Agregaría la nueva columna con el nombre correcto y luego crearía un disparador que verifique qué columna se ha modificado y actualiza la columna "Otro" correspondientemente. Entonces, lo que sea que se esté actualizando, el valor se sincroniza con la otra columna.

Una vez que se haya migrado todo el código que usa la columna anterior, retire el disparador y deje caer la columna anterior.

Editar

El gatillo haría algo como esto:

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;

El orden del IF Las declaraciones controla qué cambio tiene una "prioridad más alta" en caso de que alguien actualice ambas columnas al mismo tiempo.

Otros consejos

Cambiar el nombre de la tabla:

alter table mytable rename to mytable_old;

Crear una vista con el nombre de tabla original con bad_column_name y better_column_name ese punto a la misma columna (y, por supuesto, todas las otras columnas):

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

Dado que esta vista es actualizable de forma predeterminada (supongo aquí que MyTable tiene una clave principal), puede insertar/actualizar/eliminar desde la vista y no importa si usa bad_column_name o better_column_name.

Después de la refactorización, deje caer la vista y cambie el nombre de la tabla y la columna:

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

La mejor solución para esto solo está disponible en Oracle 11G Release 2: redefinición basada en edición. Esta característica realmente genial nos permite mantener diferentes versiones de tablas de bases de datos y código PL/SQL, utilizando desencadenantes y vistas especiales. Saber más.

Esencialmente esta es la implementación incorporada de Oracle de @Ahorsewithnoname la sugerencia.

Puede crear una vista para la tabla. Y porte su aplicación para usar esa vista en lugar de la tabla.

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;

Si estás en 11G, puedes mirar usando una columna virtual. Probablemente estaría tentado a cambiar ligeramente el orden; Cambie el nombre de la columna real y cree la virtual usando el nombre antiguo (malo), que luego se puede soltar a ocio. Puede estar restringido, por supuesto, y puede haber implicaciones en que otros objetos se invaliden que hacen que este pedido sea menos adecuado para usted.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top