您的位置:首页 > 数据库 > Oracle

oracle 创建dblink

2020-06-07 04:36 97 查看

创建DBlink

database link是定义一个数据库到另一个数据库的路径的对象,database link允许你查询远程表及执行远程程序。在任何分布式环境里,database都是必要的。另外要注意的是database link是单向的连接。

创建DBlink需要的权限:

需要 CREATE DATABASE LINK权限,如果是创建public database link,必须要包含CREATE PUBLIC DATABASE LINK 权限。同时你还需要拥有在远程数据库上面的create session的权限。

◆查询CREATE DATABASE LINK权限

SQL> select privilege,role from role_sys_privs where privilege like 'CREATE DATABASE%';

 

PRIVILEGE                                ROLE

---------------------------------------- --------------------

CREATE DATABASE LINK                     IMP_FULL_DATABASE

CREATE DATABASE LINK                     DBA

◆查询CREATE PUBLIC DATABASE LINK 权限

SQL>  select privilege,role from role_sys_privs where privilege = 'CREATE PUBLIC DATABASE LINK';

 

PRIVILEGE                                ROLE

---------------------------------------- --------------------

CREATE PUBLIC DATABASE LINK              IMP_FULL_DATABASE

CREATE PUBLIC DATABASE LINK              DBA

◆查询create session的权限:

SQL> select privilege from role_sys_privs where role in ('CONNECT');

 

PRIVILEGE

--------------------------------------------------------------------------------

CREATE SESSION

 创建dblink语法:

CREATE [SHARED][PUBLIC] database link link_name

      [CONNECT TO [user][current_user] IDENTIFIED BY password]
      [AUTHENTICATED BY user IDENTIFIED BY password]
      [USING 'connect_string']

 

参数以及关键字:

SHARED该关键字的作用是,创建后的DBlink可以被多个用户共享,该关键字必须要联合AUTHENTICATED使用。

 

PUBLICpublic dblink可以被所用用户共享。

当source端的数据库GLOBAL_NAME=TRUE时,link名必须与远程数据库的全局数据库名global_name)相同;否则,可以任意命名。

 

CONNECT TO 子句:

connect to 子句代表了dblink两个不同的用户类型:

1.current user database link

2.  connected user database link

[current_user]要求该用户必须是在远程数据库中的一个全局用户(global user。创建一个current user database link

在远程数据库上执行一个存储对象(例如存储过程),CURRENT_USER就是这个对象所属的用户,而不是这个对象的执行用户,其相应的权限和对象所属的用户保持一致。

如果这个存储对象是包含一个 invoker-rights的安全设置(具体使用AUTHID子句)。

例如:

create or replace procedure AAAA

authid current_user

is

begin

 

end;

这时的CURRENT_USER变成了这个对象的调用用户,而不是这个对象的所属用户,其相应的权限也和调用用户一致。

 

[user] IDENTIFIED BY password]。

这里的子句创建一个connected user database link。该子句使用一个固定的用户以及密码连接的远程数据库中。

 

 

[AUTHENTICATED BY user IDENTIFIED BY password]

定义在目标实例上的一个用户,该用户被用来在远程数据库上进行鉴权。用户必须要存在远程数据库上存在。而这个用户就只是被用来做鉴权,没用其他作用。


[USING 'connect_string']

定义远程数据上的服务名。若定义了这个参数,oracle会默认追加上去数据库的domain

 创建的dblink可以在all_db_links,dba_db_links,user_db_links查询到。

SQL> create public database link dblink_p connect to current_user

  2  using 'orcl';

 Database link created.

 

SQL> select owner,DB_LINK,HOST from dba_db_links;

OWNER      DB_LINK                                  HOST

---------- ---------------------------------------- ----------

PUBLIC     DBLINK_P.REGRESS.RDBMS.DEV.US.ORACLE.COM orcl

 

创建connected user database link

SQL> create public database link  dblink_f connect to YYP identified by oracle

  2  using 'orcl';

 Database link created.

 SQL>  select owner,DB_LINK,HOST from dba_db_links;

 

OWNER      DB_LINK                                  HOST

---------- ---------------------------------------- ----------

PUBLIC     DBLINK_F.REGRESS.RDBMS.DEV.US.ORACLE.COM orcl

 SQL> select count(1) from scott.emp@dblink_f;

 

  COUNT(1)

----------

        14

 

创建current user database link

由于需要目录服务器,试验没能完全进行。

*首先创建一个全局用户。

CREATE USER p_yyp  IDENTIFIED GLOBALLY AS "CN=scott,OU=divisional,O=sybex,C=US"

这里需要使用enterprise directory service (Oracle Internet Directory)。

 

*连接到conn p_yyp

 

*创建dblink:   create public database link dblink_p connect to current_user  using 'orcl';

 

 

使用[AUTHENTICATED BY user IDENTIFIED BY password]

该鉴权子句,必须要和shared一起使用。鉴权的意思,就是在创建,以及没一次使用这个link的时候,都会与远程数据进行鉴权。

 SQL> create shared database link  dblink_f2 connect to YYP identified by oracle

     AUTHENTICATED BY scott  IDENTIFIED BY tiger  using 'orcl';

 

Database link created.

 

SQL> select owner,DB_LINK,HOST from dba_db_links;

 

OWNER      DB_LINK                                  HOST

---------- ---------------------------------------- ----------

PUBLIC     DBLINK_F.REGRESS.RDBMS.DEV.US.ORACLE.COM     orcl

YYP        DBLINK_F2.REGRESS.RDBMS.DEV.US.ORACLE.CO M   orcl

          

检验:使用DBLINK_F2,必须要在yyp这个用户下。

SQL> conn yyp/oracle

Connected.

SQL> show user

USER is "YYP"

SQL>  select count(1) from scott.emp@DBLINK_F2;

 

  COUNT(1)

----------

        14

 

SQL> conn scott

Enter password:

Connected.

SQL> select count(1) from scott.emp@DBLINK_F2;

select count(1) from scott.emp@DBLINK_F2

                               *

ERROR at line 1:

ORA-02019: connection description for remote database not found

--à非YYP用户的时候,该DBlink就不可用,但是可以使用public database link。

 

SQL> select count(1) from scott.emp@DBLINK_F;

 

  COUNT(1)

----------

        14

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25651216/viewspace-748297/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25651216/viewspace-748297/

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: