1

我正在研究 Oracle SQL 数据库,相当大的数据库。必须更改其中一个(在 150 个表中),因为它是多余的(可以通过连接生成)。我被要求从该表中删除一列,以消除冗余。问题是现在我必须在有人在这个表上插入/更新/等的地方更改代码(并且不要忘记约束!)。我认为“我可以制作一个正确连接的视图”,所以它解决了所有选择的问题,但它不适用于插入,因为我正在更新 2 个表......有没有办法解决这个问题?

我的目标是重命名我的原始表original_tableoriginal_table_smaller少一列)并创建一个view(或类似视图的东西),称为original_table像原始表一样工作。

这可能吗?

4

2 回答 2

3

由于您的视图将包含实际表中不存在的一列,因此您需要使用instead of触发器来使视图可更新。

像这样的东西:

create table smaller_table 
(
   id integer not null primary key, 
   some_column varchar(20)
);

create view real_table 
as 
select id,
       some_column,
       null as old_column
from smaller_table;

现在您的旧代码将运行如下内容:

insert into real_table 
  (id, some_column, old_column)
values
  (1, 'foo', 'bar');

这导致:

ORA-01733: 此处不允许使用虚拟列

为了解决这个问题,您需要一个INSTEAD OF触发器:

create or replace trigger comp_trigger 
   instead of insert on smaller_table
begin
  insert into old_table 
    (id, some_column)
  values
    (:new.id, :new.some_column);
end;
/

现在“old_column”的值将被忽略。您也需要类似的更新。

如果您的视图包含连接,那么您也可以在触发器中处理这种情况。只需根据数据对两个不同的表进行更新/插入

有关更多详细信息和示例,请参阅手册
http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/triggers.htm#i1006376

于 2013-05-02T08:04:24.060 回答
2

可以在视图上插入/更新。您可能希望使用 USER_UPDATABLE_COLUMNS 检查可以将哪些列插入到视图中。

检查此查询:

select * from user_updatable_columns where table_name = 'VIEW_NAME';

Oracle 有两种不同的方式使视图可更新:-

  1. 对于您要更新的内容,该视图是“保留的密钥”。这意味着基础表的主键在视图中,并且该行在视图中只出现一次。这意味着 Oracle 可以准确地确定要更新的基础表行 OR
  2. 你写了一个代替触发器。
于 2013-05-02T08:02:00.907 回答