我使用这个创建了一个视图(忽略了其他列):
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
中答案 0 :(得分:3)
您可以在Oracle中通过在视图上构建an INSTEAD OF trigger来执行此操作。
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,这会将更改传播到基础视图:
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;
/
无法通过视图更新表更新语句中未包含的任何列。
答案 1 :(得分:1)
我相信你所尝试的是不可能的。虽然MySQL确实允许对视图执行更新语句,但is_root是派生列,因此更新它是没有意义的(因为没有回到表的路径。