2011-07-05 13 views
2

以下は、oracleのローカルマシンでUSERとTABLESPACEを削除して再作成するために実行するステートメントです。テーブルロックが無効になっているときにTABLESPACEとUSERを削除する

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を有効にするか、ロックを無効にしてローカルのTABLESPACEとUSERを再作成するより良い方法ですか?

乾杯

+0

このテーブルスペースでロックを無効にする方法はありますか? –

+0

'ALTER TABLE table_nameテーブルロックを無効にする; ' – Cellze

答えて

4

DISABLE TABLE LOCKコマンドの目的は、DDLを防ぐためです。最初にテーブルロックを再度有効にすることなくテーブルを削除することができれば、それは私のバグです。あなたは、このようなこの1のようにスクリプトを使って、テーブルのロックを有効にする必要がありますあなたの場合は

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トランザクションが完了してから テーブルをロックするまで待機します。時には結果として の遅延が相当なものになります。

+0

フィードバック@Vincentのために、毎回テーブルスペースとユーザーを再作成する前にこれを行う必要があるかどうかは分かりませんでした。私はすでに所有権問題のために実行するスクリプトを持っているので、これも同様に使用するように修正します。 – Cellze