如何故意使Oracle 11g中的表无效?

时间:2015-04-30 08:38:00

标签: sql oracle oracle11g invalidation

我正在编写一个小查询来查找Oracle中的无效表:

select * from user_tables where status != 'VALID'

为了进行测试,我认为创建一个表并使其无意无效是一件好事。有没有办法做到这一点?

使视图无效,只需删除其中一个基础表。

任何暗示欢迎。

2 个答案:

答案 0 :(得分:4)

您在 user_tables 中看不到状态无效,但是,您会在 [USER|ALL|DBA]_OBJECTS中看到 strong>查看。

一种简单的方法是使用对象类型创建表格,并将对象类型属性强制为无效

例如,

SQL> CREATE OR REPLACE TYPE mytype AS OBJECT(col1 VARCHAR2(10))
  2  /

Type created.

SQL>
SQL> CREATE TABLE t(col1 NUMBER,col2 mytype)
  2  /

Table created.

SQL>
SQL> SELECT object_name, object_type, status FROM user_objects WHERE object_name='T'
  2  /

OBJECT_NAME OBJECT_TYPE             STATUS
----------- ----------------------- -----------
T           TABLE                   VALID

SQL>

因此,该表现在处于 VALID状态。让我们无效

SQL> ALTER TYPE mytype ADD ATTRIBUTE col2 NUMBER INVALIDATE
  2  /

Type altered.

SQL>
SQL> SELECT object_name, object_type, status FROM user_objects WHERE object_name='T'
  2  /

OBJECT_NAME OBJECT_TYPE             STATUS
----------- ----------------------- -----------
T           TABLE                   INVALID

SQL>

答案 1 :(得分:0)

这是一个古老的问题,但我想为将来的读者指出一些问题,状态user_tables中的有效对立是UNUSABLE,因此,如果要创建表UNUSABLE,请执行DROP TABLE操作因oracle doc

而失败
  

如果先前的DROP TABLE操作失败,则指示该表是否   不可用(不可用)或有效(有效)

对于user_objects中的类型INVALID,它主要与views/package/procedure相关,但是lalit kumar给出了一个表无效的很好例子。