检查sql脚本是否有效

时间:2009-12-07 15:43:45

标签: sql parsing plsql antlr

作为发布的一部分,我们针对数据库运行大量PL / SQL脚本。最近有人在一个被称为另一个脚本的脚本中将;放在一行的末尾,这意味着脚本没有运行。因为这不会导致错误,它只是没有运行,需要花费很长时间来追踪发生的事情。

我希望在脚本运行之前检查脚本,以查找最后缺少;或后面的/的行。这变得更加复杂,因为如果它是语句或代码块,脚本中的“行”实际上可能跨越多行。

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

我找到了ANTLR,并想知道这是否可能是一种方法,因为似乎有existing PL/SQL grammars但看起来这只是一个简单的检查的步骤学习曲线

有没有人知道一种简单的方法或任何其他工具,eclipse插件等我可以用来检查脚本中缺少最后;或者/上的行。之后?

更新 我们已经完成了大部分工作Tom H suggested。脚本运行到我们的测试服务器中,我们有一个版本表,最后会更新。问题是容器脚本中缺少的分号意味着一个脚本没有运行但其余的包括更新版本号的脚本运行没有错误。因此,这个问题只能在测试中得到很好的应用。这需要在运行脚本之前恢复数据库,并添加缺少的分号,因此基本上导致半天的测试时间丢失。如果有一种简单的方法来检查之前将脚本运行到测试服务器中,它可以节省相当多的时间。

3 个答案:

答案 0 :(得分:3)

我同意MattH你可能会以错误的方式解决这个问题。我只是在所有脚本的末尾添加一个insert语句,它将“version”行插入数据库的表中。在部署脚本结束时,检查版本表中是否包含所有正确的行是一项简单的任务。

此外,您应该让所有发布脚本都针对您的QA服务器完全按照生产运行。这就是所有测试的地方。除了发布步骤之外,您永远不会对服务器执行任何操作 - 您只运行发布脚本,如果这些发行脚本发生了更改,那么您可以使用它们刷新QA服务器并重做测试。

当您开始生产时,您的发布过程已经过全面测试。作为故障安全措施,您还可以使用Red Gate的SQL Compare和SQL Data Compare等工具来检查生产是否与QA服务器匹配。数据比较仅针对某些表(查找表等)。如果您对主表(1M行等)进行了数据更改,那么您可以修改自定义脚本以检查它们是否正确。

答案 1 :(得分:1)

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

  • 创建或替换dbobject ...
  • SQL DML脚本
  • 匿名PL / SQL阻止

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

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

答案 2 :(得分:0)

只是一个想法,但你是否采取了错误的方式?

我认为,在文件级别,文件中缺少半冒号不是问题吗?但它只是通过批处理运行时成为一个问题?如果是这种情况,也许您可​​以更改批处理以应对此问题。

如果是文件,那么测试应该已经把它拿起来了。您不想解析输入文件以确保它们编译等。