li
  当前位置:主页 > 性能优化 > 文章内容
li
数据库链与同义词
来源: http://yangtingkun.itpub.net/  作者: yangtingkun    时间:2008-01-26   阅读:8  

建立包含数据库链的同义词时需要额外的注意,否则很可能会出现问题。


如果同义词指向当前用户的对象,那么不会存在任何问题:

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

如果同义词指向的是全局数据库链则不会出现这个问题。

IXDBA.NET社区论坛

还有一点需要注意,如果当前用户已经存在一个同名的指向其他数据库的数据库链,或者用户人为的创建了一个这样的数据库链,就会造成错误的结果。

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

表面上两个用户访问的是同一个对象,但是两个用户时间上访问的是不同的数据库,这里一定要小心。




  上一篇: PUBLIC数据库链无法删除的问题(...   下一篇: ORA-7445(qxuagtag)错误
li
 §相关评论  
 热点文章

·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 编辑推荐
·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 相关篇章
·PUBLIC数据库链无法删除的问题(...
·调整本地时间的小bug
·远端数据库读取插入到另一个远端...
·远端数据库读取插入到另一个远端...
·能否通过数据库链传播游标
·数据库链的USING语句
·通过数据库链访问当前库
·访问本地物化视图一定比访问远端...
·如何从远端返回LOB对象
·使用数据库链的几个小技巧
·ORA-7445(qxuagtag)错误
·对远端表使用NVL2的bug
·通过数据库链执行TEXT操作的小bu...
·oracle的执行计划居然出错!
·去掉DB_DOMAIN的方法
·建立支持查询重写的同名物化视图...
·物化视图查询重写的限制(一)
·物化视图查询重写的限制(二)
·物化视图日志没有清除
·物化视图日志如何避免系统时间变...
 
li
设为首页 | 关于我们 | 技术服务 | 收藏本站 | 网站地图 | 联系方式 | 本站友情连接