0

我有以下任务要管理。我们在服务器“A”和服务器“B”之间有一个数据库链接。我在服务器“A”上创建了表,并在服务器“B”上创建了指向这些表的视图。

前。服务器“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”上的视图(更新客户设置客户名称 =“亨利”,其中客户 ID = 1):old.customersid 始终为空。所以更新失败。

Oracle版本是10.2.0.1.0

任何人都可以在这件事上帮助我吗?有任何想法吗?

问候,克里斯

4

2 回答 2

3

这可能是一个错误,因为它在 10.2.0.5 中似乎可以正常工作。错误 4386090('OLD VALUE RETURN NULL IN "INSTEAD OF" TRIGGER BASED ON DBLINK)来自诊断分析的声音,:old如果触发器具有 DB 链接,则触发器中的值为 null;这似乎已作为 10.2.0.3 补丁集注释中列出的 4771052 的副本('INSTEAD-OF 触发器无法通过 dblink 正确更新表',但无法查看更多详细信息)关闭。

您需要向 Oracle 提出 SR 以确认这是同一问题,但如果是这样,我怀疑他们只会建议您进行修补,因为 10g 已经有一段时间不支持了。不幸的是,没有列出任何解决方法。

如果视图是单个表,从您最初的描述来看似乎就是这种情况,我不确定您是否需要触发器;直接更新和删除工作。您的视图是否需要 INSTEAD OF 触发器

于 2012-08-23T11:43:14.980 回答
0

同意@AlexPoole,关于这口井可能是一个错误,您可能会被建议在联系 Oracle 时应用补丁。

好一点,在您的情况下,可能不需要通过视图进行更新。

但是,此时如果我是您,我会考虑这是否是在客户端和数据库之间建立连接的好方法。我的意思是通过 dblink 将 Oracle 实例(服务器“B”)连接到真实的数据库实例(服务器“A”),并让客户端通过服务器“B”间接连接到真实服务器。我认为这是一种 hack,在某个时刻似乎是解决可能是网络问题的简单方法,但后来会出现更多问题,比如这次。

于 2012-08-23T12:31:49.447 回答