2

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

由于如果表还不存在,它们并不是真正的错误,我希望我的创建脚本在执行时没有错误,因此很容易确定失败的原因(如果有的话)。

我有哪些选择?我确实希望生成删除语句,因为表可能存在也可能不存在,但我不希望有一百万个 ORA 回到我身边,我必须检查(以确定它们是否是实际错误)只是因为它不能不要丢弃一张全新的桌子。

4

2 回答 2

3

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

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

然而,并不总是可以做到这一点。一种替代方法是有两个脚本。第一个脚本只有 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;

小心这个。这是核心选项,将删除架构中的每个表。

于 2010-10-03T20:32:15.377 回答
1

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

IF EXISTS(SELECT NULL 
            FROM TABLE_XYZ) THEN
  DROP TABLE TABLE_XYZ;
END IF;
于 2010-10-03T19:39:05.350 回答