当我在我的SSDT DB项目中包含一个登录名和用户,并尝试使用“数据库从注册版本转移时的块发布”选项部署DACPAC时,它总是检测数据库用户的漂移,即使没有任何改变。
例如,我将项目发布到一个以前不存在数据库的新服务器上,并且一切正常。登录名和用户被正确创建,然后我立即将相同的项目发布到同一台服务器上,并且由于db用户已经漂移,部署被阻塞。但是,我没有在SQL实例上更改任何内容,甚至没有更新项目。
如果我从SSDT项目中删除了登录名和用户,那么一切都按预期工作,也就是说,我不会从漂移检测中获得假阳性,并且我可以在没有错误的情况下更新和部署其他类型的对象。
这是登录和用户的脚本:
CREATE LOGIN AppAcct WITH PASSWORD = 'Password1';
GO
CREATE USER AppAcct FOR LOGIN AppAcct
WITH DEFAULT_SCHEMA = dbo;
GO
GRANT CONNECT TO AppAcct;
GO这是我正在使用的发布概要文件:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<IncludeCompositeObjects>True</IncludeCompositeObjects>
<TargetDatabaseName>DacpacDrift</TargetDatabaseName>
<DeployScriptFileName>DacpacDrift.sql</DeployScriptFileName>
<TargetConnectionString>Data Source=.\dev14;Integrated Security=True;Pooling=False</TargetConnectionString>
<BlockWhenDriftDetected>True</BlockWhenDriftDetected>
<RegisterDataTierApplication>True</RegisterDataTierApplication>
<ProfileVersionNumber>1</ProfileVersionNumber>
<ScriptDatabaseOptions>True</ScriptDatabaseOptions>
<BlockOnPossibleDataLoss>True</BlockOnPossibleDataLoss>
<DropObjectsNotInSource>True</DropObjectsNotInSource>
</PropertyGroup>
</Project>这就是漂流报告的样子:
<?xml version="1.0" encoding="utf-8"?>
<DriftReport xmlns="http://schemas.microsoft.com/sqlserver/dac/DriftReport/2012/02">
<Additions />
<Removals />
<Modifications>
<Object Name="[AppAcct]" Parent="" Type="SqlUser" />
</Modifications>
</DriftReport>在本例中,我使用的是针对Server 2014的Visual 2013,但我还有其他版本的Server也有相同的问题。我直接从Visual发布,如果这有什么区别的话。
这是我建立的一个人为的例子,试图缩小问题的根源,使其易于复制。实际上,SQL登录将有一个固定的SID和散列密码,并且还会有其他用户映射到域帐户。最终,对于不同的目标实例,我想要不同的安全性,但现在我满足于让普通登录和用户作为项目的一部分工作。
真正的目标是让漂移检测正常工作,因为我所处的环境中数据库漂移是可能的。我可以管理项目之外的权限(或部署前或部署后脚本),但DACPAC部署也会将其视为漂移。
我对Data应用程序比较陌生,所以我很可能从根本上误解了应该如何管理DACPAC部署,但在我尝试将用户和登录添加到SSDT项目之前,这一切对我来说都很好。
我遗漏了什么?
我试过@dbajonm的建议,但这只让我走到了我想去的地方的一半。
我正确地从项目中删除了用户并登录,并将它们手动添加到测试实例的目标数据库中。最终,我想在部署后脚本中管理它们,但现在我只是试图解决漂移问题。
我更新了我的发布配置文件,以便它忽略登录和用户等等。经过一些尝试和错误之后,我在我的配置文件中得到了以下新设置:
<ExcludeUsers>True</ExcludeUsers>
<ExcludeLogins>True</ExcludeLogins>
<IgnorePermissions>True</IgnorePermissions>
<IgnoreRoleMembership>True</IgnoreRoleMembership>现在,当我尝试发布时,它生成的脚本不会删除用户或他们的权限或角色成员资格。这是最好的,因为如果我实际部署DACPAC,我不会破坏任何权限。问题是发布仍然被阻止,因为在部署脚本中被忽略的用户仍然被检测为数据库漂移。
似乎无论我做什么,部署都会因为数据库漂移而被阻止。这可能是对的吗?对于包含数据库用户(即几乎所有用户)的数据库,是否真的没有可靠的检测漂移的方法?
我知道我可以忽略漂移和发表,但这使得漂移检测或多或少对我的目的是无用的。我正试图带领我们的团队避免直接针对数据库进行开发,而是将数据库代码作为一个值得版本控制的一流公民来对待,等等。在过渡期间,我们将让人们在SSDT项目之外进行db更改,这就是为什么漂移检测对我来说如此重要的原因。如果我总是从漂移检测中得到假阳性,那么它就会变得更麻烦,而不是它的价值。
发布于 2016-09-19 19:44:04
要处理DACPAC外部的用户和登录,请设置以下选项。这可以在发布配置文件或项目设置中(因此这两种方案都是这样)。
来自VS:项目属性>调试>高级。>忽略>排除的对象类型。然后检查“排除登录”、“排除用户”、数据库角色等。在发布/部署进行比较时,您想要排除的任何内容都可以。
在发布配置文件中,使用以下命令
<ExcludeUsers>True</ExcludeUsers>
<ExcludeLogins>True</ExcludeLogins>此排除选项隐藏在设置中。然而,这个选项甚至直到2014年才可用,并导致大量咬牙切齿的on数据库!至少我们现在有了!
在Visual中和在您的构建服务器上保持SSDT的最新状态是必要的!
发布于 2017-03-03 16:49:49
在使用数据库项目和DacPacs的过程中,我们决定不使用DacPacs来部署任何东西,除了作为持续维护和支持的一部分而更改的基本组件。这只是表、视图、存储过程、扩展属性、用户定义的数据和表类型、Scalar和表值函数。
相反,我们通过包括开发团队和数据库团队在内的协作方法来管理安全和数据库设置。
当然,我们并不是经常从头开始创建数据库,而且安全性是相当稳定的,需要很少的changes.But,安全性包括在项目中。为了解决我们最初遇到的导致生成失败的登录问题,我们更改了Create对象以删除密码:
创建没有登录的用户用户;
在这些用户对象上检测漂移是没有问题的。你可以试试这个方法,看看它是否能解决你的问题。
https://dba.stackexchange.com/questions/149569
复制相似问题