创建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使用。
PUBLIC:public 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/