我要管理以下任务。 我们在服务器'A'和服务器'B'之间有一个数据库链接。 我在服务器'A'上创建了表,在服务器'B'上创建了指向这些表的视图。
I.Ex。 服务器'A'上的表客户 并查看服务器'B'上的客户指向服务器'A'上的表。
要在视图上提供更新功能,我在视图上创建了一个而不是更新触发器:
PROMPT CREATE OR REPLACE TRIGGER tudb_customers
CREATE OR REPLACE TRIGGER tudb_customers instead of update or delete on customers
REFERENCING NEW AS NEW OLD AS OLD
for each row
declare
proc_typ_old char;
proc_typ char;
begin
if updating then
proc_typ := 'U';
else
proc_typ := 'D';
end if;
if proc_typ = 'U' then
update customers@db_link set customersname=:new.customersname
where customersid = :old.customersid;
else
delete from customers@db_link where customersid = :old.customersid;
end if;
end TUDB_MOB_ZUG;
/
如果我尝试更新服务器'B'上的视图(更新客户设置customersname ='Henry',其中customersid = 1),则:old.customersid始终为null。所以更新失败。
Oracleversion是10.2.0.1.0
任何人都可以帮我解决这个问题吗?有什么想法吗?
问候, 克里斯
答案 0 :(得分:3)
这可能是一个错误,因为它似乎在10.2.0.5中正常工作。错误4386090('OLD VALUE RETURN NULL IN“INTREAD OF”TRIGGER based on DBLINK)声音来自诊断分析,如果:old
值在触发器中是空的,如果它有数据库链接;这似乎已被关闭为4771052的副本('INSTEAD-OF触发器不能通过dblink正确更新表',但看不到更多详细信息),这在10.2.0.3补丁集说明中列出。
你需要向Oracle提出一个SR,以确认这是同一个问题,但如果我怀疑他们不会做更多的建议你补丁,因为10g已经失去了一段时间的支持。遗憾的是,没有列出变通方法。
如果视图是单个表,从初始描述看起来就是这种情况,我不确定你是否需要触发器;直接更新和删除工作。您的观点是require an INSTEAD OF trigger吗?
答案 1 :(得分:0)
同意@AlexPoole,因为这可能是一个错误,你可能会被建议在联系Oracle时应用补丁。
还好,在您的情况下,可能不需要通过视图进行更新。
但是,如果我是你,那么我会考虑这是否是在客户端和数据库之间建立连接的好方法。我的意思是通过dblink将Oracle实例(服务器'B')连接到真正的数据库实例(服务器'A'),并让客户端通过服务器'B'间接连接到真实服务器。我认为这是一种黑客攻击,在某个时刻似乎是解决某些可能是网络问题的简单方法,但后来会出现更多问题,比如这次。