创建DBlink
database
link是定义一个数据库到另一个数据库的路径的对象,database link允许你查询远程表及执行远程程序。在任何分布式环境里,database都是必要的。另外要注意的是database link是单向的连接。
创建DBlink需要的权限:
需要CREATEDATABASELINK权限,如果是创建public
database link,必须要包含CREATEPUBLICDATABASELINK权限。同时你还需要拥有在远程数据库上面的create session的权限。
◆查询CREATEDATABASELINK权限
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
◆查询CREATEPUBLICDATABASELINK权限
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. 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. orcl
SQL> select count(1) from
@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)。
*连接到connp_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. orcl
YYP
DBLINK_F2. M orcl
检验:使用DBLINK_F2,必须要在yyp这个用户下。
SQL> conn yyp/oracle
Connected.
SQL> show user
USER is "YYP"
SQL>
select count(1) from @DBLINK_F2;
COUNT(1)
----------
14
SQL> conn scott
Enter password:
Connected.
SQL> select count(1) from
@DBLINK_F2;
select count(1) from @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
@DBLINK_F;
COUNT(1)
----------
14