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

时间:2011-07-19 16:13:54

标签: oracle plsql oracle10g

我们的开发团队在其本地计算机上进行所有开发,包括数据库。当我们对模式进行更改时,我们将SQL保存到一个文件中,然后将其发送到版本控制系统(如果有更好的实践,我也可以听到这个问题)。

在处理SQL Server时,我们将围绕“if exist”语句包装我们的更新,以使它们可以重新运行。我没有在Oracle 10g项目上工作,我找不到任何执行相同操作的oracle函数。我能够在dbaforums.org上找到this帖子,但这里的答案看起来有些笨拙。

2 个答案:

答案 0 :(得分:2)

我假设这是为了某种自动化构建过程并在某些事情失败时从头开始重做构建。

正如Shannon指出的那样,PL / SQL对象(例如Procedures,functions和Packages)具有“创建或替换”选项,因此第二次重新编译/重新运行就可以了。补助金也应该没问题。

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

1)不要向脚本添加任何drop命令,并要求开发团队为各个模块提供revert-script。

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

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

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

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

答案 1 :(得分:1)

除非另行配置,否则SQL * Plus脚本将继续发生错误。

所以你可以使用你的所有脚本:

DROP TABLE TABLE_1;
CREATE TABLE TABLE_1 (...

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

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

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