数据库链与同义词
- ·数据库人员面试:SQL Server常用测试
·Oracle数据库客户端的安装和配置
·PHP连接数据库的方法(3)
·Oracle数据库网络的安装和配置(1)
·用JSP从数据库中读取图片并显示在网页
·[冷枫推荐]:数据库操作,内外联查询
·PHP中使用类对数据库进行操作
·图解MySQL数据库的安装和操作 (1)
·InterBase 数据库函数库
·利用外部命令Oralce数据库导入导出
建立包含数据库链的同义词时需要额外的注意,否则很可能会出现问题。
如果同义词指向当前用户的对象,那么不会存在任何问题:
SQL> CONN YANGTK/YANGTK@YTK已连接。
SQL> CREATE DATABASE LINK TEST2 CONNECT TO TEST IDENTIFIED BY TEST USING 'TEST2';
数据库链接已创建。
SQL> SELECT COUNT(*) FROM TEST@TEST2;
COUNT(*)
----------
5
SQL> CREATE SYNONYM TEST FOR TEST@TEST2;
同义词已创建。
SQL> SELECT COUNT(*) FROM TEST;
COUNT(*)
----------
5如果是其他用户建立同义词指向TEST@TEST2,则会出现问题:
SQL> CREATE USER ABC IDENTIFIED BY ABC;
用户已创建。
SQL> GRANT DBA TO ABC;
授权成功。
SQL> CONN ABC/ABC@YTK已连接。
SQL> CREATE SYNONYM TEST FOR YANGTK.TEST;
同义词已创建。
SQL> SELECT COUNT(*) FROM TEST;
SELECT COUNT(*) FROM TEST
*第 1 行出现错误:
ORA-02019: 未找到远程数据库的连接说明
导致这个问题的最根本原因是数据库链,由于数据库链格式的特殊性,决定了其无法通过SCHEMA.DBLINK_NAME的方式访问。所以,用户只能访问当前用户下的数据库链或PUBLIC数据库链。
而对于同义词而言,只是一个别名而已,实际执行的时候,仍然会替换成原本的名称,所以实际上执行的是:SELECT COUNT(*)FROM TEST@TEST2。
而当前用户并不包含数据库链,所以出现了上面的错误。这个时候需要在当前用户下建立同样的数据库链:
SQL> CREATE DATABASE LINK TEST2 CONNECT TO TEST IDENTIFIED BY TEST USING 'TEST2';
数据库链接已创建。
SQL> SELECT COUNT(*) FROM TEST;
COUNT(*)
----------
5
如果同义词指向的是全局数据库链则不会出现这个问题。
还有一点需要注意,如果当前用户已经存在一个同名的指向其他数据库的数据库链,或者用户人为的创建了一个这样的数据库链,就会造成错误的结果。
SQL> CREATE DATABASE LINK TEST2 CONNECT TO TEST IDENTIFIED BY TEST USING 'TESTDATA';
数据库链接已创建。
SQL> SELECT COUNT(*) FROM TEST;
COUNT(*)
----------
1
SQL> SELECT COUNT(*) FROM YANGTK.TEST;
COUNT(*)
----------
1
SQL> CONN YANGTK/YANGTK@YTK已连接。
SQL> SELECT COUNT(*) FROM TEST;
COUNT(*)
----------
5
表面上两个用户访问的是同一个对象,但是两个用户时间上访问的是不同的数据库,这里一定要小心。
- 最新文章
- 在JRuby中构建Apache Derby数据库应用程序的两..[01-08]
- 数据库系统的安全框架及各层安全技术[01-08]
- 剖析数据库特性:滞后联编和对象嵌套[01-08]
- 使用Hibernate编写通用数据库操作代码[01-08]
- 在多种数据库环境下管理业务需求(上)[01-08]
- 重新编译PLSQL中无效对象或指定对象[01-08]
- 相关文章
- 在JRuby中构建Apache Derby数据库应用程序的两..[01-08]
- 数据库系统的安全框架及各层安全技术[01-08]
- 剖析数据库特性:滞后联编和对象嵌套[01-08]
- 使用Hibernate编写通用数据库操作代码[01-08]
- 在多种数据库环境下管理业务需求(上)[01-08]
- OpenBSD4.0 PostgreSQL8.1.5数据库的..[01-08]
