首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >禁止ddl创建脚本中的ORA-00942错误

禁止ddl创建脚本中的ORA-00942错误
EN

Stack Overflow用户
提问于 2010-10-04 03:21:48
回答 2查看 2.6K关注 0票数 2

假设你通过Hibernate、SchemaExport等生成ddl来创建所有的数据库表等,你得到的是一个以drop语句开头的脚本。没问题,因为我想要这个。但是,运行此脚本会在Oracle数据库上生成大量ORA-00942错误。

如果这些表还不存在,那么它们就不是真正的错误,所以我希望我的create脚本在执行时是没有错误的,这样就可以很容易地确定失败的原因(如果有)。

我有什么选择?我确实希望生成drop语句,因为表可能还存在,也可能不存在,但我不希望一百万个ORA返回给我,我必须检查(以确定它们是否是真正的错误),因为它不能删除一个全新的表。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-04 03:39:05

如果你得到了一个drop语句的脚本,而Hibernate不会为你做这件事,那么就把DROP TABLE语句包装在一个If中,以便在删除它之前测试这个表是否存在:

代码语言:javascript
复制
IF EXISTS(SELECT NULL 
            FROM TABLE_XYZ) THEN
  DROP TABLE TABLE_XYZ;
END IF;
票数 1
EN

Stack Overflow用户

发布于 2010-10-04 04:32:15

“假设你通过Hibernate SchemaExport生成ddl来创建所有的数据库表等。你得到的是一个以drop语句开头的脚本。这不是问题,正如我所希望的。但是运行这个脚本会在Oracle数据库上运行大量的ORA-00942错误。”

理想情况下,我们应该使用源代码控制和配置管理最佳实践来适当地维护我们的模式。在这个场景中,我们预先知道我们运行脚本的模式是否包含这些表。我们不会收到错误,因为我们不会尝试删除不存在的表。

然而,并不总是可以做到这一点。另一种方法是使用两个脚本。第一个脚本只有DROP TABLE语句,前面有一个友好的

代码语言:javascript
复制
PROMPT  It is safe to ignore any ORA-00942 errors in the following statements

第二个脚本包含所有CREATE TABLE语句,并以

代码语言:javascript
复制
PROMPT  All the statements in this script should succeed.  So investigate any errors

另一种选择是使用数据字典:

代码语言:javascript
复制
begin
    for r in ( select table_name from user_tables )
    loop
        execute immediate 'drop table '||r.table_name
                    ||' cascade constraints';
    end loop;
end;

小心这一个。它是核心选项,将删除模式中的每个表。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3851246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档