dblink
[size=14px]当用户要跨本地数据库访问另外一个数据库表中的数据时,本地数据库中必须创建了远程数据库的DBLINK,通过DBLINK可以像访问本地数据库一样访问远程数据库表中的数据。其实,DBLINK和数据库中的VIEW差不多,创建DBLINK的时候需要知道待读取数据库的IP地址、ORACLE_SID以及数据库用户名和密码。
[size=14px]在创建DBLINK之前,普通用户必须具有相关的权限才能创建DBLINK,以SYS用户登录到本地数据库可以看到相关的权限:
[size=14px]SELECT * FROM USER_SYS_PRIVS T WHERE T.PRIVILEGE LIKE UPPER('%LINK%');
[size=14px]SYS@PROD1> SELECT * FROM USER_SYS_PRIVS T WHERE T.PRIVILEGE LIKE UPPER('%LINK%');
[size=14px]USERNAME PRIVILEGE ADM
[size=14px]------------------------------ ---------------------------------------- ---
[size=14px]SYS CREATE DATABASE LINK NO
[size=14px]SYS DROP PUBLIC DATABASE LINK NO
[size=14px]SYS CREATE PUBLIC DATABASE LINK NO
[size=14px]
[size=14px]可以看出,在数据库中DBLINK有3种权限:CREATE DATABASE LINK(所创建的DBLINK只能是创建者自己使用,别的用户不能使用)、CREATE PUBLIC DATABASE LINK(PUBLIC表示所创建的DBLINK所有用户都可以使用)与DROP PUBLIC DATABASE LINK(删除公共的DBLINK)。可以使用如下授权语句给用户SCOTT授予CREATE PUBLIC DATABASE LINK和DROP PUBLIC DATABASE LINK两个权限:
[size=14px]GRANT CREATE PUBLIC DATABASE LINK,DROP PUBLIC DATABASE LINK TO SCOTT;
[size=14px]查询数据库的DBLINK可以使用SQL语句:SELECT * FROM DBA_DB_LINKS。
[size=14px]创建DBLINK一般有两种方式,第一种方式是在本地数据库tnsnames.ora文件中配置了要远程访问的数据库的TNS,例如这里配置了TNS_BJLHR,[color=#df402a]然后创建公共DBLINK:
[size=14px]CREATE PUBLIC DATABASE LINK
[size=14px]DBL_BJLHR CONNECT TO SCOTT IDENTIFIED BY TIGER USING 'TNS_BJLHR';
[size=14px]其中,DBL_BJLHR是创建的DBLINK名字,SCOTT/TIGER是登录到远程数据库的用户名/密码,然后在本地数据库中通过DBLINK访问远程数据库“TNS_BJLHR”中SCOTT.TB_TEST表,SQL语句如下所示:
[size=14px]SELECT * FROM SCOTT.TB_TEST@DBL_BJLHR;
[size=14px]创建DBLINK的第二种方式,是在本地数据库tnsnames.ora文件中没有配置要访问的远程数据库的时候,而直接将相关的内容写到DBLINK的配置中,如下所示:
[size=14px]CREATE DATABASE LINK DBL_BJLHR
[size=14px]CONNECT TO SCOTT IDENTIFIED BY TIGER
[size=14px]USING '(DESCRIPTION =
[size=14px](ADDRESS_LIST =
[size=14px](ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.10)(PORT = 1521))
[size=14px])
[size=14px](CONNECT_DATA =
[size=14px](SERVER = DEDICATED)
[size=14px](SERVICE_NAME = BJLHR)
[size=14px])
[size=14px])';
[size=14px]其中,HOST为数据库的IP地址,SERVICE_NAME为数据库的SID,其实,两种方法配置DBLINK是差不多的,第二种方法不受本地服务的影响。
[size=14px]另外,当数据库参数GLOBAL_NAMES为TRUE时,要求数据库链接名称跟远端数据库名称一样。数据库全局名称可以用以下命令查出:
[size=14px]SELECT * FROM GLOBAL_NAME;
[size=14px]用以下语句来修改参数值:
[size=14px]ALTER SYSTEM SET GLOBAL_NAMES=FALSE/TRUE;
[size=14px]当数据库参数GLOBAL_NAMES为FALSE时,就不要求数据库链接名称跟远端数据库名称一样。
[size=14px]
[size=14px]需要注意的是,对于Private类型的dblink,只有其创建者才能删除dblink。如果是Public的dblink,那么只要有“DROP PUBLIC DATABASE LINK”的权限就可以删除dblink:
[size=14px]SYS@PROD1> create database link sh.prod2_2 connect to sh identified by sh using 'PROD2';
[size=14px]
[size=14px]Database link created.
[size=14px]SYS@PROD1> COL DB_LINK FORMAT A10
[size=14px]SYS@PROD1> COL HOST FORMAT A10
[size=14px]SYS@PROD1> COL OWNER FORMAT A10
[size=14px]SYS@PROD1> COL USERNAME FORMAT A10
[size=14px]SYS@PROD1> select * from dba_db_links d WHERE D.db_link LIKE '%PROD2_2%';
[size=14px]
[size=14px]OWNER DB_LINK USERNAME HOST CREATED
[size=14px]---------- ---------- ---------- ---------- ---------
[size=14px]SYS SH.PROD2_2 SH PROD2 15-DEC-17
[size=14px]
[size=14px]SYS@PROD1> conn sh/sh
[size=14px]
[size=14px]Connected.
[size=14px]SH@PROD1> create database link prod2 connect to sh identified by sh using 'PROD2';
[size=14px]
[size=14px]Database link created.
[size=14px]
[size=14px]SH@PROD1> conn / as sysdba
[size=14px]Connected.
[size=14px]SYS@PROD1> drop database link sh.PROD2;
[size=14px] drop database link sh.PROD2
[size=14px] *
[size=14px]ERROR at line 1:
[size=14px]ORA-02024: database link not found