以下是我在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的更好方法?
干杯
答案 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交易 数据库在锁定之前已完成 桌子。有时候会产生 延迟是相当可观的。