db link

1、dblink的种类

  私有dblink:私有dblink用create database link语句创建,私有dblink只能在该数据库中由创建该dblink的用户才能使用和删除,其他用户都不可以使用和删除。

           举例: create  database link  ts connect to  user  identified by mima using ' ora11g';

                  ora11g是在 /u01/app/oracle/product/11.2.0/dbhome_2/network/admin/ tnsnames.ora  这定义的服务

         ora11g =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.5)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = ora10g)

    )  )

   公有 dblink:公有dblink用create public database link语句创建,只要是数据库里的用户都可以使用公有dblink,如果用户有删除dblink的权限,                                           那么就可以删除任何公有dblink。                     

             举例: create  publicdatabase link  ts connect to  user  identified by "mima" using ' ora11g';

                                  

global dblink:  和共有私有不同的是global dblink创建不用直接在tnsnames.ora中定义,而是直接把服务写在dblink的定义中

create public database link ts connect to user identified by "mima" using '(DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = ip)(PORT = 1521))

    )  (CONNECT_DATA =

      (SERVICE_NAME = 服务名称)

    ))';

  

2、创建dblink需要的权限

  dblink只是存在于本地数据库的一个指针,可以让你去访问远端数据库的对象

PrivilegeDatabaseRequired For
CREATE DATABASE LINKLocalCreation of a private database link.
CREATE PUBLIC DATABASE LINKLocalCreation of a public database link.
CREATE SESSIONRemoteCreation of any type of database link.

 

通过下面的语句可以查看,当前用户拥有创建dblink的那些权限

SELECT DISTINCT PRIVILEGE AS "Database Link Privileges" FROM ROLE_SYS_PRIVS WHERE PRIVILEGE IN ( 'CREATE SESSION','CREATE DATABASE LINK',  'CREATE PUBLIC DATABASE LINK')

建立database link之前需要确认的事项:

  1. 如果using使用,那么l本地数据库到remote database的网络连接是正常的,tnsping要能成功。远端的监听正常启动
  2. 确认在remote database上面有相应的访问权限,用户名,密码正确。


3、创建dblink
Description of create_database_link.gif follows

4、dblink按照连接用户划分

指明连接用户的方式私有link共有link解释
fix usercreate database link ts connect to user identified by "mima" using 'net_link';create  public database link ts connect to user identified by "mima" using 'net_link';fix user link是指,所有使用此link的用户必须使用建立link时指定 connect user和密码 去连接对方数据库
current_usercreate database link ts connect to current_user using 'net_link';create public database link ts connect to current_user using 'net_link';使用当前用户
connect usercreate database link ts using 'net_link'create public database link ts using 'net_link'使用当前登录的用户的用户名和密码去连接对方数据库相同的用户

fix user  link:好用的就是fixed user,创建时指定连接远程数据库的用户名和密码并存在数据字典里。以后所有的使用dblink 的用户实际上都是使用这个用户名和密码来登录到远程数据库的,在远程数据库的权限和这个用户一样

connect user 实验:

ora11g数据库:

SQL> create public database link ts using 'ora11g';

SQL> grant dba to u1;

SQL> create table t1 as select * From scott.dept;

Table created.

ora10g数据库:

SQL> create user u1 identified by u1  account unlock;

SQL> grant dba to u1;

SQL> create public database link ts using 'ora11g';

conn u1/u1

SQL> select * From t1@ts;

    DEPTNO DNAME   LOC
---------- -------------- -------------
 10 ACCOUNTING   NEW YORK
 20 RESEARCH   DALLAS
 30 SALES   CHICAGO
 40 OPERATIONS   BOSTON

 

conn scott/mima

SQL> select * From dept@ts;

    DEPTNO DNAME   LOC
---------- -------------- -------------
 10 ACCOUNTING   NEW YORK
 20 RESEARCH   DALLAS
 30 SALES   CHICAGO
 40 OPERATIONS   BOSTON

 

ora11g数据库:

SQL> grant select on t1 to scott;

Grant succeeded.

SQL> conn scott/tiger
Connected.
SQL> select  * from u1.t1;

    DEPTNO DNAME   LOC
---------- -------------- -------------
 10 ACCOUNTING   NEW YORK
 20 RESEARCH   DALLAS
 30 SALES   CHICAGO
 40 OPERATIONS   BOSTON

 

ora10g数据库:

SQL> show user
USER is "SCOTT"
SQL> select * From u1.t1@ts;

    DEPTNO DNAME   LOC
---------- -------------- -------------
 10 ACCOUNTING   NEW YORK
 20 RESEARCH   DALLAS
 30 SALES   CHICAGO
 40 OPERATIONS   BOSTON

 

 


结论:

(1)connect user 方式创建dblink,其连接对方数据库的方式是:用登录数据库的用户名和密码去登录对方数据库,说明两边数据库的用户名和密码必须一致,才能用connect user方式,否则会报错

(2)公用dblink可以给多用户使用,只要两端数据库的用户名和密码一样,都可以用除sys用户名外的用户验证,私有dblink只能给一个用户使用,那就是创建link的用户。

 (3)如果dblink连接用户名和密码都通过对方数据库的验证,那么可以拥有对方数据库相同用户的查询权限

 

current user 方式的link,暂时实验不通,有待进一步研究

5、share  link:

           In a shared database link, multiple sessions in the source database share the same connection to the target database. Once a session is established on the target database, that session is disassociated from the connection, to make the connection available to another session on the source database. To prevent an unauthorized session from attempting to connect through the database link, when you specifySHARED you must also specify thedblink_authentication clause for the users authorized to use the database link.

 

以share 方式创建dlbink,那么源端的数据库的多个session可以共享目标端的同一个连接。一旦某个session在目标端数据库建立连接后,就会断开,目的是为了让源端的session可以使用,以share方式建立起的link,为了阻止未授权的session试图通过dblink去连接目标端数据库,你可以指定dblink authentication子句让用户验证使用dblink

共享数据库链接是指该链接的多个用户可以共享同一个底层网络连接。

在创建share link的时候如果不指定public,那么默认创建的是私有 share dblink,如果指定了public,那么创建的是public dblink

SQL> create shared database link ss AUTHENTICATED by scott identified by "tiger" using 'ora11g';

SQL> select * From dba_db_links;

OWNER          DB_LINK   USERNAME    HOST          CREATED
------------------------------ ---------- ------------------------------ -------------------------------------------------- ---------
SCOTT          SS      ora11g          09-JUN-13


 

6、 给dblink起别名

-- 不想让使用的人知道database link的名字的时候
-- 建一个别名包装一下
CREATE SYNONYM table_name FOR table_name@database link;
SELECT * FROM table_name
;
-- 或者,也可以建立一个视图来封装

CREATE VIEW table_name AS SELECT * FROM  table_name@database link;

 

 

7、dblink也是一个事物

select * from v$transaction;-- 没有记录,说明没有事务
 -- 通过database link连接远程数据库,select 其中一个表
 select * from bbs_news@mylink;
 select * from v$transaction;-- 发现有一条记录。

因为本地数据库只是将对应的sql发送给远程数据库执行,接受remote db返回的结果,但他并不知道是否该sql修改了数据; 所以需要为select 语句也标示一个事务。具体可以参考otn 分布式数据库手册,所以在用database link远程访问时,要加上set transaction read only

 

8、查看global_name

 

SQL> show parameter global_name

NAME         TYPE  VALUE
------------------------------------ ----------- ------------------------------
global_names        boolean  FALSE

 

如果global_name=true,那么你创建的dblink名称要和对方数据库的globalname名称一样,否则,建立的dblink会报错。如果global_name=false ,那么你的dblink名称可以随意建立

具体可以参考http://blog.csdn.net/wll_1017/article/details/8991742

 

9、关闭dblink

ALTER SESSION CLOSE database link sales;

 

10、通过数据库链执行DDL语句

  1. 不能通过database link提交事务commit. 不能执行类似commit@remote_site ;只能在初始化事务的站点执行提交。
  2. 不能通过database link执行DDL语句。DDL被Oracle理解为Begin commit;exec DDL; End; 既然不能通过database link提交事务commit,也就不能运行DDL.
  3. 不能通过database link设置SAVEPOINT.总之,所有的事务控制语句(commit rollback savepoint set transaction etc)都不能通过database link执行。

 

我们知道,可以通过数据库链进行DML操作,但是所有的DDL操作都被禁止。但是幸运的是,可以通过调用远端存储过程的方式在远端站点上执行DDL操作。

简单举例如下:

SQL> conn yangtk/yangtk@yangtk
已连接。
SQL> create or replace procedure p_execute_ddl(p_ddl in varchar2) 
  2  as
  3  begin
  4  execute immediate p_ddl;
  5  end;
  6  /

过程已创建。

SQL> exec p_execute_ddl('create table aaa (id number)');

PL/SQL 过程已成功完成。

SQL> desc aaa
 名称                                 是否为空? 类型
 ------------------------------------ -------- --------
 ID                                            NUMBER

SQL> conn yangtk/yangtk@test
已连接。
SQL> create database link yangtk.yangtingkun connect to yangtk identified by yangtk using 'yangtk';

数据库链接已创建。

SQL> drop table aaa@yangtk;
drop table aaa@yangtk
               *
ERROR 位于第 1 行:
ORA-02021: 不允许对远程数据库进行 DDL 操作


SQL> exec p_execute_ddl@yangtk('drop table aaa');

PL/SQL 过程已成功完成。

SQL> select * from tab@yangtk where tname = 'AAA';

未选定行

需要注意的是,由于ddl的执行是在存储过程中,任何通过角色授予的权限都是无效的,必须明确授予权限。

当然,你也可以通过建立调用者权限的存储过程来使用角色中已经具有的权限。

参考:http://yangtingkun.itpub.net/post/468/8699

 

 

Step 1) Create procedure on Remote Site.It uses dbms_job to sumbit a ddl job. Note: dbms_job is transactional.

CREATE OR REPLACE PROCEDURE 
create_Remote_Table(p_table_name VARCHAR2) AS
job number;
BEGIN
dbms_job.submit(job,CREATE TABLE ' || p_table_name ||' (c1 number)');
END create_Remote_Table;
/

Step 2) Call the remote procedure on Local Site.

SQL> exec create_Remote_Table('t')@db_link;

PL/SQL procedure successfully completed.

Step 3) On remote site , select * from user_jobs;

SQL> select what from user_jobs;
WHAT
--------------------------------------------
create table t(c1 number);

Step 4) On Local site , commit or rollback transaction will make the remote job run or cancel.

 参考:          http://dbaoracle.itpub.net/post/901/52542



注意:

在创建数据库连接的时候需要注意些问题:

(1)密码要用双引号引起来。否则有可能会报错。

例如:create public database link tt connect to scott identified by  "tiger"  using 'ora11g'

SQL> select * from scott.t1@tt;
select * from scott.t1@tt
                       *
ERROR at line 1:
ORA-01017: invalid username/password; logon denied
ORA-02063: preceding line from TT


(2)注意区别共有dblink和私有dblink,下面两个dblink ,sys用户的,一定要用sys用户使用dblink,如果scott用户连接,也会报错的。public dblink是哪个一个用户都可以使用。删除的时候同样,私有dblink一定要用制定的用户去删除。

SQL> create  database link ts connect to scott identified by  "tiger"  using 'ora11g';
Database link created.
SQL> select  * from dba_db_links;
OWNER       DB_LINK   USERNAME  HOST     CREATED
------------------------------ -------------------- ------------------------------ -------------------------------------------------- -------------------
PUBLIC       TS   SCOTT  ora11g     2013-06-03 22:06:35
SYS       TS    SCOTT   ora11g     2013-06-03 22:29:38


参考:
http://docs.oracle.com/cd/E11882_01/server.112/e25494/ds_admin002.htm#ADMIN12150
http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_5005.htm#SQLRF01205




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值