11

我们在 Visual Studio 2012 中有一个 SQL Server 数据库项目 (.sqlproj),我们将其用作数据库架构的源代码控制。它所做的一件很酷的事情是在我们发布代码时生成 SQL 来更新模式。

我们有 3 个配置文件设置 - 开发、测试、实时 - 一切正常。

最近,我们将实时数据库从“简单”恢复更改为“完全”恢复。在我们尝试运行下一个部署以进行开发和测试之前,一切都很好。我们不想在开发和测试时将恢复模式从简单更改为完全 - 我们不需要更改它。但是,当我们发布数据库项目时,它现在想要设置它。

我想根据我正在使用的发布配置设置恢复模式。我已经尝试创建一个变量并在项目 xml 中分配它:

<Recovery>$(RecoveryModel)</Recovery>

但它仍然尝试在部署脚本中将其设置为“完整”:

:setvar DefaultDataPath "C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\"
:setvar DefaultLogPath "C:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\DATA\"
:setvar RecoveryModel "Simple"

GO
:on error exit
GO
/*
Detect SQLCMD mode and disable script execution if SQLCMD mode is not supported.
To re-enable the script after enabling SQLCMD mode, execute the following:
SET NOEXEC OFF; 
*/
:setvar __IsSqlCmdEnabled "True"
GO
IF N'$(__IsSqlCmdEnabled)' NOT LIKE N'True'
    BEGIN
        PRINT N'SQLCMD mode must be enabled to successfully execute this script.';
        SET NOEXEC ON;
    END


GO
IF EXISTS (SELECT 1
           FROM   [master].[dbo].[sysdatabases]
           WHERE  [name] = N'$(DatabaseName)')
    BEGIN
        ALTER DATABASE [$(DatabaseName)]
            SET RECOVERY FULL 
            WITH ROLLBACK IMMEDIATE;
    END

我目前的工作是在 Post-Deployment 文件夹中创建一个脚本来确定我在哪个服务器上,然后如果它是开发或测试,则将恢复模型设置回简单。这似乎不是最好的解决方案。

有没有办法使用 SQLCMD 变量设置数据库属性?

4

3 回答 3

4

我知道这是一个老问题,但我想我会建议这个解决方案。为什么不能只运行一个部署后脚本来设置恢复模式。

USE [MYDATABASE];
IF @@SERVERNAME= 'DEVSQLSERVER'
BEGIN;
    ALTER DATABASE [MYDATABASE] SET RECOVERY SIMPLE ;  
END;
于 2019-10-09T20:58:58.810 回答
2

如果有人使用 VSTS:在我看来,有三种方法可以处理这种情况(即 DACPAC 中的恢复模式设置覆盖数据库中的恢复模式)。

  1. 在 msbuild 步骤之前,更改您的 VSTS 构建定义以将您的“数据库选项:恢复”替换为 *.sqlproj 中的所需状态(我不确定您是否可以根据发布环境或基于您正在构建的分支更改此设置,所以开始有点丑陋和不可行,除非您对每个环境都有单独的构建定义):

    Replace <Recovery>SIMPLE</Recovery> with <Recovery>FULL</Recovery> or vice versa in the *.sqlproj file

  2. 修改您的 VSTS 版本以使用“SQL Server 数据库部署”任务(即不要使用“运行 DACPAC 文件”)并在“附加参数”中指定:

    /p:ScriptDatabaseOptions=false

  3. 修改您的 VSTS 版本以使用“SQL Server 数据库部署”并指定“发布配置文件”。我认为配置文件中的“部署数据库属性”选项等同于“脚本数据库选项”,但我没有测试它,因为 2 对我来说是一个合理的解决方案。可以在构建时间之前预先设置不同的配置文件,或者尝试为每个发布环境更改具有变量的主配置文件。我真的不想让我的生活变得复杂……

所以最后我选择了上面的选项 (2) 并在有和没有/p:ScriptDatabaseOptions=false设置的情况下进行了测试。它按预期工作。选择选项 (2) 意味着您需要提前设置环境数据库。我们在非 Prod 环境中使用 SIMPLE 恢复模式,在 Prod 环境中使用 FULL。要验证在 MSSQL Mgt Studio 中打开数据库选项或查看 SQL Server 日志以查看是否出现类似消息:

Setting database option RECOVERY to SIMPLE for datatbase 'WhatACoolNameForADatabase'.

如果我需要能够在发布过程中建立新数据库,那么我可能不得不冒险进入选项 3 的领域。如果那是你所在的地方,那么祝你好运,让我们知道你必须做什么做使它工作。

于 2018-10-02T18:34:38.023 回答
1

您可以转到 Visual Studio 中的项目设置。单击数据库设置 > 操作并将恢复模式更改为简单。

于 2018-06-04T22:23:54.450 回答