Oracle无法通过同义词访问远端分区表的某个分区
2006-06-29 20:15
676 查看
Oracle9i中访问远端数据库表的分区会报错ORA-14100。如果在本地建立远端数据库表的同义词,然后通过同义词进行分区的访问会得到错误的结果。
数据库版本9204。
看下面这个例子,首先在远端数据库建立一个分区表:
SQL> CONN TEST/TEST@TEST2已连接。
SQL> CREATE TABLE T (ID NUMBER, START_DATE DATE)
2 PARTITION BY RANGE(START_DATE)
3 (
4 PARTITION P1 VALUES LESS THAN (TO_DATE('2006-05-01', 'YYYY-MM-DD')),
5 PARTITION P2 VALUES LESS THAN (TO_DATE('2006-06-01', 'YYYY-MM-DD')),
6 PARTITION P3 VALUES LESS THAN (MAXVALUE)
7 );
表已创建。
SQL> INSERT INTO T SELECT ROWNUM, SYSDATE - 30 + ROWNUM FROM DBA_TABLES;
已创建2541行。
SQL> COMMIT;
提交完成。
SQL> SELECT COUNT(*) FROM T PARTITION (P1);
COUNT(*)
----------
22
SQL> SELECT COUNT(*) FROM T PARTITION (P2);
COUNT(*)
----------
31
SQL> SELECT COUNT(*) FROM T PARTITION (P3);
COUNT(*)
----------
2488
下面在本地数据库建立一个连接到远端数据库的数据库链。
SQL> CONN YANGTK/YANGTK已连接。
SQL> CREATE DATABASE LINK TEST2 CONNECT TO TEST IDENTIFIED BY TEST USING 'TEST2';
数据库链接已创建。
SQL> SELECT COUNT(*) FROM T@TEST2;
COUNT(*)
----------
2541
SQL> SELECT COUNT(*) FROM T@TEST2 PARTITION (P1);
SELECT COUNT(*) FROM T@TEST2 PARTITION (P1)
*第 1 行出现错误:
ORA-14100: 分区扩展表名不能指远程对象
SQL> CREATE SYNONYM S_T_TEST2 FOR T@TEST2;
同义词已创建。
SQL> SELECT COUNT(*) FROM S_T_TEST2;
COUNT(*)
----------
2541
SQL> SELECT COUNT(*) FROM S_T_TEST2 PARTITION (P1);
COUNT(*)
----------
2541
SQL> SELECT COUNT(*) FROM S_T_TEST2 PARTITION (P1234);
COUNT(*)
----------
2541
测试发现虽然通过建立远端对象同义词的方式可以使用PARTITION语句,但是PARTITION语句并没有起任何作用。而且在最后的查询中,指定了一个不存在的分区,但是并没有报错,说明Oracle忽略了PARTITION语句。
而建立本地对象的同义词则不存在这个问题:
SQL> CONN YANGTK/YANGTK已连接。
SQL> CREATE TABLE T (ID NUMBER, START_DATE DATE)
2 PARTITION BY RANGE(START_DATE)
3 (
4 PARTITION P1 VALUES LESS THAN (TO_DATE('2006-05-01', 'YYYY-MM-DD')),
5 PARTITION P2 VALUES LESS THAN (TO_DATE('2006-06-01', 'YYYY-MM-DD')),
6 PARTITION P3 VALUES LESS THAN (MAXVALUE)
7 );
表已创建。
SQL> INSERT INTO T SELECT ROWNUM, SYSDATE - 30 + ROWNUM FROM DBA_TABLES;
已创建1549行。
SQL> COMMIT;
提交完成。
SQL> SELECT COUNT(*) FROM T PARTITION (P1);
COUNT(*)
----------
22
SQL> SELECT COUNT(*) FROM T PARTITION (P2);
COUNT(*)
----------
31
SQL> SELECT COUNT(*) FROM T PARTITION (P3);
COUNT(*)
----------
1496
SQL> CREATE SYNONYM S_T FOR T;
同义词已创建。
SQL> SELECT COUNT(*) FROM S_T PARTITION (P1);
COUNT(*)
----------
22
说明Oracle还是不能通过数据库链进行PARTITION相关的操作,但是如果对同义词采用这种方式的查询,则Oracle没有进行相应的判断,而仅仅是忽略分区语句。
Oracle的同义词的问题相对比较多,类似的bug还有:
数据库版本9204。
看下面这个例子,首先在远端数据库建立一个分区表:
SQL> CONN TEST/TEST@TEST2已连接。
SQL> CREATE TABLE T (ID NUMBER, START_DATE DATE)
2 PARTITION BY RANGE(START_DATE)
3 (
4 PARTITION P1 VALUES LESS THAN (TO_DATE('2006-05-01', 'YYYY-MM-DD')),
5 PARTITION P2 VALUES LESS THAN (TO_DATE('2006-06-01', 'YYYY-MM-DD')),
6 PARTITION P3 VALUES LESS THAN (MAXVALUE)
7 );
表已创建。
SQL> INSERT INTO T SELECT ROWNUM, SYSDATE - 30 + ROWNUM FROM DBA_TABLES;
已创建2541行。
SQL> COMMIT;
提交完成。
SQL> SELECT COUNT(*) FROM T PARTITION (P1);
COUNT(*)
----------
22
SQL> SELECT COUNT(*) FROM T PARTITION (P2);
COUNT(*)
----------
31
SQL> SELECT COUNT(*) FROM T PARTITION (P3);
COUNT(*)
----------
2488
下面在本地数据库建立一个连接到远端数据库的数据库链。
SQL> CONN YANGTK/YANGTK已连接。
SQL> CREATE DATABASE LINK TEST2 CONNECT TO TEST IDENTIFIED BY TEST USING 'TEST2';
数据库链接已创建。
SQL> SELECT COUNT(*) FROM T@TEST2;
COUNT(*)
----------
2541
SQL> SELECT COUNT(*) FROM T@TEST2 PARTITION (P1);
SELECT COUNT(*) FROM T@TEST2 PARTITION (P1)
*第 1 行出现错误:
ORA-14100: 分区扩展表名不能指远程对象
SQL> CREATE SYNONYM S_T_TEST2 FOR T@TEST2;
同义词已创建。
SQL> SELECT COUNT(*) FROM S_T_TEST2;
COUNT(*)
----------
2541
SQL> SELECT COUNT(*) FROM S_T_TEST2 PARTITION (P1);
COUNT(*)
----------
2541
SQL> SELECT COUNT(*) FROM S_T_TEST2 PARTITION (P1234);
COUNT(*)
----------
2541
测试发现虽然通过建立远端对象同义词的方式可以使用PARTITION语句,但是PARTITION语句并没有起任何作用。而且在最后的查询中,指定了一个不存在的分区,但是并没有报错,说明Oracle忽略了PARTITION语句。
而建立本地对象的同义词则不存在这个问题:
SQL> CONN YANGTK/YANGTK已连接。
SQL> CREATE TABLE T (ID NUMBER, START_DATE DATE)
2 PARTITION BY RANGE(START_DATE)
3 (
4 PARTITION P1 VALUES LESS THAN (TO_DATE('2006-05-01', 'YYYY-MM-DD')),
5 PARTITION P2 VALUES LESS THAN (TO_DATE('2006-06-01', 'YYYY-MM-DD')),
6 PARTITION P3 VALUES LESS THAN (MAXVALUE)
7 );
表已创建。
SQL> INSERT INTO T SELECT ROWNUM, SYSDATE - 30 + ROWNUM FROM DBA_TABLES;
已创建1549行。
SQL> COMMIT;
提交完成。
SQL> SELECT COUNT(*) FROM T PARTITION (P1);
COUNT(*)
----------
22
SQL> SELECT COUNT(*) FROM T PARTITION (P2);
COUNT(*)
----------
31
SQL> SELECT COUNT(*) FROM T PARTITION (P3);
COUNT(*)
----------
1496
SQL> CREATE SYNONYM S_T FOR T;
同义词已创建。
SQL> SELECT COUNT(*) FROM S_T PARTITION (P1);
COUNT(*)
----------
22
说明Oracle还是不能通过数据库链进行PARTITION相关的操作,但是如果对同义词采用这种方式的查询,则Oracle没有进行相应的判断,而仅仅是忽略分区语句。
Oracle的同义词的问题相对比较多,类似的bug还有:
相关文章推荐
- Oracle无法通过同义词访问远端分区表的某个分区
- C#通过Oracle.ManagedDataAccess无法访问Oralce
- oracle dblink结合同义词的用法 PLS-00352:无法访问另一数据库
- Oracle小写字母同义词名称无法访问
- oracle Release 2安装时网络无法通过问题!
- Oracle用分区表分区交换做历史数据迁移
- oracle临时表空间 ORA-01652:无法通过16(在表空间XXX中)扩展 temp 字段
- 安装了ORALCE client 通过IIS发布的网站却不能访问ORACLE。
- 深入理解 Oracle 分区(3):分区表和分区索引概述
- 解决Chrome浏览器打开新标签页,显示“无法访问此网站 连接已重置”的问题【在54.0 beta版上测试通过】
- 静态资源无法通过请求转发的方式访问!!!!!
- WebService 通过POST方式访问时候,因 URL 意外地以“/方法名”结束,请求格式无法识别 解决办法
- Oracle 11g 通过间隔分区实现按月创建表分区
- ubuntu11.10英文版通过网络和 smbfs 命令访问 Windows XP Pro 中文版的 NTFS 分区共享文件夹
- localhost:8080/XXX.jsp 本机无法访问,其他人的电脑却可以通过IP地址访问本机的WEB应用的问题
- Oracle--分区表(范围分区、Hash分区、等)
- oracle分区表、分区索引详解!
- oracle分区表、分区索引的管理!
- 在oracle中通过链接服务器(dblink)访问sql server