创建可重新运行的 Oracle DDL SQL 脚本

Posted

技术标签:

【中文标题】创建可重新运行的 Oracle DDL SQL 脚本【英文标题】:Creating re-runnable Oracle DDL SQL Scripts 【发布时间】:2011-07-19 16:13:54 【问题描述】:

我们的开发团队在本地机器上完成所有开发工作,包括数据库。当我们对模式进行更改时,我们将 SQL 保存到一个文件中,然后将其发送到版本控制系统(如果有更好的做法,我也愿意听听)。

在 SQL Server 上工作时,我们会将更新包装在“如果存在”语句周围,以使它们可重新运行。我没有从事 Oracle 10g 项目,我找不到任何做同样事情的 oracle 函数。我能够在 dbaforums.org 上找到this 线程,但这里的答案似乎有点笨拙。

【问题讨论】:

对表的定义没有帮助,但是可以使用create or replace....创建过程、函数、包和视图等许多对象 【参考方案1】:

我假设这是为了某种自动化构建过程并在出现故障时从头开始重新构建。

正如 Shannon 所指出的,诸如过程、函数和包之类的 PL/SQL 对象具有“创建或替换”选项,因此第二次重新编译/重新运行就可以了。赠款也应该没问题。

对于表创建和 DDL,您可以采用以下方法之一。

1) 不要在脚本中添加任何删除命令,并要求您的开发团队为各个模块提供还原脚本。

因此,对于他们添加到构建中的每个创建表,他们将有一个等效的“DROP TABLE..”添加到脚本中,例如“build_rollback.sql”。如果您的构建失败,您可以在从头开始运行构建之前运行此脚本。

2)第二种(也是我见过的最常用的方法)是在创建表语句之前包含 DROP 表,然后忽略构建日志中的“表或视图不存在”错误。有点像..

DROP TABLE EMP;
CREATE TABLE EMP (
   .......
   .......
);

您发布的主题存在重大缺陷。最重要的一点是您始终以增量方式创建表。例如,您的数据库已经有 100 个表,并且您将在此版本中添加 5 个表。该脚本为所有 100 个表假脱机 DROP Create,然后执行它,这没有多大意义(除非您是第一次构建数据库)。

【讨论】:

这个应用程序仍在开发中,因此我们的脚本混合了创建表和更改表语句,用于添加列、约束,甚至重新定义列详细信息。 即便如此,我认为解决方案还是一样的。对于 Alter Table 语句(添加列、索引等),您无需添加任何“DROP”语句。当您重新运行构建时,alter table 将失败(如果它在第一次运行时成功..)并且您在查看构建日志时必须忽略这些错误。【参考方案2】:

除非另有配置,否则 SQL*Plus 脚本将继续过去的错误。

因此您可以使用所有脚本:

DROP TABLE TABLE_1;
CREATE TABLE TABLE_1 (...

我知道这是 PowerDesigner 中的一个选项。

另一种选择是编写一个 PL/SQL 脚本来清理架构,迭代架构中所有现有的表、视图、包、过程、函数、序列和同义词,发出适当的 DDL 语句来删除它们。

我会考虑分解 SQL 来创建数据库;一个包含模式所有内容的巨大脚本在共享环境中维护听起来很凶残。在架构/对象类型/名称级别划分可能是谨慎的,将完全依赖的对象类型(如表和索引)放在一起。

【讨论】:

这个应用程序仍在开发中,因此我们的脚本混合了创建表和更改表语句,用于添加列、约束,甚至重新定义列详细信息。 我认为你应该改变这一点。保持全新安装 DDL 与增量更新 DDL 不同。

以上是关于创建可重新运行的 Oracle DDL SQL 脚本的主要内容,如果未能解决你的问题,请参考以下文章

oracle ddl语句用啥编辑

Oracle SQL - 我可以在 DDL 的 CHECK 约束中使用子查询吗?

SQL语言的四种类型和ORACLE运算符

SQL脚本执行控制

Oracle第三章——SQL语言

oracle基本sql语句和函数详解