1

我使用它创建了一个视图(忽略了其他列):

create view view_table (is_root) as select
  case when C1 = 'Yes' then 1
       when C1 = 'No' then 0
       else 0
  end as is_root
  from remote_db_table

但是当我尝试使用以下方法更新视图时:

update view_table set is_root=1

这没用。有什么办法吗?视图在 Oracle 中,但远程表在 mySQL 中

4

2 回答 2

3

您可以在 Oracle 中通过在视图上构建一个 INSTEAD OF 触发器来执行此操作。

create or replace trigger vt_instead
    instead of update on view_table
begin
    if :new.is_root != :old.is_root
    then
        update remote_db_table
        set C1 = case when :new.is_root = 1 then 'Yes'
                      else 'No' end
        where id = :new.id;
    end if;
end;
/

这将允许您针对将传播更改到底层视图的视图发出更新:

update view_table
set is_root = 0
where id = 23
/

我没有针对 MySQL 数据库上的远程表进行测试(手头没有这样的设置),但是如果您可以在 SQL*Plus 中远程更新表,那么触发器也应该可以工作。


“我想更新所有 40 列,但只有一列不能像上面那样更新”

恐怕您还没有完全清楚自己,但我认为您要问的是如何处理不需要翻译的列。

INSTEAD OF 触发器触发而不是触发 DML 语句(线索在名称中)。这意味着您需要处理要通过视图更新的所有列。在您的场景中,这将是所有四十列。修改后的触发代码可能如下所示:

create or replace trigger vt_instead
    instead of update on view_table
begin
    update remote_db_table
    set C1 = case when :new.is_root = 1 then 'Yes'
                  else 'No' end
        , C2 = :new.col2
        , C3 = :new.col3
        , C4 = :new.col4
        ....
        , C40 = :new.col40
    where id = :new.id;
end;
/

任何未包含在表更新语句中的列都无法通过视图进行更新。

于 2012-11-04T15:37:59.803 回答
1

我相信你正在尝试的事情是不可能的。虽然 MySQL 确实允许对视图执行更新语句,但 is_root 是派生列,因此更新它没有意义(因为没有返回表的路径。

于 2012-11-04T02:03:59.687 回答