2009-12-07 150 views
1

作为发行版的一部分,我们针对数据库运行一些PL/SQL脚本。最近有人将;从另一个脚本的另一个脚本的行尾离开,这意味着该脚本没有运行。因为这不会导致错误,它只是没有运行,追查发生的事情花了相当长的一段时间。检查sql脚本是否有效

我想在脚本运行之前检查脚本中是否存在行尾的;或行后面的/。这变得更加复杂,因为脚本中的“行”实际上可以跨越多行,如果它是语句或代码块的话。

对我来说,这似乎是要做到这一点,我将不得不解析脚本,然后检查他们满足上述。

我发现ANTLR并想知道这是否可以做到这一点,因为似乎有existing PL/SQL grammars但看起来这将是一个简单的检查步骤学习曲线。

有谁知道一个简单的方法或任何其他工具,Eclipse插件等等,我可以用它来检查脚本中的行被丢失或者在最后一个;或之后就行了/

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

+0

在DB版本系统我用,在更新脚本的开始我设置了版本号和它分配一个“跑”标志,然后重置标志为“已完成”的脚本*年底*。 – 2009-12-08 14:50:15

回答

1

即使脚本是每一个版本不同(而不是创建或替换数据库中的对象定义源控制结构的一部分),我会采取打破脚本分解成工作的每个文件的最基本单位的做法,使用标准的sql任务通过Ant部署它们。你可能有这些类型的脚本:

  • 创建或替换DBOBJECT ...
  • SQL DML脚本
  • 匿名PL/SQL块

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

我想,如果有对分隔符的选择还是每个文件报表没有标准,这将是非常困难的,否则解析一个或多个SQL和/或PLSQL语句的文件和寻找失踪的分隔符。

0

只是一个想法,但你会这样做的错误吗?

我认为,在文件级,缺乏文件中的分号的是不是有问题?但通过批处理运行只会成为问题?如果是这种情况,也许你可以改变你的批处理来应付这种情况。

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

3

我MattH,你可能要对这个错误的方式达成一致意见。我只是将一个插入语句添加到所有将“版本”行插入到数据库表中的脚本的末尾。在部署脚本结束时,检查版本表是否包含所有正确的行是一件容易的事情。

此外,您应该对您的QA服务器准确运行所有发布脚本,正如它们将在生产中一样。这就是所有测试发生的地方。你永远不会做任何服务器除了什么是你松开的步骤 - 你只运行发布脚本和如果这些发行脚本是不断改变,那么你刷新与他们的QA服务器和重做测试。

当你去到你的生产过程中释放然后被全面测试。作为故障安全措施,您还可以使用Red Gate的SQL Compare和SQL Data Compare等工具来检查生产是否与QA服务器匹配。数据比较只会针对某些表(查找表等)。如果您对主表(1M行等)有数据更改,则可以通过自定义脚本来检查它们是否正确。

+0

我们已经完成了大部分工作,问题在于它只是通过测试才拿起来的。如果在他们进入测试服务器之前有一种方法可以快速检查这些事件的脚本,那么可以节省很多时间。 – 2009-12-08 09:51:05

+0

正如我接着说,跟踪所有已成功对数据库运行脚本的日志表或表的版本可能是你最安全的赌注。 – 2009-12-08 13:16:00