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

How do I invalidate a table in Oracle 11g on purpose?

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

select * from user_tables where status != 'VALID'

为了测试,我认为创建一个 table 并故意使其无效会很好。有办法吗?

使视图无效很容易,只需删除其中一个基础 tables。

欢迎任何提示。

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

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

例如,

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>

因此,table 现在处于 有效状态 。让我们把它设为 INVALID:

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>

这是一个老问题,但我想为未来的读者指出一些事情,状态 user_tables 中有效的反义词是 UNUSABLE 所以如果你想做一个 table UNUSABLE,来自 oracle doc

的 DROP TABLE 操作失败

If a previous DROP TABLE operation failed, indicates whether the table is unusable (UNUSABLE) or valid (VALID)

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