3

我想暂时通过两个列名访问我的数据库中的一列。

为什么?列名选择不当,我想重构它。因为我希望我的 webapp 在更改列名时保持稳定,所以最好

  1. 有一个(我们称之为)名为better_column_name的符号链接指向列bad_column_name
  2. 将 web 应用程序更改为使用better_column_name
  3. 删除符号链接并将列重命名为better_column_name

“重构数据库”建议实际添加第二列,该列在提交时同步以实现此目的。我只是希望 Oracle 有一种更简单的方法,工作量更少,开销也更少。

4

5 回答 5

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控制在有人同时更新两列的情况下哪个更改具有“更高的优先级”。

于 2011-04-28T10:32:36.357 回答
3

重命名表:

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;
于 2011-04-28T11:26:09.210 回答
3

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

本质上,这是 Oracle 对@AHorseWithNoName 建议的内置实现。

于 2011-04-28T13:00:14.343 回答
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;
于 2011-04-28T10:55:59.543 回答
-1

如果您使用的是 11g,则可以考虑使用虚拟列。我可能会想稍微改变一下顺序;重命名真实列并使用旧(坏)名称创建虚拟列,然后可以随意删除。当然,您可能会受到限制,并且可能会影响其他无效的对象,从而使该订单不太适合您。

于 2011-04-28T10:06:40.780 回答