方法如下;我没有你的用户(也不想创建他们),所以:
- 我的远程数据库 =
orcl(这是你的 fin 数据库)
- 我的远程数据库中的用户 =
my_remote_user(在您的数据库中是 fin_dev)
- 本地数据库中的用户 =
scott(您的数据库中的app_dev)
- 我的本地数据库中的另一个用户 =
mike(您的数据库中的int_dev)
在远程数据库中,我正在创建一个表来模拟您的情况:
SQL> create table tbl_fina (id number);
Table created.
SQL> insert into tbl_fina values (1);
1 row created.
SQL> commit;
Commit complete.
SQL>
连接到本地数据库,创建数据库链接和同义词:
SQL> show user
USER is "SCOTT"
SQL> create database link findev_fin
2 connect to my_remote_user
3 identified by its_password
4 using 'orcl';
Database link created.
SQL> -- Testing, whether the DB link works
SQL> select * From dual@findev_fin;
D
-
X
SQL> -- Creating a snynonym
SQL> create synonym tbl_fina for tbl_fina@findev_fin;
Synonym created.
SQL> select * from tbl_fina;
ID
----------
1
SQL>
到目前为止,一切都很好 - 这就是您目前所拥有的。
现在,让我们允许另一个用户 - 在我的本地数据库中 - 访问该同义词。直截了当的解决方案是对其进行选择,对吧?
SQL> grant select on tbl_fina to mike;
grant select on tbl_fina to mike
*
ERROR at line 1:
ORA-02021: DDL operations are not allowed on a remote database
SQL>
哎呀!那是行不通的。一种解决方法是创建一个 view(在同义词上)并将对该视图的选择授予mike:
SQL> create view v_tbl_fina as select * from tbl_fina;
View created.
SQL> grant select on v_tbl_fina to mike;
Grant succeeded.
SQL>
这行得通。最后,以另一个用户身份连接并从视图中选择(即同义词):
SQL> connect mike/pwd
Connected.
SQL> select * from scott.v_tbl_fina;
ID
----------
1
SQL>
为了更容易访问 - 避免命名视图所有者 (scott) - mike 现在可以创建自己的同义词:
SQL> create synonym tbl_fina for scott.v_tbl_fina;
Synonym created.
SQL> select * from tbl_fina;
ID
----------
1
SQL>
当然,另一种选择是在我的mike 用户中创建一个数据库链接,但这有点危险,因为数据库链接允许其所有者在远程数据库中进行几乎任何操作,因为它是现在由远程用户名及其密码识别。