使用软件更新来更新SQL Server数据库架构
在安装产品更新时如何更新SQL Server数据库?是否有任何可与Windows Installer集成的工具?
我典型的架构更改是:
- 添加/删除列
- 添加/删除表。
- 添加视图。
- 添加/更改索引。
解决方案
不确定是否与Windows Installer集成,但是我们可能会研究Red Gate的SQL Packager
通过InstallShield,我们可以在安装过程中执行SQL脚本。虽然没有尝试过,只是记得我上次看它是在GUI上!
我们可能需要研究SubSonic的迁移。首先,这是版本数据库的好方法。其次,应该不难发现如何从安装程序中运行完全相同的脚本。
以我的经验,最好在软件连接到数据库时而不是在安装时进行数据库架构更新。我们要执行以下操作:
- 使用唯一标识符(例如guid)标识每个架构更改
- 包括我们可以对产品应用的所有更改的列表,例如,在构建期间将其编译为资源
- 在数据库中有一个表来保存已应用的架构更改的列表
- 当我们连接到数据库时,扫描该表以查看是否需要任何更改
这一切都非常简单,可以从我们正在运行的代码中完成,但是在安装程序中却不那么容易。
我认为软件的每个版本都有大量的数据库更新。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。为什么不将这些更新作为T-SQL指令编写,以便在首次启动新版本的软件时进行测试执行?只需从软件打开与数据库的连接,然后像发送任何SELECT或者UPDATE指令一样发送DDL指令即可。我也将执行与Hyman·保尔森(Hyman Paulsen)所建议的类似的工作:使用双重标识系统维护这些T-SQL指令的列表:一个链接到它所适用的数据库/软件版本(可以是uniqueIdentifier),另一个链接到它的编号(数字)。保持指令顺序执行(请参见我的示例:指令2不能在指令1之前执行)
例子:
//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指令时,还要跟踪它们的"对应部分",以便我们可以在任何时候(例如调试时间)将数据库结构降级到以前的版本。
Adam Cogan建议创建一个补丁表,用于记录除初始发行版之外的每个更新。不必通过SSMS或者企业管理器来更改架构,而是要确保为每个更改编写脚本...这两个应用程序都允许我们编写更改的脚本,然后再不应用它们。将脚本保存到文件中(可能将它们添加为资源),然后在每次运行应用程序时简单地检查补丁程序表。
亚当有一些更好的SQL数据库规则
http://www.ssw.com.au/ssw/Standards/Rules/RulesToBetterSQLServerDatabases.aspx