ビルドプロセスと進化するデータベースの一部として、ユーザーのすべてのテーブルとシーケンスを削除するスクリプトを作成しようとしています。許可されているよりも多くの権限が必要になるため、ユーザーを再作成したくありません。
私のスクリプトは、テーブル/シーケンスを削除するプロシージャを作成し、プロシージャを実行してから、プロシージャを削除します。私はsqlplusからファイルを実行しています:
drop.sql:
create or replace procedure drop_all_cdi_tables
is
cur integer;
begin
cur:= dbms_sql.OPEN_CURSOR();
for t in (select table_name from user_tables) loop
execute immediate 'drop table ' ||t.table_name|| ' cascade constraints';
end loop;
dbms_sql.close_cursor(cur);
cur:= dbms_sql.OPEN_CURSOR();
for t in (select sequence_name from user_sequences) loop
execute immediate 'drop sequence ' ||t.sequence_name;
end loop;
dbms_sql.close_cursor(cur);
end;
/
execute drop_all_cdi_tables;
/
drop procedure drop_all_cdi_tables;
/
残念ながら、プロシージャを削除すると問題が発生します。競合状態が発生しているようで、実行前にプロシージャがドロップされます。
例えば:
SQL * Plus:リリース11.1.0.7.0-2010年3月30日火曜日18:45:42に本番環境 Copyright(c)1982、2008、Oracle。全著作権所有。 に接続されています: Oracle Database 11gEnterpriseEditionリリース11.1.0.7.0-64ビット本番 パーティショニング、OLAP、データマイニング、および実際のアプリケーションテストオプションを使用 プロシージャが作成されました。 PL/SQLプロシージャが正常に完了しました。 プロシージャが作成されました。 手順が削除されました。 ドロッププロシージャdrop_all_user_tables * 1行目のエラー。 ORA-04043:オブジェクトDROP_ALL_USER_TABLESは存在しません SQL> Oracle Database 11gEnterpriseEditionリリース11.1.0.7.0から切断-64 パーティショニング、OLAP、データマイニング、および実際のアプリケーションテストオプションを使用
これを機能させる方法について何かアイデアはありますか?