0

我有“PROD-1”数据库,其中包含 2 个模式“Schema-1”,“Schema-2”我在两个模式中创建了私有 dblink“DBLINK-1”,它们指向不同的目标。这是我的配置

数据库名称 -> 源架构 -> 目标数据库 -> 目标架构 -> Dblink 名称

PROD-1 -> Schema-1 -> TPRD-1 -> TSchema-1 -> DBLINK-1

PROD-1 -> Schema-2 -> TPRD-2 -> TSchema-2 -> DBLINK-1

当我在 Schema-1 中编译 proc 时,我在过程中使用这个 dblink 并部署在 Schema-1 和 Schema-2 中,它使 Schema-2 proc 无效,反之亦然。这是示例过程

CREATE OR REPLACE procedure test_dblink

is v_cnt number;

begin
   select count(*) into v_cnt from DUAL@DBLINK-1;

end;

据我了解,DBLINK-1 是 Schema-1 和 Schema-2 的私有 dblink;因此它不应该相互冲突。但是,当我在两种模式中同时执行这些程序时,一个程序成功执行,另一个正在等待第一个程序完成然后完成。

这就是可能发生的事情

  1. Schema-1 proc 首先启动,Proc 状态为 Valid。Schema-2 proc 正在等待
  2. Schema-1 proc 现已完成。Schema-2 proc 退出等待模式并使 Schema-1 中的 DBLink-1 无效。因此 Schema-1 proc 现在处于无效状态
  3. Schema-2 proc 运行并完成。Schema-2 proc 现在有效

我的问题是,如何在没有这种冲突的情况下在同一个数据库的两个不同模式中管理同一个 DBLink?

感谢您的帮助

4

1 回答 1

0

我们使用同义词解决了这个问题。为您的数据库链接使用唯一名称。然后在每个模式中为您使用的每个远程对象创建同义词。这样,您仍然可以在两种模式中使用相同的 PL/SQL 代码。

于 2016-03-09T08:48:52.357 回答