Есть ли в Oracle что -то вроде «символического столбца»?

StackOverflow https://stackoverflow.com/questions/5816588

Вопрос

Я хотел бы иметь столбец в моем DB, доступный через два имена столбцов временно.

Почему? Название столбца было сильно выбрано, я хотел бы реорганизовать его. Поскольку я хочу, чтобы мой веб -приложение оставалось стабильным при изменении имени столбца, было бы хорошо

  1. Имейте (давайте назовем) символическую ссылку по имени better_column_name Указывая на столбец bad_column_name
  2. Измените WebApplication на использование better_column_name
  3. Отбросить колонку Symlink и переименовать в better_column_name

«Рефакторинг баз данных» предлагает фактически добавить второй столбец, который синхронизируется на Commit для достижения этого. Я просто надеюсь, что с Oracle может быть более простой способ, с меньшим количеством работы и меньше накладных расходов.

Это было полезно?

Решение

Пока у вас есть код, который использует оба имена столбцов, я не вижу способа обойти тот факт, что в этой таблице у вас будет два (реальных) столбца.

Я бы добавил новый столбец с правильным именем, а затем создал триггер, который проверяет, какой столбец был изменен, и соответственно обновляет столбец «Другой». Таким образом, что бы ни обновлялось, значение синхронизируется с другим столбцом.

После того, как весь код, который использует старый столбец, был перенесен, удалите триггер и отбросите старый столбец.

Редактировать

Триггер, так что сделает что -то вроде этого:

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;

Порядок IF Операторы управления, какое изменение имеет «более высокий приоритет» в случае, если кто -то обновит оба столбца одновременно.

Другие советы

Переименовать таблицу:

alter table mytable rename to mytable_old;

Создайте представление с исходным именем таблицы с помощью BAD_COLUMN_NAME и BETHR_COLUMN_NAME Эта точка в том же столбце (И, конечно, все остальные столбцы):

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

Поскольку это представление по умолчанию обновляется (я предполагаю, что MyTable имеет первичную ключ), вы можете вставить/обновить/удалить из представления, и не имеет значения, используете ли вы BAD_COLUNM_NAME или BETHREST_COLUNM_NAME.

После рефакторинга выпишите представление и переименование таблицы и столбца:

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

Лучшее решение для этого доступно только в Oracle 11G Release 2: переосмысление на основе издания. Эта действительно классная функция позволяет нам поддерживать различные версии таблиц базы данных и кода PL/SQL, используя специальные триггеры и представления. Узнать больше.

По сути, это встроенная реализация Oracle @Ahorsewithnoname's предложение.

Вы можете создать представление для таблицы. И перенести свое приложение, чтобы использовать это представление вместо таблицы.

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;

Если вы находитесь на 11G, вы можете посмотреть на использование виртуального столбца. Я, наверное, испытал искушение слегка изменить заказ; Переименуйте настоящий столбец и создайте виртуальный, используя старое (плохое) имя, которое затем можно отбросить на досуге. Конечно, вы можете быть ограничены, и могут возникнуть последствия для признания неверных других объектов, которые делают этот порядок менее подходящим для вас.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top