5

我们假设我正在对数据库进行一些不小的更改,这需要“自定义”才能从版本A升级到B.例如,将用户标识列从UUID数据类型为Windows域用户名。使用Visual Studio数据库项目进行非平凡增量更改部署

我怎样才能使这个自动部署?也就是说,我想让开发人员右键点击该项目,点击“部署”,如果他们使用足够老的数据库,就执行这个逻辑。

我在数据库项目中看不到任何这种登录的地方 - 似乎没有任何有关此类“升级脚本”的规定。这真的不可能吗?为了澄清,逻辑不能自动生成,但我希望它可以根据需要自动执行。

当然,第一个逻辑障碍是部署实用程序不知道是否需要更新任何此类逻辑 - 我假设我也可以提供此逻辑(例如,检查版本表如果最新版本是< 5.0,则执行此升级,稍后添加新版本行)。

这可能吗?我是否可以使用复杂的自定义更改脚本进行全自动部署没有我必须将我所有的自定义更改逻辑粘贴到(即将)巨大的构建前或构建后脚本中,当然......

回答

0

老实说,最好的选择是使用数据库的概念如果我没有弄错的话,来自Ruby世界的迁移。我在我的应用程序中使用了一个名为Migrator.Net的框架,但有一些非常好的框架(具有不同级别的活动)基本上可以做同样的事情。快速谷歌搜索变成了quite a few

1

如果您在部署过程中将数据库注册为数据层应用程序,则确实可以检查安装的版本。您可以通过这样做在你的个人资料公布如下:

<RegisterDataTierApplication>True</RegisterDataTierApplication> 

此选项将注册的模式和它在部署过程中msdb数据库的版本号。一定要在发布之间更改dacpac版本号!我们使用的MSBuild用于设定dacpac版本创建dacpacs,示例代码:

DacVersion=$(ProjectReleaseNumber).$(ProjectBuildNumber).$(ProjectRevisionNumber) 

已经做到了这一点,你可以建立识别版本的部署前的脚本。

-- Get installed version, e.g. 2.3.12309.0 
DECLARE @InstalledVersion NVARCHAR(64) = (
    SELECT type_version 
    FROM msdb.dbo.sysdac_instances 
    WHERE instance_name = DB_NAME() 
); 
-- Get the major part of the version number, e.g. 2 
DECLARE @InstalledVersionMajor TINYINT = CONVERT(TINYINT, SUBSTRING(@InstalledVersion, 0, PATINDEX('%.%', @InstalledVersion))); 

IF (@InstalledVersionMajor < 5) 
BEGIN; 
    PRINT 'Do some nontrivial incremental change that only needs to be applied on version before 5'; 
END; 

检查您当前正在部署的版本号有点麻烦,但也可以完成。查看杰米汤姆森杰出的博客:Editing sqlcmdvariable nodes in SSDT Publish Profile files using msbuild

相关问题