禁用表LOCKS时删除TABLESPACE和USER

时间:2011-07-05 16:22:10

标签: oracle

以下是我在oracle中本地计算机上删除并重新创建USER和TABLESPACE的语句。

DROP TABLESPACE X INCLUDING CONTENTS AND DATAFILES ;
DROP USER X CASCADE;
CREATE TABLESPACE X DATAFILE '$ORACLE_PATH/X.dbf' SIZE 128M AUTOEXTEND ON EXTENT MANAGEMENT LOCAL AUTOALLOCATE SEGMENT SPACE MANAGEMENT AUTO;
CREATE USER X IDENTIFIED BY xxxxxxx DEFAULT TABLESPACE X TEMPORARY TABLESPACE temp;
GRANT exp_full_database TO X;
GRANT CONNECT,RESOURCE,DBA TO X;

我们最近添加了一个条件来禁用此TABLESPACE中的表上的锁,现在上面的DROP命令发出:

Error report:
SQL Error: ORA-00604: error occurred at recursive SQL level 1
ORA-00069: cannot acquire lock -- table locks disabled for TABLE
00604. 00000 -  "error occurred at recursive SQL level %s"

有没有人知道如何在不启用LOCK的情况下DROP USER和TABLESPACE,或者在禁用锁的情况下重新创建本地TABLESPACE和USER的更好方法?

干杯

1 个答案:

答案 0 :(得分:4)

DISABLE TABLE LOCK命令的目的是防止DDL。如果您可以放弃表而不先重新启用表锁,这对我来说就是一个错误。

在您的情况下,您必须使用以下脚本启用表锁:

BEGIN
   FOR cc IN (SELECT owner, table_name
                FROM all_tables
               WHERE tablespace_name = :x
                 AND table_lock = 'DISABLED') LOOP
      EXECUTE IMMEDIATE 'ALTER TABLE "' || cc.owner || '"."' || 
                         cc.table_name || '" ENABLE TABLE LOCK';
   END LOOP;
END;

不幸的是,可能需要很长时间才能执行,甚至fail unexpectedly

  

警告:Oracle数据库等待直到   活跃的DML交易   数据库在锁定之前已完成   桌子。有时候会产生   延迟是相当可观的。