问题描述
我有一个 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