假设你通过Hibernate、SchemaExport等生成ddl来创建所有的数据库表等,你得到的是一个以drop语句开头的脚本。没问题,因为我想要这个。但是,运行此脚本会在Oracle数据库上生成大量ORA-00942错误。
如果这些表还不存在,那么它们就不是真正的错误,所以我希望我的create脚本在执行时是没有错误的,这样就可以很容易地确定失败的原因(如果有)。
我有什么选择?我确实希望生成drop语句,因为表可能还存在,也可能不存在,但我不希望一百万个ORA返回给我,我必须检查(以确定它们是否是真正的错误),因为它不能删除一个全新的表。
发布于 2010-10-04 03:39:05
如果你得到了一个drop语句的脚本,而Hibernate不会为你做这件事,那么就把DROP TABLE语句包装在一个If中,以便在删除它之前测试这个表是否存在:
IF EXISTS(SELECT NULL
FROM TABLE_XYZ) THEN
DROP TABLE TABLE_XYZ;
END IF;发布于 2010-10-04 04:32:15
“假设你通过Hibernate SchemaExport生成ddl来创建所有的数据库表等。你得到的是一个以drop语句开头的脚本。这不是问题,正如我所希望的。但是运行这个脚本会在Oracle数据库上运行大量的ORA-00942错误。”
理想情况下,我们应该使用源代码控制和配置管理最佳实践来适当地维护我们的模式。在这个场景中,我们预先知道我们运行脚本的模式是否包含这些表。我们不会收到错误,因为我们不会尝试删除不存在的表。
然而,并不总是可以做到这一点。另一种方法是使用两个脚本。第一个脚本只有DROP TABLE语句,前面有一个友好的
PROMPT It is safe to ignore any ORA-00942 errors in the following statements第二个脚本包含所有CREATE TABLE语句,并以
PROMPT All the statements in this script should succeed. So investigate any errors另一种选择是使用数据字典:
begin
for r in ( select table_name from user_tables )
loop
execute immediate 'drop table '||r.table_name
||' cascade constraints';
end loop;
end;小心这一个。它是核心选项,将删除模式中的每个表。
https://stackoverflow.com/questions/3851246
复制相似问题