【问题标题】:Accessing synonym of DB link object访问数据库链接对象的同义词
【发布时间】:2020-01-04 00:17:14
【问题描述】:

背景: 我们有数据库 FIN,其架构为 FIN_DEV。

我们有另一个具有 APP_DEV 模式的数据库 APP。

在指向 FIN_DEV 的 APP_DEV 中创建了一个 DB 链接

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。

您能告诉我完成此任务的最佳方法吗?

【问题讨论】:

    标签: oracle oracle12c synonym dblink


    【解决方案1】:

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

    • 我的远程数据库 = 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 用户中创建一个数据库链接,但这有点危险,因为数据库链接允许其所有者在远程数据库中进行几乎任何操作,因为它是现在由远程用户名及其密码识别。

    【讨论】:

    • 谢谢,@Littlefoot。非常感谢您逐步解释的方式。我试过了,它有效。再次感谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    相关资源
    最近更新 更多