【发布时间】:2010-12-14 00:11:08
【问题描述】:
如何在 oracle 中删除所有用户表?
我遇到了约束问题。当我禁用所有它仍然不可能。
【问题讨论】:
-
放弃约束而不是禁用它们怎么样?
标签: oracle constraints sql-drop
如何在 oracle 中删除所有用户表?
我遇到了约束问题。当我禁用所有它仍然不可能。
【问题讨论】:
标签: oracle constraints sql-drop
BEGIN
FOR cur_rec IN (SELECT object_name, object_type
FROM user_objects
WHERE object_type IN
('TABLE',
'VIEW',
'MATERIALIZED VIEW',
'PACKAGE',
'PROCEDURE',
'FUNCTION',
'SEQUENCE',
'SYNONYM',
'PACKAGE BODY'
))
LOOP
BEGIN
IF cur_rec.object_type = 'TABLE'
THEN
EXECUTE IMMEDIATE 'DROP '
|| cur_rec.object_type
|| ' "'
|| cur_rec.object_name
|| '" CASCADE CONSTRAINTS';
ELSE
EXECUTE IMMEDIATE 'DROP '
|| cur_rec.object_type
|| ' "'
|| cur_rec.object_name
|| '"';
END IF;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line ('FAILED: DROP '
|| cur_rec.object_type
|| ' "'
|| cur_rec.object_name
|| '"'
);
END;
END LOOP;
FOR cur_rec IN (SELECT *
FROM all_synonyms
WHERE table_owner IN (SELECT USER FROM dual))
LOOP
BEGIN
EXECUTE IMMEDIATE 'DROP PUBLIC SYNONYM ' || cur_rec.synonym_name;
END;
END LOOP;
END;
/
【讨论】:
如果您只是想要一个非常简单的方法来做到这一点.. 这是我过去使用过的脚本
select 'drop table '||table_name||' cascade constraints;' from user_tables;
这将为模式中的所有表打印出一系列删除命令。假脱机这个查询的结果并执行它。
来源:https://forums.oracle.com/forums/thread.jspa?threadID=614090
同样,如果您想清除的不仅仅是表格,您可以编辑以下内容以满足您的需要
select 'drop '||object_type||' '|| object_name || ';' from user_objects where object_type in ('VIEW','PACKAGE','SEQUENCE', 'PROCEDURE', 'FUNCTION', 'INDEX')
【讨论】:
select 'drop table "'||table_name||'" cascade constraints;' from user_tables;
另一个对我有用的答案是(感谢http://snipt.net/Fotinakis/drop-all-tables-and-constraints-within-an-oracle-schema/)
BEGIN
FOR c IN (SELECT table_name FROM user_tables) LOOP
EXECUTE IMMEDIATE ('DROP TABLE "' || c.table_name || '" CASCADE CONSTRAINTS');
END LOOP;
FOR s IN (SELECT sequence_name FROM user_sequences) LOOP
EXECUTE IMMEDIATE ('DROP SEQUENCE ' || s.sequence_name);
END LOOP;
END;
请注意,这在您运行后立即起作用。它确实 NOT 会生成一个您需要粘贴到某处的脚本(就像此处的其他答案一样)。它直接在数据库上运行。
【讨论】:
'DROP TABLE "' || c.table_name || '" CASCADE CONSTRAINTS' 来引用表名。如果表名是小写的,这是必要的。
DROP 语句的末尾添加PURGE。
begin
for i in (select 'drop table '||table_name||' cascade constraints' tbl from user_tables)
loop
execute immediate i.tbl;
end loop;
end;
【讨论】:
最简单的方法是使用 cascade 命令删除拥有对象的用户。
DROP USER username CASCADE
【讨论】:
USER 与 DATABASE 是分开的。 DROP USER username CASCADE 为我工作。但在 MySQL 中,我所要做的就是 DROP DATABASE 并创建一个新的
SELECT 'DROP TABLE "' || TABLE_NAME || '" CASCADE CONSTRAINTS;'
FROM user_tables;
user_tables 是一个系统表,包含用户的所有表
SELECT 子句将为每个表生成一个 DROP 语句
你可以运行脚本
【讨论】:
最简单的方法是删除表空间,然后重新构建表空间。但我宁愿不必那样做。这类似于亨利的,只是我只是在我的 gui 中的结果集上进行复制/粘贴。
SELECT
'DROP'
,object_type
,object_name
,CASE(object_type)
WHEN 'TABLE' THEN 'CASCADE CONSTRAINTS;'
ELSE ';'
END
FROM user_objects
WHERE
object_type IN ('TABLE','VIEW','PACKAGE','PROCEDURE','FUNCTION','SEQUENCE')
【讨论】:
删除oracle中的所有对象:
1) 动态
DECLARE
CURSOR IX IS
SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE ='TABLE'
AND OWNER='SCHEMA_NAME';
CURSOR IY IS
SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE
IN ('SEQUENCE',
'PROCEDURE',
'PACKAGE',
'FUNCTION',
'VIEW') AND OWNER='SCHEMA_NAME';
CURSOR IZ IS
SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE IN ('TYPE') AND OWNER='SCHEMA_NAME';
BEGIN
FOR X IN IX LOOP
EXECUTE IMMEDIATE('DROP '||X.OBJECT_TYPE||' SCHEMA_NAME.'||X.OBJECT_NAME|| ' CASCADE CONSTRAINT');
END LOOP;
FOR Y IN IY LOOP
EXECUTE IMMEDIATE('DROP '||Y.OBJECT_TYPE||' SCHEMA_NAME.'||Y.OBJECT_NAME);
END LOOP;
FOR Z IN IZ LOOP
EXECUTE IMMEDIATE('DROP '||Z.OBJECT_TYPE||' SCHEMA_NAME.'||Z.OBJECT_NAME||' FORCE ');
END LOOP;
END;
/
2)静态
SELECT 'DROP TABLE "' || TABLE_NAME || '" CASCADE CONSTRAINTS;' FROM user_tables
union ALL
select 'drop '||object_type||' '|| object_name || ';' from user_objects
where object_type in ('VIEW','PACKAGE','SEQUENCE', 'PROCEDURE', 'FUNCTION')
union ALL
SELECT 'drop '
||object_type
||' '
|| object_name
|| ' force;'
FROM user_objects
WHERE object_type IN ('TYPE');
【讨论】:
请按照以下步骤操作。
begin
for i in (select 'drop table '||table_name||' cascade constraints' tb from user_tables)
loop
execute immediate i.tb;
end loop;
commit;
end;
purge RECYCLEBIN;
【讨论】: