我们有一个由5名开发人员组成的小型开发团队,他们致力于基于Web的大型企业级asp.net/c#系统。
我们做了很多数据库更新,包括存储过程创建和更改,以及新表创建,列创建,记录插入,记录更新等等。
今天,所有开发人员都将所有更改脚本放在一个大的sql更改脚本文件中,该文件在我们的测试和生产环境中运行。因此,这个单个文件包含存储的proc更改和记录插入,更新等等。文件最终可能会非常冗长,因为我们可能每1至2个月只进行一次测试或生产发布。
我目前面临的问题是:
偶尔在这个大型“批量更改脚本”中的任何给定位置都会出现脚本错误。例如,插入失败或者可能是对于proc的更改失败。
发生这种情况时,很难说出哪些更改成功以及数据库失败了什么。
有时即使一个alter失败,实例代码也会继续在整个脚本中执行,有时它会停止执行而没有进一步运行。
所以我今天最终手动检查过程和记录,看看实际上有什么用处,实际上没做什么,这有点辛苦。
我希望我可以将整个更改脚本汇总到一个大事务中,这样如果发生任何问题,我可以回滚每一个更改,但是在sql server中这样的批处理脚本似乎不可能。 / p>
所以,然后我尝试在运行脚本之前备份数据库,这样如果发生错误,我可以简单地恢复数据库,修复问题,然后重新运行修复的脚本。但是,为了恢复数据库,我必须关闭我们的数据库镜像,所以这也不是完全理想的。
所以我的问题是,在生产数据库上运行批处理脚本最安全的方法是什么?
是否有某种方法可以将整个脚本包装在我可以回滚的事务中,而我没有看到?
我们可能更好地跟踪和运行单独的脚本文件,这样如果1个文件失败,我们可以将它推迟到失败的目录中查看并继续运行所有其他文件吗?
寻求建议和专业知识。
谢谢你的时间。 马特答案 0 :(得分:2)
首先应在QC数据库上运行批处理脚本,以便在生产之前获取任何错误。
质量控制数据库应与生产相同或尽可能接近相同。
每个脚本都应该捕获错误并使用print语句报告脚本的名称以及错误的位置,然后如果在应用于生产时发生错误,则至少具有脚本的名称和位置脚本中的错误。
如果您的QC数据库相同或非常接近,则制作错误应该非常少见。