【问题标题】:Run different liquibase scripts based on SQL Server version根据 SQL Server 版本运行不同的 liquibase 脚本
【发布时间】:2017-08-27 16:39:51
【问题描述】:

我正在尝试使用 liquibase 向角色添加成员,但 SQL 与 SQL Server 2008 到 2012 不同。

SQL Server 2008:

exec sp_addrolemember db_datareader, MYUSER 

SQL Server 2012:

ALTER ROLE db_datawriter ADD MEMBER MYUSER

当通过 liquibase 针对 SQL Server 2012 运行时,以下 SQL 可以正常工作,但是当针对 SQL Server 2008 运行时,它会失败并显示:

关键字“ADD”附近的语法不正确

代码:

DECLARE @ver nvarchar(50),
        @intVer int,
        @ver2008 int = 10

SET @ver = CAST(serverproperty('ProductVersion') AS nvarchar)
SET @intVer = CAST(SUBSTRING(@ver, 1, CHARINDEX('.', @ver) - 1) AS int)

IF (@intVer = @ver2008)
    exec sp_addrolemember db_datawriter, MYUSER
ELSE
    ALTER ROLE db_datawriter ADD MEMBER MYUSER;

我尝试分离版本,将 SQL Server 2008 放在一个文件中,将 2012 放在另一个文件中,并在变更日志的顶部(在变更集之外)使用“前提条件”。但是只有 2 个 OnFail 选项,即停止整个更新的 HALT 或仅继续脚本的 WARN,这两个选项都不能满足我的需要。

我需要让脚本确定它正在使用哪个版本的 SQL Server,并且只运行那个特定的 liquibase 脚本,无论它是变更集还是变更日志。

【问题讨论】:

    标签: sql-server liquibase


    【解决方案1】:

    如果语法无法识别,整个批次的编译将失败。您可以通过将语句包装在 EXECUTE 中或使用 sp_executesql 来解决此问题。

    IF (@intVer = @ver2008)
        EXECUTE(N'exec sp_addrolemember db_datawriter, MYUSER;')
    ELSE
        EXECUTE(N'ALTER ROLE db_datawriter ADD MEMBER MYUSER;');
    

    【讨论】:

    • 这行得通,但我希望我不必有相同的逻辑来获取每个变更集中的版本,其中我将成员添加到角色。
    猜你喜欢
    • 1970-01-01
    • 2014-02-12
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多