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

Is it possible to set default ORACLE dblink for session and avoid @dblink_name suffixes

我有一个 Oracle 数据库,其中有几个 public 数据库链接供各种客户使用。所有客户的所有链接数据库都是相同的。此外,我的主机上只有一个模式,我在其中存储了带有一些数据检索逻辑的数据库视图。 目前,如果我想从不同的客户那里检索相同的数据,我必须为每个客户创建单独的几乎相同的视图:

CREATE VIEW my_view_for_cliet1 AS 
SELECT *
FROM table1@dblink1;

CREATE VIEW my_view_for_cliet2 AS 
SELECT *
FROM table1@dblink2 

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

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;

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

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

请注意,(到目前为止)提出的每个其他解决方案都可以给出您所要求的外观,但仍然需要明确的 dblink 引用每个新的 link and/or 客户端用户的所有实际视图以及相同的 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        

用户 hr

create synonym example1 for manager.example1;

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