当我在 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)