Есть ли в Oracle что -то вроде «символического столбца»?
-
26-10-2019 - |
Вопрос
Я хотел бы иметь столбец в моем DB, доступный через два имена столбцов временно.
Почему? Название столбца было сильно выбрано, я хотел бы реорганизовать его. Поскольку я хочу, чтобы мой веб -приложение оставалось стабильным при изменении имени столбца, было бы хорошо
- Имейте (давайте назовем) символическую ссылку по имени better_column_name Указывая на столбец bad_column_name
- Измените WebApplication на использование better_column_name
- Отбросить колонку 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, вы можете посмотреть на использование виртуального столбца. Я, наверное, испытал искушение слегка изменить заказ; Переименуйте настоящий столбец и создайте виртуальный, используя старое (плохое) имя, которое затем можно отбросить на досуге. Конечно, вы можете быть ограничены, и могут возникнуть последствия для признания неверных других объектов, которые делают этот порядок менее подходящим для вас.