在安装时从SQL脚本更新SQL Server数据库

时间:2009-06-04 11:20:45

标签: sql-server install

我们目前的情况是这样的:

  • 我们有一个现有的数据库需要针对我们安装的每个新版本进行更新
  • 我们必须从单独的SQL脚本(我们不能使用DB比较/差异工具)
  • 执行此操作
  • 安装应尽可能自动运行SQL脚本
  • 安装应该只运行那些尚未运行的SQL脚本
  • 安装应该转储运行哪个脚本以及哪个脚本没有
  • 的报告
  • 安装由客户的IT人员完成,而且不具备SQL知识。

这是否是一个好的设置超出了这个问题 - 现在,把它作为一个绝对的给定 - 我们无法确定这个或明年。

现在,我们正在使用自己开发的“数据库更新管理器”来实现这一点 - 大部分时间它都有效,但真正使其完全自动化所需的工作量似乎太多了。

是的,我知道SQLCMD - 但这似乎有点“太基础” - 或者不是吗?

有没有人做同样的事情?如果是这样 - 怎么样?您使用的是某种工具吗?如果是的话 - 哪一种?

感谢您使用的任何想法,输入,想法,指向工具或方法的指针!

马克

4 个答案:

答案 0 :(得分:2)

我有类似的情况。我们在版本控制中维护数据库对象脚本。对于relesase,将标记相应的版本并从版本控制中提取。自定义脚本将invidual对象脚本连接成一组Create_DB,Ceate_DB_Tables,CreateDB Procs,... 在以前的工作中,我使用手工制作的批处理文件和OSQL来运行数据库创建/更新脚本。

在我目前的位置,我们设置了一个InstallSheild,其中设置了一个用C ++编写的自定义“Install Helper”,用于使用SqlCmd调用数据库脚本。

此外,与CK一样,我们在每个数据库中都有SchemaVersion表。该表包含应用程序和数据库版本信息。模式verison只是一个整数,随着每个版本的增加而增加。

听起来很复杂,但效果很好。

答案 1 :(得分:1)

我对此有类似的设置,这是我的解决方案:

有一个dbVersion表,用于存储版本号和日期时间戳。 有一个脚本,脚本与编号系统一起存储,例如X [000] 有一个控制台/ GUI应用程序作为安装的一部分运行,并将dbVersion编号与文件的编号进行比较。 在事务中按顺序运行每个新文件。

这对我们来说已经有一段时间了。

我们的GUI应用程序的一部分允许用户选择要更新的数据库,然后脚本中的某个字符串#dbname#将替换为他们选择的数据库名称。

答案 2 :(得分:1)

您可以尝试Wizardby:它允许您逐步指定数据库更改,并以非常受控的方式应用这些更改。您必须编写MDL文件并将其与您的应用程序以及Wizardby二进制文件一起分发,而安装安装程序将检查数据库版本是否是最新的,如果不是,它将在事务中应用所有必要的更改。

在内部,它维护着一个SchemaInfo表,该表跟踪哪些迁移(版本)应用于数据库的特定实例,因此它可以可靠地仅运行所需的。

答案 3 :(得分:0)

如果您在源代码管理(例如SVN)中维护更改,则可以使用带有SQLCMD的批处理文件来仅部署来自特定SVN分支的最新更改。

例如,

rem  Code Changes
sqlcmd -U username -P password -S %1 -d DatabaseName    -i   "..\relativePath\dbo.ObjectName.sql"

假设您维护一个专门用于部署的SVN分支。您可以将代码提交到该分支,然后执行将部署所需对象的批处理文件。

缺点包括无法动态检查与表相关的更改(例如,如果您的某个SQL脚本碰巧涉及添加列;如果您尝试重新运行该脚本,那么查看该列是不够智能的它是在之前的运行中添加的)。为了缓解这种情况,您可以构建一个应用程序来为您构建批处理文件,并创建一些逻辑以与目标数据库进行交互,检查已经应用或尚未应用的更改,并采取相应措施。