访问 DB link 对象的同义词

Accessing synonym of DB link object

背景: 我们的数据库 FIN 的架构为 FIN_DEV.

我们有另一个具有架构 APP_DEV 的数据库应用程序。

数据库 link 在 APP_DEV 中创建,指向 FIN_DEV

CREATE DATABASE LINK FINDEV_FIN
CONNECT TO FIN_DEV
IDENTIFIED BY <PWD>
USING 'FIN'

我们可以使用

从APP_DEV访问FIN_DEV中的对象
CREATE OR REPLACE SYNONYM TBL_FINA FOR TBL_FINA@FINDEV_FIN

到目前为止一切都很好。

问题来了:

APP 数据库中的另一个模式 INT_DEV 需要从 INT_DEV 访问 SYNONYM TBL_FINA。

你能告诉我完成这个的最佳方法吗?

方法如下;我没有你的用户(也不想创建他们),所以:

  • 我的远程数据库=orcl(这是你的fin数据库)
  • 我的远程数据库中的用户 = my_remote_user(在你的数据库中是 fin_dev
  • 我本地数据库中的用户 = scottapp_dev 在你的数据库中)
    • 它将创建一个数据库 link 和一个同义词
  • 我本地数据库中的另一个用户 = mikeint_dev 在您的数据库中)

远程数据库 中,我正在创建一个 table 来模拟您的情况:

SQL> create table tbl_fina (id number);

Table created.

SQL> insert into tbl_fina values (1);

1 row created.

SQL> commit;

Commit complete.

SQL>

正在连接到 本地数据库,创建数据库 link & 同义词:

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>

到目前为止,一切顺利 - 这就是您目前拥有的。


现在,让我们允许另一个用户(在我的本地数据库中)访问该同义词。直接的解决方案是授予 select 对吧?

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(在同义词上)并将该视图上的 select 授予 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>

行得通。最后,以另一个用户身份连接并从视图中 select(即同义词):

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 用户中创建一个数据库 link,但这有点危险,因为数据库 link 允许其所有者虚拟 任何东西在远程数据库中,因为它现在由远程用户名和密码识别。