在DDL禁止ORA-00942错误创建脚本
-
27-09-2019 - |
题
说你生成DDL创建所有的数据库表等通过休眠的SchemaExport等你得到的是与在开始下降语句开头的脚本。不是一个问题,因为我想这一点。但是,运行此脚本生成的Oracle数据库运行ORA-00942错误的crapload。
由于他们如果表只是还不存在不是真正的错误,我想我创建的脚本没有错误时,它执行,因此很容易确定什么(如果有的话)失败。
什么是我的选择?我确实想产生下降语句,因为表可能会或可能还不存在,但我不希望在我,我要检查一百万ORA-S回来(以确定他们是否是真正的错误消息),只是因为它couldn”吨下降的表中的全新的。
解决方案
如果你得到下降语句的脚本,Hibernate不会为你做它,然后删除它之前包裹在IF的DROP TABLE语句来测试,如果表中存在:
IF EXISTS(SELECT NULL
FROM TABLE_XYZ) THEN
DROP TABLE TABLE_XYZ;
END IF;
其他提示
“说你生成DDL创建所有 你的数据库表等通过休眠 SchemaExport工具等你得到的是一个 脚本与开始下降 语句开头。不是 问题,我想这一点。但运行 这个脚本产生的crapload 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;
小心使用这一个。这是核选择,并会在你的schema的每个表。
不隶属于 StackOverflow