我希望我的数据库中的列可以通过两个列名临时访问。
为什么呢?列名被严格挑选,我想重构它。因为我希望我的webapp在更改列名时保持稳定,所以
会很好“重构数据库”建议实际添加第二列,该列在提交时同步以实现此目的。我只是希望Oracle可以采用更简单的方式,减少工作量,降低开销。
答案 0 :(得分:4)
只要你有使用两个列名的代码,我就没有办法解决你在该表中有两个(真实)列的事实。
我会添加具有正确名称的新列,然后创建一个触发器,检查哪个列已被修改并相应地更新“其他”列。因此无论要更新什么,该值都与另一列同步。
一旦迁移了使用旧列的所有代码,请删除触发器并删除旧列。
修改
触发器会这样做:
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
语句的顺序控制哪些更改具有“更高优先级”,以防有人同时更新两列。
答案 1 :(得分:3)
重命名表格:
alter table mytable rename to mytable_old;
使用原始tablename创建一个视图,其中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;
答案 2 :(得分:3)
最佳解决方案仅适用于Oracle 11g第2版:基于版本的重新定义。这个非常酷的功能允许我们使用特殊的触发器和视图来维护不同版本的数据库表和PL / SQL代码。 Find out more
基本上这是Oracle内置的@AHorseWithNoName's suggestion实现。
答案 3 :(得分:0)
您可以为表格创建一个视图。并移植您的应用程序以使用该视图而不是表格。
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;
答案 4 :(得分:-1)
如果您使用11g,则可以查看使用虚拟列。我可能很想改变订单;重命名真实列并使用旧(坏)名称创建虚拟列,然后可以在闲暇时删除。当然,您可能会受到限制,并且可能会对其他无效的对象产生影响,导致此订单不适合您。