我希望在DB中通过两个列名临时访问一列。

为什么?列的名称是不好选择的,我想重构它。由于我希望我的WebApp在更改列名时保持稳定,因此

  1. 有一个(称其为)符号链接 better_column_name 指向列 bad_column_name
  2. 更改用于使用的网络应用程序 better_column_name
  3. 将Symlink和Rename列放到 better_column_name

“重构数据库”建议实际添加第二列,该列是为了实现这一目标而在提交上同步的。我只是希望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和BEITS_COLUMN_NAME创建原始tablename的视图 那个指向同一列 (当然还有所有其他列):

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

由于此视图默认情况下是可更新的(我假设在这里MyTable具有主键),因此您可以从视图中插入/update/delete,并且使用bad_column_name或bester_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;

最佳解决方案仅在Oracle 11G版本2:基于版本的重新定义中可用。这个非常酷的功能使我们能够使用特殊触发器和视图维护不同版本的数据库表和PL/SQL代码。 了解更多.

本质上,这是Oracle的内置实施 @ahorsewithnoname的建议.

您可以为表创建视图。并移植您的应用程序以使用该视图而不是表。

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