我正在编写一个小查询来查找Oracle中的无效表:
select * from user_tables where status != 'VALID'
为了进行测试,我认为创建一个表并使其无意无效是一件好事。有没有办法做到这一点?
使视图无效,只需删除其中一个基础表。
任何暗示欢迎。
答案 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给出了一个表无效的很好例子。