【问题标题】:SQL Project Dynamically set Recovery ModelSQL 项目动态设置恢复模型
【发布时间】:2014-06-13 01:24:37
【问题描述】:

我们在 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 变量设置数据库属性?

【问题讨论】:

  • 我知道这篇文章已经有好几年了,但我们遇到了同样的问题。我一直在采取与 Greg 相同的方法。对于我们的非生产环境,将恢复模式设置回简单。 Greg 或任何人——请告诉我你找到了替代解决方案! :)
  • @Shoeless 我还没有解决办法

标签: visual-studio-2012 sqlproj


【解决方案1】:

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

USE [MYDATABASE];
IF @@SERVERNAME= 'DEVSQLSERVER'
BEGIN;
    ALTER DATABASE [MYDATABASE] SET RECOVERY SIMPLE ;  
END;

【讨论】:

  • 因为他们已经是但想要一个更好的解决方案:我目前的工作是在 Post-Deployment 文件夹中创建一个脚本来确定我在哪个服务器上,然后设置恢复如果它是开发或测试,模型回到简单。这似乎不是最好的解决方案。
【解决方案2】:

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

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

    Replace &lt;Recovery&gt;SIMPLE&lt;/Recovery&gt; with &lt;Recovery&gt;FULL&lt;/Recovery&gt; 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 的领域。如果这是你所处的位置,那么祝你好运,让我们知道什么你必须做才能让它工作。

【讨论】:

    【解决方案3】:

    您可以在 Visual Studio 中进入项目设置。点击 Database Settings > Operational 并将恢复模式更改为 SIMPLE。

    【讨论】:

    • 那会改变它,但我想根据变量动态改变它。我们的开发环境很简单,但生产环境已满,我们希望一个项目同时部署两者
    猜你喜欢
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 2014-04-07
    • 2023-04-10
    相关资源
    最近更新 更多