Home  >  Article  >  Database  >  关于dual表的破坏性测试

关于dual表的破坏性测试

WBOY
WBOYOriginal
2016-06-07 16:43:10857browse

关于dual表的破坏性测试,既然是破坏性测试,就需要确定这个测试仅限于测试或者个人学习所用,可能有些sql看似极为简单,但是一旦

关于dual表的破坏性测试,既然是破坏性测试,就需要确定这个测试仅限于测试或者个人学习所用,可能有些sql看似极为简单,但是一旦运行就会导致整个业务系统崩溃。
 比如说我们拿dual表开刀,这个表是一个dummy表,里面的内容没有特定的意义,就是为了存在而存在。但是一旦这个表出现问题,所有相关的基础操作都会受到影响,后果不敢想象。
 来简单模拟一下,在个人的机器上开始做下面的尝试,drop 表dual

SQL> show user
 USER is "SYS"
 SQL>
 SQL> show parameter insta
 NAME                                TYPE        VALUE
 ------------------------------------ ----------- ------------------------------
 active_instance_count                integer
 cluster_database_instances          integer    1
 instance_groups                      string
 instance_name                        string      TEST01
 instance_number                      integer    0
 instance_type                        string      RDBMS
 open_links_per_instance              integer    4
 parallel_instance_group              string
 parallel_server_instances            integer    1
 SQL> drop table dual;  --运行这个命令也没有出现任何的问题
Table dropped.

SQL> select count(*)from dual;  --但是一旦开始尝试查询操作就会报出1775的错误。
select count(*)from dual
                    *
 ERROR at line 1:
 ORA-01775: looping chain of synonyms

SQL> select *from dual;              --再次尝试,问题依旧,可以想象在线业务系统出现这个问题是致命的影响。
select *from dual
              *
 ERROR at line 1:
 ORA-01775: looping chain of synonyms
--如果没有尝试重启数据库的情况下,完全可以采用如下的方式来解决,我们可以完全重建表dual,插入dummy的数据

SQL> CREATE TABLE "SYS"."DUAL" 
            (      "DUMMY" VARCHAR2(1)
            ) TABLESPACE "SYSTEM" ;
 Table created.

SQL> GRANT SELECT ON "SYS"."DUAL" TO PUBLIC WITH GRANT OPTION;
 Grant succeeded.

SQL> select *from dual;
 no rows selected

SQL> insert into dual values('X');
 1 row created.

SQL> commit;
 Commit complete.

SQL> select *from dual; --简单的验证,会发现问题似乎解决了。
D
 -
 X

SQL> select sysdate from dual;  --尝试使用dual来查询时间,也没有发现问题。

SYSDATE
 ------------------
 20-NOV-14
这个时候可以查看相关的sys下的失效对象,会发现受到影响的还不少,这个时候可以重新编译。

SQL> select object_name,owner ,object_type from dba_objects where status='INVALID'
 OBJECT_NAME                    OWNER                          OBJECT_TYPE
 ------------------------------ ------------------------------ -------------------
 AQ$_ALERT_QT_V                SYS                            EVALUATION CONTEXT
 ALERT_QUE_R                    SYS                            RULE SET
 ALERT_QUE_N                    SYS                            RULE SET
 DBMS_RCVMAN                    SYS                            PACKAGE BODY
 DBMS_BACKUP_RESTORE            SYS                            PACKAGE BODY
 DBMS_CDC_UTILITY              SYS                            PACKAGE BODY
 DBMS_CDC_ISUBSCRIBE            SYS                            PACKAGE BODY
 AQ$_AQ$_MEM_MC_V              SYS                            EVALUATION CONTEXT
 AQ$_AQ_PROP_TABLE_V            SYS                            EVALUATION CONTEXT
 AQ_PROP_NOTIFY_R              SYS                            RULE SET
 AQ_PROP_NOTIFY_N              SYS                            RULE SET

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn