相关疑难解决方法(0)

DACPAC 和数据库漂移:即使没有任何变化,数据库用户也始终被检测为漂移

当我在 SSDT 数据库项目中包含登录名和用户并尝试使用“数据库偏离注册版本时阻止发布”选项部署 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
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的发布配置文件:

<?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>
Run Code Online (Sandbox Code Playgroud)

这就是漂移报告的样子:

<?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> …
Run Code Online (Sandbox Code Playgroud)

sql-server deployment data-tier-application

8
推荐指数
1
解决办法
1万
查看次数