CREATE DATABASE LINK 建立数据库连接


CREATE DATABASE LINK语句能够建立一个数据库链接。数据库链接是数据库中的一个schema实体,它能够容许你访问别的库的实体。其余数据库能够不必定要是数据库系统,然而访问non-Oracle系统你必须使用同质的服务。
在dblink建立完成后,你就能够在的SQL语句中经过在表、视图和PL/SQL实体的后面加@dblink对其进行访问了。你可使用SELECT语句对远程数据库的实体进行访问,甚至可使用INSERT UPDATE DELETE或者LOCK TABLE语句。数据库

查看现有的数据库链接的视图有如下:服务器

select * from v$dblink; select * from all_db_links; select * from dba_db_links; select * from user_db_links;

前提条件
建立私有数据库链接,你必需要有CREATE DATABASE LINK权限;建立公共数据库链接,你必须拥有CREATE PUBLIC DATABASE LINK权限;固然你还必须拥有远程数据库的CREATE SESSION权限;最后就是本地和远程数据库都安装了Oracle Net。网络

语法函数


SHARED
指定SHARED参数建立的数据库链接能够在被链接源数据库和目标数据库的单个网络中的多个会话共享。在一个共享服务器的配置中,共享的数据库链接能够防止链接远程数据库的连接数量变得太大。共享数据库连接能够是公共数据库连接。共享私有连接对多个客户端链接到同一个本地的schema有极大的用处。spa

PUBLIC
经过PUBLIC参数建立的数据库连接对全部用户均可见。若是你忽略这个参数,那么所建立的数据库连接是私有的,只对当前用户可用。可否访问远程数据库的数据取决于链接远程数据库时所使用的认证方式。
*若是你指定的是CONNECT TO user IDENTIFIED BY password,那么数据库链接时会使用指定的用户和密码。
*若是指定的是CONNECT TO CURRENT_USER,那么数据库起做用的的用户取决于所使用连接的做用范围。
*若是上面两种方式的参数都忽略了,那么数据库使用本地用户链接到远程数据库。code

dblink
dblink用于指定完整或不完整的数据库链接名。若是你只指定了数据库名,那么Oracle数据库会隐式的追加本地数据库的域名。dblink只接受ASCII字符串,而且不支持多个字符串。数据库连接名不区分大小写,而且只以大写的ASCII字符存储。若是你在数据库名中使用了引号,那么引号将会被忽略。
若是GLOBAL_NAMES初始化参数被设置成TRUE,那么数据库链接必须使用与它所链接的库的名字;反之,若是是false,而你又改变了数据库的全局名,那么你可使用这个改变后的全局名。
在一个会话或一个RAC实例配置中能够建立的数据库连接的最大个数,取决于OPEN_LINKSOPEN_LINKS_PER_INSTANCE初始化参数的值。对象

建立数据库连接的局限
你不能为别的用户的schema建立数据库连接,也不能够一个schema的名字做为dblink的名字。点号容许出如今数据库连接中,所以Oracle数据库会对整个名字进行转换,例如ralph.linktosales(ralph是schema名,linktosales是连接名)。blog

CONNECT TO参数
CONNECT TO参数用于指定链接远程数据库的用户和凭证。rem

CURRENT_USER参数
CURRENT_USER参数用于建立一个当前用户数据库连接。CURRENT_USER必须是远程数据库中的合法全局用户。
若是数据库链接是直接被使用的,而不是从一个存储的对象实体中引用的,那么CURRENT_USER与连接的用户相同。
当执行一个存储的对象实体(存储过程、试图、触发器)来初始化一个数据库连接时,CURRENT_USER的名字与该存储对象的拥有者相同,而不是调用该存储对象的用户。例如,数据库连接在存储过程scott.p中(由scott建立),而后又用户jane调用该存储过程,那么CURRENT_USER是scott。
可是,若是存储实体是调用者权限的函数、存储过程或包,那么调用者的认证ID将会被用做链接的远程用户。例如,若是有权限限制的数据库连接包含在存储过程scott.p中(由scott建立的调用者权限的存储过程),一个名为Jane的用户调用了该存储过程,那么CURRENT_USER是jane,存储过程Jane的权限执行。字符串

user IDENTIFIED BY password
用于指定链接远程数据库的用户名和密码,这个叫用户数据库连接。若是你忽略了这个参数,那么数据库会使用链接到数据库的用户的用户名和密码。这个叫链接用户数据库连接。

dblink_authentication
只有当你建立的是共享数据库连接时才能指定这个参数,也就是说你必须指定SHARED参数才能使用这个参数。这个参数能够指定用于链接到目标哭的用户名和密码。用户名必须是远程用户的合法用户而且密码是正确的。这个用户名和密码只当认证用,除此以外这个用户名和密码就没有别的其余操做了。

USING 'connect string'
用于指定远程数据库的服务名。若是你只给出了数据库名,那么Oracle数据库会隐式地在链接字符串中追加数据库的域名来建立一个完整的服务名。因此,若是远程数据库的数据库域名与当前库不一样时,那么你必须制定一个完整的服务名。

例子
例子假设有两个数据库,分别是local和remote。这个例子中将会用Oracle数据库的域名,也就是所它们的域名将会不一样。
1.定义一个公共数据库链接
下面定义一个名为remote的共享的公共数据库链接,并经过服务名remote来引用数据库。
CREATE PUBLIC DATABASE LINK remote USING 'remote';
local数据库的用户hr经过这个数据库连接来更新remote数据库的表(假设hr数据库有相应的权限):

UPDATE employees@remote
SET salary=salary*1.1
WHERE last_name = 'Baer';

2.定义一个固定用户数据库连接
下面语句,remote数据库上的用户hr在local数据库的hr的schema定义了一个名为local固定的数据库连接。

CREATE DATABASE LINK local CONNECT TO hr IDENTIFIED BY password USING 'local';


当数据库连接建立后,hr用户能够经过如下方式查询local数据库hr schema中的表:
SELECT * FROM employees@local;
hr用户也能够经过DML语句修改local数据库中的数据:

INSERT INTO employees@local (employee_id, last_name, email, hire_date, job_id) VALUES (999, 'Claus', 'sclaus@example.com', SYSDATE, 'SH_CLERK'); UPDATE jobs@local SET min_salary = 3000
WHERE job_id = 'SH_CLERK'; DELETE FROM employees@local
WHERE employee_id = 999;


经过这个固定数据库连接,remote数据库上的hr用户也能够访问同一个库中其余用户的表。这些语句假设hr用户有oe.customers表的read和select权限。这些语句连接到local数据库的hr用户并执行对oe.customers表的查询:

SELECT * FROM oe.customers@local;

3.定义一个CURRENT_USER的数据库连接
下面语句定义了一个到remote数据库的current-user数据库连接,并拿完整的服务名看成连接的名字。

CREATE DATABASE LINK remote.us.example.com CONNECT TO CURRENT_USER USING 'remote';


能执行上述语句的用户必须是一个在LDAP目录服务中注册的全局用户。
你能够建立一个同义词来将remote数据库上的表隐藏起来。

CREATE SYNONYM emp_table FOR oe.employees@remote.us.example.com;
相关文章
相关标签/搜索