代码之家  ›  专栏  ›  技术社区  ›  Chris R

检查sql脚本是否有效

  •  1
  • Chris R  · 技术社区  · 16 年前

    作为版本的一部分,我们对数据库运行了大量PL/SQL脚本。最近有人离开了 ; 在一个脚本中的一行末尾被称为另一个脚本,这意味着该脚本没有运行。因为这并没有导致错误,只是没有运行,所以花了很长时间才找到发生的事情。

    我想在运行脚本之前检查脚本中是否有缺少 ; 最后还是 / 在电话那头。如果脚本中的“行”是语句或代码块,那么它实际上可以跨越多行,这就变得更加复杂。

    对我来说,这似乎是这样的,我将不得不解析脚本,然后检查它们是否符合上述要求。

    我找到了 ANTLR existing PL/SQL grammars 但看起来这将是一个步骤学习曲线,只是一个简单的检查。

    有没有人知道一种简单的方法,或者我可以使用任何其他工具、eclipse插件等来检查脚本中缺少 ; 最后还是 / 在电话里吗?

    使现代化 我们已经做了大部分工作 Tom H suggested .脚本运行到我们的测试服务器中,我们有一个版本表,在最后更新。问题是,容器脚本中缺少分号意味着一个脚本没有运行,但包括更新版本号的脚本在内的其余脚本运行时没有出现错误。因此,这个问题在测试过程中才被发现。这需要在运行添加了缺失分号的脚本之前恢复数据库,因此基本上会损失半天的测试时间。如果有一个简单的方法来检查这个 之前 在测试服务器上运行脚本可以节省很多时间。

    3 回复  |  直到 9 年前
        1
  •  3
  •   Tom H zenazn    16 年前

    我同意马特的观点,你可能走错了方向。我只想在所有脚本的末尾添加一个insert语句,在数据库的表中插入一个“version”行。在部署脚本结束时,检查版本表中是否包含所有正确的行是一项简单的任务。

    此外,您应该运行所有的发布脚本 就像他们在生产中一样 针对你的QA服务器。所有测试都是在这里进行的。除了发布步骤中的内容之外,您永远不会对服务器做任何事情——您只运行发布脚本,如果这些发布脚本发生了更改,那么您将使用它们刷新QA服务器,并重新进行测试。

        2
  •  1
  •   dpbradley    16 年前

    即使每个版本的脚本都不同(不是创建或替换数据库对象的已定义源代码管理结构的一部分),我也会采用一种做法,将脚本分解为每个文件最基本的工作单元,并通过Ant和标准sql任务部署它们。您可能有以下类型的脚本:

    • 创建或替换dbobject。。。
    • SQL DML脚本
    • 匿名PL/SQL块

    如果标准化一致的语句分隔符(我建议使用“/”,因为它适用于上述所有情况),并将部署设置为出错时失败,那么Ant将部署所有文件,或者指出为什么不能部署。

    我认为,如果没有关于分隔符选择或每个文件的语句的标准,那么以其他方式解析一个或多个SQL和/或PLSQL语句的文件并查找缺少的分隔符将非常困难。

        3
  •  0
  •   MattH    16 年前

    只是一个想法,但你是不是走错了路?

    我想,在文件级别,文件中没有分号不是问题吗?但它只在通过批处理运行时才成为问题?如果是这样的话,也许你可以改变批处理来应对这个问题。

    如果是文件,那么测试就应该把它捡起来。你不想解析你的输入文件以确保它们可以编译等等。