1

我们有一个由 5 名开发人员组成的小型开发团队,他们致力于大型企业级 Web 的 asp.net/c# 系统。

我们做了很多数据库更新,包括存储过程的创建和更改以及新表的创建、列的创建、记录插入、记录更新等等。

今天,所有开发人员都将所有更改脚本放在一个大型 sql 更改脚本文件中,该文件可以在我们的测试和生产环境中运行。所以这个单个文件包含存储的 proc 更改和记录插入、更新等。该文件最终可能会很长,因为我们可能每 1 到 2 个月才进行一次测试或生产发布。

我目前面临的问题是:

偶尔在这个大型“批量更改脚本”中的任何给定位置都可能出现脚本错误。例如,对于 proc,可能插入失败或更改失败。

发生这种情况时,很难判断数据库上哪些更改成功以及哪些更改失败。

有时即使一个更改失败,例如代码将继续在整个脚本中执行,有时它会停止执行并且没有进一步运行。

因此,我今天最终手动检查了过程和记录,以查看哪些实际有效,哪些实际无效,这有点费力。

我希望我可以将整个更改脚本汇总到一个大事务中,以便如果发生任何问题,我可以回滚每个更改,但是在 sql server 中使用这样的批处理脚本似乎是不可能的。

所以,然后我尝试在运行脚本之前备份数据库,这样如果发生错误,我可以简单地恢复数据库,修复问题,然后重新运行修复的脚本。然而,为了恢复数据库,我必须关闭我们的数据库镜像,所以这也不是完全理想的。

所以我的问题是,在生产数据库上运行批处理脚本最安全的方法是什么?

有什么方法可以将整个脚本包装在一个我可以回滚我没有看到的事务中?

跟踪和运行单独的脚本文件对我们来说会更好吗,这样如果 1 个文件失败,我们可以将它推到失败的目录中查看并继续运行所有其他文件?

寻求建议和专业知识。

感谢您的时间。马特

4

1 回答 1

2

批处理脚本应首先在您的 QC 数据库上运行,以便在生产之前发现任何错误。

QC 数据库应与生产相同或尽可能接近相同。

每个脚本都应该捕获错误并使用打印语句报告脚本的名称以及错误的位置,然后如果在应用于生产时发生错误,您至少有脚本的名称和错误的位置脚本内。

如果您的 QC 数据库相同或非常接近,则生产错误应该非常少见。

于 2012-09-28T15:13:19.390 回答