我们在Visual Studio 2012中有一个SQL Server数据库项目(.sqlproj),我们将其用作数据库模式的源代码控制。它所做的一件很酷的事情就是在我们发布代码时生成SQL来更新模式。
我们有三个配置文件设置 - 开发,测试,直播 - 这些都运行正常。
最近我们改变了我们的实时数据库来自" Simple"恢复到"完全"复苏。在我们尝试将下一个部署运行到开发和测试之前,一切都很棒。我们不想在开发和测试时将恢复模式从简单更改为完全 - 我们无需更改它。但是,当我们发布数据库项目时,它现在想要设置它。
我想根据我使用的发布配置设置恢复模型。我已经尝试创建一个变量并在项目xml中分配它:
<Recovery>$(RecoveryModel)</Recovery>
但它仍然试图将其设置为&#34; Full&#34;在部署脚本中:
: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变量设置数据库属性?
答案 0 :(得分:1)
如果使用的是VSTS:如我所见,有三种方法可以处理这种情况(即DACPAC中的恢复模式设置会覆盖数据库中的恢复模式)。
在msbuild步骤之前,更改您的VSTS Build定义,以* .sqlproj中的所需状态替换“ Database Option:Recovery”(我不确定您是否可以在每个Release环境或基于您要建立的分支,因此除非您在每个环境中都具有单独的构建定义,否则一开始是很丑陋且不可行的:
Replace <Recovery>SIMPLE</Recovery> with <Recovery>FULL</Recovery> or vice versa in the *.sqlproj file
修改您的VSTS版本以使用“ SQL Server数据库部署”任务(即,不要使用“运行DACPAC文件”)并在“其他参数”中指定:
/p:ScriptDatabaseOptions=false
修改您的VSTS版本以使用“ SQL Server数据库部署”并指定“发布配置文件”。我认为配置文件中的“部署数据库属性”选项等效于“脚本数据库选项”,但我尚未对其进行测试,因为2对我来说是一个合理的解决方案。可以在构建时间之前预先设置不同的配置文件,或者尝试针对每个Release环境使用变量来更改主配置文件。我真的不想让我的生活变得如此复杂...
因此,最后我选择了上面的选项(2),并测试了是否设置 / p:ScriptDatabaseOptions = false 。它按预期工作。选择选项(2)意味着您需要提前设置环境数据库。我们在非Prod环境中使用SIMPLE的恢复模式,在Prod环境中使用FULL的恢复模式。要进行验证,请在MSSQL Mgt Studio中打开数据库选项,或者查看SQL Server日志以查看是否出现如下消息:
Setting database option RECOVERY to SIMPLE for datatbase 'WhatACoolNameForADatabase'.
如果在发布过程中需要能够支持新数据库,那么我可能不得不冒险进入选项3的领域。如果那是您的本意,那么祝您好运,并告诉我们您必须要做才能使其正常工作。
答案 1 :(得分:1)
我知道这是一个老问题,但我想我会建议这种解决方案。为什么不能只运行Post Deployment脚本来设置恢复模式。
USE [MYDATABASE];
IF @@SERVERNAME= 'DEVSQLSERVER'
BEGIN;
ALTER DATABASE [MYDATABASE] SET RECOVERY SIMPLE ;
END;
答案 2 :(得分:0)
您可以转到visual studio中的项目设置。单击数据库设置&gt;操作并将恢复模型更改为SIMPLE。