作为我们构建过程和不断发展的数据库的一部分,我正在尝试创建一个脚本,它将删除用户的所有表和序列。我不想重新创建用户,因为这将需要比允许更多的权限。
我的脚本创建一个过程来删除表/序列,执行该过程,然后删除该过程。我正在从 sqlplus 执行文件:
删除.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 生产 版权所有 (c) 1982、2008,甲骨文。版权所有。 连接到: Oracle Database 11g 企业版 11.1.0.7.0 - 64 位生产 具有分区、OLAP、数据挖掘和实际应用程序测试选项 程序已创建。 PL/SQL 过程成功完成。 程序已创建。 程序下降。 删除过程 drop_all_user_tables * 第 1 行的错误: ORA-04043: 对象 DROP_ALL_USER_TABLES 不存在 SQL> 与 Oracle Database 11g 企业版 11.1.0.7.0 - 64 版断开连接 具有分区、OLAP、数据挖掘和实际应用程序测试选项
关于如何使它工作的任何想法?