是否可以为会话设置默认的 ORACLE dblink 并避免使用 @dblink_name 后缀

问题描述

我有一个 Oracle 数据库,其中包含多个面向不同客户的公共 dblink。所有客户的所有链接数据库都是相同的。此外,我的主机上只有一个架构,我在其中存储了一些数据检索逻辑的数据库视图。 目前,如果我想从不同的客户检索相同的数据,我必须为每个客户创建单独的几乎相同的视图:

CREATE VIEW my_view_for_cliet1 AS 
SELECT *
FROM table1@dblink1;

CREATE VIEW my_view_for_cliet2 AS 
SELECT *
FROM table1@dblink2 

是否可以为会话(或类似的东西)设置认的 dblink 并且只有一个没有显式 dblink 的 DB 视图,例如:

CREATE VIEW my_view AS 
    SELECT *
    FROM table1;

-- below I want to retrieve data from 3rd client 
ALTER SESSION SET DEFAULT DBLINK dblink3;
 
SELECT * FROM my_view;

附言我在链接的机器上只有 SELECT 权限,所以我不能创建任何视图或其他对象。

解决方法

不,这是不可能的。对 dblink 的每个引用都必须是显式的。

请注意,(到目前为止)提供的每个其他解决方案都可以提供您所要求的外观,但仍然需要在所有实际视图中显式地引用 dblink 并因此使用相同的 DDL每个新链接和/或客户端用户的更改。没有办法避免在某个级别创建这些单独的视图或显式引用(我相信这是您要问的),即使您对用户隐藏了一些。

,

我建议使用同义词,并设置一个程序来一次性更改它们,例如

create or replace procedure SET_DBLINK ( target_link IN VARCHAR2 ) is
begin
  execute immediate 'create or replace synonym TABLE1 for TABLE1@' || target_link;
  execute immediate 'create or replace synonym TABLE2 for TABLE2@' || target_link;
  -- ...etc... 
end;
/

你可以这样做:

exec SET_DBLINK('dblink3');
select * from table1;

您可能希望向该过程添加验证和异常处理,但为了便于阅读,我让它变得简单。

,

例如,用户经理

CREATE OR REPLACE VIEW manager.example1 (
   column1,column2
    )
AS
select 1,user from dual@dblink1
where 'SCOTT'=user
union all
select 2,user from dual@dblink2
where 'MANAGER'=user
union all
select 3,user from dual@dblink3
where 'HR'=user;


grant select on example1 to scott;
grant select on example1 to hr;

select * from example1;
==>
COLUMN1                                      COLUMN2                              
-------------------------------------------- ------------------------------------ 
                                           2 MANAGER      

用户斯科特

create synonym example1 for manager.example1;

select * from example1;
==>
COLUMN1                                      COLUMN2                              
-------------------------------------------- ------------------------------------ 
                                           1 SCOTT        

用户小时

create synonym example1 for manager.example1;

select * from example1;
==>
COLUMN1                                      COLUMN2                              
-------------------------------------------- ------------------------------------ 
                                           3 HR