是否可以为会话设置默认的 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
我有一个 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