5

假设我正在对我的数据库进行某种重要的更改,这需要“自定义”工作才能从版本 A 升级到 B。例如,将用户 ID 列从 UUID 数据类型转换为 Windows 域用户名。

我怎样才能让它自动部署?也就是说,我想让开发人员右键单击项目,单击“部署”并在他们使用足够旧的数据库时执行此逻辑。

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

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

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

4

2 回答 2

1

如果您在部署期间将数据库注册为数据层应用程序,您确实可以检查已安装的版本。您可以通过在发布配置文件中包含以下内容来做到这一点:

    <RegisterDataTierApplication>True</RegisterDataTierApplication>

此选项将在部署期间在 msdb 数据库中注册架构及其版本号。请务必在版本之间更改 dacpac 版本号!我们使用 msbuild 创建 dacpacs,设置 dacpac 版本的示例代码:

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;

检查您当前正在部署的版本号有点麻烦,但也可以完成。查看 Jamie Thomson 的优秀博客了解这项技术:Editing sqlcmdvariable nodes in SSDT Publish Profile files using msbuild

于 2013-10-15T08:00:12.473 回答
0

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

于 2011-06-24T10:39:04.600 回答