当用户要跨本地数据库,访问另外一个数据库表中的数据时,本地数据库中必须创建了远程数据库的dblink,通过dblink本地数据库可以像访问本地数据库一样访问远程数据库表中的数据。下面讲介绍如何在本地数据库中创建dblink. 1,创建dblink一般有两种方式,不过在创建dblink之前用户必须有创建dblink的权限。想知道有关dblink的权限,以sys用户登录到本地数据库: sys@ORCL> select * from user_sys_privs t where t.privilege likeupper('%link%');
USERNAME PRIVILEGE ADM
---------------------------------------------------------------------- ---
SYS DROP PUBLICDATABASE LINK NO
SYS CREATE DATABASELINK NO
SYS CREATE PUBLICDATABASE LINK NO 可以看出在数据库中dblink有三种权限CREATE DATABASE LINK(所创建的dblink只能是创建者能使用,别的用户使用不了),CREATE PUBLICDATABASE LINK(public表示所创建的dblink所有用户都可以使用),DROP PUBLIC DATABASE LINK。
2,在sys用户下,把CREATE PUBLIC DATABASE LINK,DROP PUBLICDATABASE LINK权限授予给你的用户 sys@TEST> grant CREATE PUBLIC DATABASE LINK,DROP PUBLIC DATABASE LINK to hr;
Grant succeeded.
3, 然后以hr用户登录本地数据库 1).创建dblink的第一种方式,是在本地数据库tnsnames.ora文件中配置了要远程访问的数据库。 hr@TEST> create public database link to_orclconnect to hr identified by hr using 'orcl';
Database link created. 其中to_orcl是你创建的dblink名字, orcl是远程数据库的实例名,hr/hr是登录到远程数据库的用户/密码。然后在本地数据库中通过dblink访问远程数据库'orcl'中hr.employees表,sql语句如下所示 hr@TEST> select * from hr.employees@to_orcl;
2).创建dblink的第二种方式,是在本地数据库tnsnames.ora文件中没有配置要访问的远程数据库, hr@TEST> create database link to_test connect to scott identified by tigerusing '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.226)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)))';
Database link created.
第二种是把第一种配置在tnsnames.ora文件中的信息,直接放在创建dblink语句后面。
hr@TEST> select * from scott.emp@to_test;
第一种情况tnsnames.ora文件中信息如下: orcl =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.226)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
4,
查询方法:
1)、执行select * from dba_db_links;语句。
2)、在PL/SQL中,在左边浏览器中点击database links就可以看到数据库链路了。
创建Create database link语句:create publicdatabase link 链路名 connect to 用户identified by 口令 using '连接字符串';
附录:oracle11g之前版本数据库内创建到oracle11g的dblink的密码问题解决方案
hr@TEST> create database link to_testconnect to scott identified by tiger using'(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.226)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)))';
Database link created.
hr@TEST> select * fromscott.emp@to_test;
select * from scott.emp@to_test
*
ERROR at line 1:
ORA-01017: invalid username/password; logondenied
ORA-02063: preceding line from TO_TEST
hr@TEST> drop database link to_test;
Database link dropped.
hr@TEST> create database link to_testconnect to "scott" identified by "tiger" using '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.226)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)))';
Database link created.
hr@TEST> select * fromscott.emp@to_test;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------------------------- ---------- ------------ ---------- ---------- ----------
7369 SMITH CLERK 790217-DEC-80 800 20
7499 ALLEN SALESMAN 769820-FEB-81 1600 300 30
7521 WARD SALESMAN 769822-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 769828-SEP-81 1250 1400 30
7698 BLAKE MANAGER 783901-MAY-81 2850 30
7782 CLARK MANAGER 783909-JUN-81 2450 10
7788 SCOTT ANALYST 756619-APR-87 3630 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 769808-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 769803-DEC-81 950 30
7902 FORD ANALYST 756603-DEC-81 3000 20
7934 MILLER CLERK 778223-JAN-82 1300 10
14 rows selected.