Database links

--=======================================================
--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

 

 

 

 

 

 

 

 

 

 

posted @ 2012-11-12 15:38  Mr-sniper  阅读(543)  评论(0编辑  收藏  举报