使用软件更新更新SQL Server数据库架构

6
当安装产品更新时,如何更新SQL服务器数据库?是否有任何工具可以与Windows Installer集成?
我的典型模式更改包括:
- 添加/删除列 - 添加/删除表格 - 添加视图 - 添加/修改索引
6个回答

4
根据我的经验,最好在软件连接数据库时进行数据库模式更新,而不是在安装时。您需要执行以下操作:
  • 使用唯一标识符(例如guid)标识每个模式更改
  • 包括您的产品可以应用的所有更改列表,例如在构建期间编译成资源
  • 在数据库中有一个表来保存已应用的模式更改列表
  • 连接到数据库时,扫描该表以查看是否需要进行任何更改
这些都很容易从运行代码内部完成,但在安装程序中却不那么容易。

如果两个用户同时运行应用程序,并且他们都尝试应用更新,那么会怎样? - Matt
有几种方法可以处理这个问题。我通过编写每个数据库更改为完全幂等来管理它--有很多代码像“如果列不存在,则添加列”。您还可以在某个地方拥有公共的“正在进行升级”位。 - Jeff Paulsen
一些数据库引擎(例如SQL Server)允许将更新作为事务的一部分运行,这将确保在多个用户并行运行更新时数据一致性(第二个用户应该最终会出现一些错误,导致回滚)。 - Lucero

2
Adam Cogan建议创建一个补丁表,用于记录初始发布之后的每个更新。而不是通过SSMS或企业管理器更改架构,请确保脚本化每个更改...这两个应用程序允许您脚本化更改,然后不应用它们。将脚本保存到文件中(可能将它们添加为资源),然后每次运行应用程序时简单地检查补丁表。
Adam在优化SQL数据库方面有一些规则。

http://www.ssw.com.au/ssw/Standards/Rules/RulesToBetterSQLServerDatabases.aspx


1

不确定与Windows安装程序的集成,但您可以考虑Red Gate的SQL Packager


Red Gate有一些非常好用的工具,可以帮助你处理SQL Server...我建议你去看看。 - mattruma

0

InstallShield 允许您在安装过程中执行 SQL 脚本。虽然我没有尝试过,但我记得上次看到它在 GUI 上!


0

你可能想要了解SubSonic的migrations。首先,它是一个很好的版本控制数据库的方式。其次,从安装程序中运行完全相同的脚本应该不会太难。


0
我认为你的每个软件版本都有一堆数据库更新。为什么不将这些更新编写成T-SQL指令,在新版本的软件首次启动时进行测试执行呢?只需从软件中打开到数据库的连接,并像发送任何SELECT或UPDATE指令一样发送DDL指令即可。我还会做类似于Jack Paulsen所建议的事情:维护一个这些T-SQL指令列表,具有双重识别系统:一个与其适用的数据库/软件版本相关联(可以是唯一标识符),另一个(数字)用于按顺序保留指令(请参见我的示例:在执行指令1之前不能执行指令2)。
示例:
//instruction 1, batch instructions for version#2.162
USE myDatabase
GO
ALTER TABLE myTable
    ADD myColumn uniqueIdentifier Null
GO
//instruction 2, batch instructions for version#2.162
USE myDatabase
ALTER TABLE myTable
    ADD CONSTRAINT myTable_myColumn FOREIGN KEY (myColumn) ...
GO

有关ALTER、DROP和CREATE指令的完整描述,请参阅您的T-SQL帮助文档。在删除字段之前,务必小心,例如删除与字段相关联的索引和约束。

当然,您可以添加一些额外的UPDATE指令来计算添加列的值等。

您甚至可以考虑更复杂的事情,检查之前的升级步骤(导致数据库版本#2.161)是否正确执行。

我的建议是:在编写这些T-SQL指令时,也要跟踪它们的“对应项”,以便您随时(例如调试时间)将数据库结构降级到先前的版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接