Есть ли что-то вроде "символьная ссылка на столбец" в Oracle? - PullRequest
3 голосов
/ 28 апреля 2011

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

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

  1. имеет (давайте назовем это) символическую ссылку с именем better_column_name , указывающую на столбец bad_column_name
  2. изменить веб-приложение на использование better_column_name
  3. перетащить символьную ссылку и переименовать столбец в better_column_name

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

Ответы [ 5 ]

4 голосов
/ 28 апреля 2011

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

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

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

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

Триггер будет делать что-то вроде этого:

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 определяет, какое изменение имеет «более высокий приоритет» в случае, если кто-то обновил оба столбца одновременно.

3 голосов
/ 28 апреля 2011

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

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

3 голосов
/ 28 апреля 2011

Переименуйте таблицу:

alter table mytable rename to mytable_old;

Создайте представление с исходным именем таблицы с именами bad_column_name и better_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_column_name или better_column_name.

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

drop view mytable;
alter table mytable_old rename column bad_column_name to better_column_name;
alter table mytable_old rename to mytable;
0 голосов
/ 28 апреля 2011

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

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;
0 голосов
/ 28 апреля 2011

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

...