oracle dblink的创建

来源:互联网 发布:淘宝刷多少单才有生意 编辑:程序博客网 时间:2024/04/28 07:45
格式: 
① create public database link link_name connect to user identified by password using 'SID';
 则创建了一个连接到目标地址上以user 用户的连接
查询数据时带上@link_name就ok了 如:select * from emp@link_name;

②create database link linkfwq 
   connect to fzept identified by neu 
   using '(DESCRIPTION = 
   (ADDRESS_LIST = 
   (ADDRESS = (PROTOCOL = TCP)(HOST = 10.142.202.12)(PORT = 1521)) 
   ) 
   (CONNECT_DATA = 
   (SERVICE_NAME = fjept) 
   ) 
   )';

说明: 

1) 权限:创建数据库链接的帐号必须有CREATE DATABASE LINK或CREATE PUBLIC DATABASE LINK的系统权限,用来登录到远程数据库的帐号必须有CREATE SESSION权限。这两种权限都包含在CONNECT角色中(CREATE PUBLIC DATABASE LINK权限在DBA中)。

2) 一个公用数据库链接对于数据库中的所有用户都是可用的,而一个私有链接仅对创建它的用户可用。由一个用户给另外一个用户授权私有数据库链接是不可能的,一个数据库链接要么是公用的,要么是私有的。


删除: DROP PUBLIC DATABASE LINK link_name;

查询: select * from dba_db_links ;


利用dblink执行ddl 
我们知道任何ddl语句都无法在dblink中直接执行,示例如下 
SQL> desc db_test; 
 Name                                      Null?    Type 

 ----------------------------------------- -------- ---------------------------- 

 ID                                                 NUMBER(38)  


SQL> drop table db_test@DBLINK_CONNECTED_HR; drop table db_test@DBLINK_CONNECTED_HR                    
* ERROR at line 1: 
ORA-02021: DDL operations are not allowed on a remote database 

通过创建存储过程,使得能在dblink中执行ddl语句。 注意需在目标数据库的相应用户下创建存储过程 ,具体如下 
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@DBLINK_CONNECTED_HR('drop table db_test'); 

PL/SQL procedure successfully completed.


=========================================
(转载)通过修改基表(link$)让非public dblink变为public

有些朋友创建了一个非public的dblink,现在该数据库的其他用户需要去使用该dblink,在正常情况下无访问权限,需要重新建一个dblink,或者将原dblink修改为public。但是由于忘记了原dblink的目标段的密码,使得创建或者修改dblink的步骤无法进行下去。这里通过修改基表(link$),解决该问题。

创建dblink
SQL> show user;
USER is "SYS"
SQL> create database link "xff_dblink"
  2  connect to TEST
  3  identified by "test"
  4  using '11.1.1.1:1521/mcrm';
 
Database link created.
 
SQL> select * from dba_db_links where db_link like 'XFF_DBLINK%';
 
OWNER DB_LINK                                     USERN HOST               CREATED
----- ------------------------------------------- ----- ------------------ --------
SYS   XFF_DBLINK.REGRESS.RDBMS.DEV.US.ORACLE.COM  TEST  11.1.1.1:1521/mcrm 29-MAR-12
 
SQL> select sysdate from dual@xff_dblink;
 
SYSDATE
---------
29-MAR-12
 
SQL> CONN TEST/TEST
Connected.
SQL> SELECT SYSDATE FROM DUAL@XFF_DBLINK;
SELECT SYSDATE FROM DUAL@XFF_DBLINK
                         *
ERROR at line 1:
ORA-02019: connection description for remote database not found
--该dblink不是public的,所以test用户无权访问
dblink变为public类型
SQL> CONN / AS SYSDBA
Connected.
SQL> set long 1000
SQL> select  text from dba_views where view_name='DBA_DB_LINKS';
 
TEXT
-------------------------------------------------------------------
select u.name, l.name, l.userid, l.host, l.ctime
from sys.link$ l, sys.user$ u
where l.owner# = u.user#
--查询出dblink相关的基表有link$和user$
 
SQL> select owner# from sys.link$ where name like 'XFF_DBLINK%';
 
    OWNER#
----------
         0
--XFF_DBLINK对应的用户标识记录在link$.owner#中
 
SQL> SELECT USER#,NAME FROM USER$ WHERE name in ('SYS','PUBLIC');
 
     USER# NAME
---------- ------------------------------
         1 PUBLIC
         0 SYS
--现link$.owner#值为0,表示该dblink所属用户为SYS,现在让该dblink变为public
--现需要让该dblink变为public,需要做的是修改link$.owner#的值为1
 
SQL> UPDATE LINK$ SET OWNER#=1 WHERE name like 'XFF_DBLINK%';
 
1 row updated.
 
SQL> COMMIT;
 
Commit complete.
 
--需要刷新shared_pool
SQL> ALTER SYSTEM FLUSH SHARED_POOL;
 
System altered.
 
--查看dblink所属者,已经修改为public
SQL> select owner from dba_db_links where db_link like 'XFF_DBLINK%';
 
OWNER
----------
PUBLIC
 
--测试dblink是否成功
SQL> CONN TEST/TEST
Connected.
SQL> SELECT SYSDATE FROM DUAL@XFF_DBLINK;
 
SYSDATE
---------

29-MAR-12


原创粉丝点击