--======================================================= --Title: DATABSE LINKS --AUTHOR:SNIPER --DESCRIPTION:@DATABSE LINKS --LOG:MODIFIED 2012/11/21 --=======================================================
有些时候我们在A数据库中需要使用数据库B中的一些信息,表/函数/视图等,这时oracle为我们提供了使用database link的方式去构建这个桥梁,我们只需要在数据库A中建立一个database link就可以实现我们所要的需求
一、DATABSE LINK的流程示意图
上面的图展示了用户scott用全局名访问在远程数据库中的emp表的流程
二 、Database links 的类型
类型 | 描述 |
Private | 在本地数据库特定的schema下,只有此database link的owner或者是此schema下的pl/sdl 的subprograns能使用这个link去访问对应的远程的数据库对象 |
Public | 数据库中所有的用户和PL/SQL subprograms可以使用这个link去访问对应的远程数据库中的对象 |
Global | 面向网络开放的link,当oracle网络使用一个目录服务器的时候,这个目录服务器会自动的创建和管理在这个网络中的每个数据库的global database links,所有的用户和PL/SQL subprograms 都可以使用这这个link去访问对应的远程数据库中的对象 |
Database links的用户,当你创建link的时候,你需要确定哪个用户可以连接远程数据库去访问数据。下面的表格解释了不同用户参与database links
用户类型 | 描述 | Link例子创建语法 |
Connected user | 用的是当前连接的用户的帐户及其密码来访问远程数据库的。所以这个类型就要求需要在远程数据库上有一个和本地帐户一样的username和password. | CREATE PUBLIC DATABASE LINK hq USING 'hq'; |
Current user | 需要用户连接到本地数据库的时候是全局用户的身份连接的。这样这个全局用户就可以使用指定帐户的上下文,而无需存储密码信息到link中 | CREATE PUBLIC DATABASE LINK hq CONNECT TO CURRENT_USER using 'hq'; |
Fixed user | 这个类型是说使用指定的帐户和密码来访问远程数据库。所以只需指定的帐户能够有权限访问远程数据库就可以。 | CREATE PUBLIC DATABASE LINK hq CONNECT TO jane IDENTIFIED BY doe USING 'hq'; |
三、创建database links
Sql语句 | 连接数据库 | 访问方式 | 连接类型 |
CREATE DATABASE LINK sales.us.americas.acme_auto.com USING 'sales_us'; | sales using net service namesales_us | Connected user | Private connected user |
CREATE DATABASE LINK foo CONNECT TO CURRENT_USER USING 'am_sls'; | sales using service name am_sls | Current global user | Private current user |
CREATE DATABASE LINK sales.us.americas.acme_auto.com CONNECT TO scott IDENTIFIED BY tiger USING 'sales_us'; | sales using net service namesales_us | scott using password tiger | Private fixed user |
CREATE PUBLIC DATABASE LINK sales CONNECT TO scott IDENTIFIED BY tiger USING 'rev'; | sales using net service name rev | scott using password tiger | Public fixed user |
CREATE SHARED PUBLIC DATABASE LINK sales.us.americas.acme_auto.com CONNECT TO scott IDENTIFIED BY tiger AUTHENTICATED BY anupam IDENTIFIED BY bhide USING 'sales'; | sales using net service name sales | scott using password tiger, authenticated as anupam using password bhide | Shared public fixed user |
这里有必要说一下net service name ,一般我们在oracle的安装下找到此文件,它也就是我们常说的配置监听的文件,下面是此配置文件的片段内容:
C:\app\ultraom1\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora
# tnsnames.ora Network Configuration File: C:\app\ultraom1\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora
# Generated by Oracle configuration tools.
WLAN =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.204.28.11)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ora10gsjwg)
)
)
所以上边表格的内容也可以这样去写:
Create database link dblinkName dblinkName connect to username identified by password using ‘NSNName=
(
Address_List=
(
(Adress=(protocol=TCP)(host=RemoteA)(port=1521))
)
(Connect_Data=(orcl))
)’
好了,以上简单的介绍了如何Oracle Database Link的类型和访问方式类型,及如何创建database link.
四、使用DATABSE LINKS
那么创建完,使用如下: (在访问权限满足的条件下)
Select * from remoteTableName@dblinkName;
其中remoteTableName是要访问的远程数据库里的表的名称,dblinkName既是先前我们创建的数据库连接。这样每次访问表,写起来都有点麻烦;而且对于普通用户,这样的接口可能我们并不提供,换句话说,我们可能只让用户知道这里有什么表或者视图就可以了。这个时候我们可以使用别名(synonym)来简化/隐藏接口,语法如下
五、使用同义词
CREATE [PUBLIC] synonym_name
FOR [schema.]object_name[@database_link_name];
Synonym支持以下的对象:
•Tables
•Types
•Views
•Materialized views
•Sequences
•Procedures
•Functions
•Packages
这里不做过多的讲解,我们为先前我们创造的database link来创建一个synonym,代码如下:
-- Create the synonym create or replace synonym tableName for remoteTableName@dblinkName;
创建完成后,我们就可以这样访问远程数据库里的表:
Select * from tableName;
上述语句等价于
Select * from remoteTableName@dblinkName;
参考:
http://docs.oracle.com/cd/B28359_01/server.111/b28310/ds_concepts002.htm
http://www.cnblogs.com/hjslovewcl/archive/2011/03/09/2314336.html