更新数据库结构而不丢失任何数据的最佳实践

时间:2011-04-20 10:13:28

标签: sql-server sql-server-2005 tsql

我和一个队友正在为我们公司制作一个基于网络的应用程序。 SQL Server 2005用于数据持久性。由于应用程序在不断发展,因此任何最新的稳定更新都将部署到生产环境中。我们公司没有单独的DBA,也没有SQL Comparator工具。

我的方法是,将生产应用程序中的数据库更新到最新版本,将流程分为:

  1. 根据所有内容创建一个新数据库 创建脚本

  2. 通过复制和/或转换进行数据迁移

  3. 使用新实例进行测试

  4. 替换

  5. 我的主要考虑因素是我们无法保证手动创建的脚本没有错误。但是,我被同事质疑这种方法很麻烦。

    那么,请告知什么会更好?还是最好的?

    P.S。我们没有购买需要许可证的工具的预算。

    谢谢!

    威廉

2 个答案:

答案 0 :(得分:3)

首先,数据库代码与所有其他代码一样,应该编写脚本并放入源代码管理中。通过这种方式,您可以了解需要使用的应用程序版本推送哪些代码(并且可以与其捆绑在一起)。毕竟,由于相应的应用程序代码尚未准备就绪,您可能还没有准备好进行更改。

在任何情况下都不应该使用GUI更改数据库,只能使用源代码控制中的脚本进行更改。

获得数据后,应使用alter table完成对表的所有更改。如果你不能使用alter table(比如在事后添加一个标识字段),那么你编写一个脚本来创建一个在你想要的结构中有一个不同名称的表,从旧表中复制数据,删除旧表并重命名新表。当然,如果你也在桌面上,你还必须删除并重新创建索引,约束,触发器等。幸运的是,大多数更改都可以使用alter table完成。)如果您需要创建一个不允许为null的新字段,那么您可以使用alter table使用默认值或alter table为新字段编写脚本以添加允许空值的字段,写入更新以使用现有数据填充该字段,然后编写另一个alter table以使该字段不为空。

答案 1 :(得分:0)

如果可以,我建议使用SSIS。主要优点是您可以动态地将数据库名称更改为必需。在其他情况下,您需要动态构建SQL语句。 第二个问题是错误处理。如果架构脚本(结构)中有错误,则不应继续。如果数据插入脚本中存在错误,则应逐行处理并回滚仅包含错误的事务。您可以通过在SSIS中使用ForEachLoop来实现此目的。只有一个问题就是为逐行处理准备数据。这就是为什么我建议不要使用SSMO的“标准”脚本,而是使用另一个数据容器,例如XML。