Maison  >  Article  >  base de données  >  关于dual表的破坏性测试

关于dual表的破坏性测试

WBOY
WBOYoriginal
2016-06-07 16:43:10859parcourir

关于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

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn