我们目前的情况是这样的:
这是否是一个好的设置超出了这个问题 - 现在,把它作为一个绝对的给定 - 我们无法确定这个或明年。
现在,我们正在使用自己开发的“数据库更新管理器”来实现这一点 - 大部分时间它都有效,但真正使其完全自动化所需的工作量似乎太多了。
是的,我知道SQLCMD - 但这似乎有点“太基础” - 或者不是吗?
有没有人做同样的事情?如果是这样 - 怎么样?您使用的是某种工具吗?如果是的话 - 哪一种?
感谢您使用的任何想法,输入,想法,指向工具或方法的指针!
马克
答案 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脚本碰巧涉及添加列;如果您尝试重新运行该脚本,那么查看该列是不够智能的它是在之前的运行中添加的)。为了缓解这种情况,您可以构建一个应用程序来为您构建批处理文件,并创建一些逻辑以与目标数据库进行交互,检查已经应用或尚未应用的更改,并采取相应措施。