【问题标题】:How do I get SSDT Publish to not generate REVOKE CONNECT scripts如何让 SSDT Publish 不生成 REVOKE CONNECT 脚本
【发布时间】:2018-07-20 19:37:53
【问题描述】:

我们已经开始使用 SSDT 来管理我们的脚本部署。最初我们使用 Schema Compare 并取消选中我们不想部署的部分。我们现在需要使用仅包含在发布功能中的 Pre 和 Post-Deploy 脚本,并且我们也在尝试清理我们排除的部分。

在 Publish 中添加了 2 个未在 Schema Compare 中的差异,即使设置尽可能接近,我似乎也无法弄清楚。

首先是发布脚本想要删除 dacpac 中不存在的表的统计信息,即使 DropStatisticsNotInSource 设置为 false。我能够根据 SSDT/SqlPackage drops statistics 中的 DeploymentFilterContributor 答案解决此问题。

不过,第二个继续难倒我。大多数应用程序安全性是通过授予角色和各种系统帐户成为成员,具体取决于环境,但是也有用户不在开发数据库中的角色(通​​常是管理员,但也有具有各种权限的实用程序)。我们在不同的环境中有不同的用户。我的长期目标是只让用户担任角色,但我们还没有实现。与此同时,我们需要排除用户被丢弃。我首先设置Exclude UsersExcludeLoginsExcludeRoleMembership,这是我们在模式比较中使用的,效果很好。但是在 Publish 脚本中,我们得到 REVOKE CONNECT 脚本(但不是 DROP LOGINDROP USER)。

我已经阅读了Prevent dropping of users when publishing a DACPAC using SqlPackage.exeCreate User in dacpac deployed by SqlPackage.exe leads to login failed SqlException(这似乎是一个类似的脚本结果,目的不同,也没有答案)。我尝试将AgileSqlClub.DeploymentFilterContributorIgnoreType(Login)IgnoreType(User)IgnoreType(RoleMembership) 以及IgnoreType(Permissions)IgnoreSecurity 一起使用。前3个没有效果。最后 2 个(我也尝试通过等效的 SSDT 配置选项)还删除了我想针对 db 角色包含的 GRANT 脚本。

我觉得我应该能够做到这一点,而无需创建自定义 DeploymentContributor 并且无需在部署后为所有这些用户编写脚本。我怎样才能摆脱这些REVOKE CONNECT 电话?

另外,如果有人知道 Visual Studio 是否实际上在其路径中调用 SqlPackage.exe 或者正在使用库,我将不胜感激……我似乎无法在我的 5 个 SqlPackage.exe 中获得任何机器可以使用 VS 使用的内置 .dacpac 和 .publish.xml 文件。

我包含完整的发布配置文件以供参考:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <AdditionalDeploymentContributors>AgileSqlClub.DeploymentFilterContributor</AdditionalDeploymentContributors>
    <!--AdditionalDeploymentContributorArguments>SqlPackageFilter0=IgnoreType(Statistics);SqlPackageFilter1=IgnoreType(Login);SqlPackageFilter2=IgnoreType(User);SqlPackageFilter3=IgnoreType(RoleMembership);SqlPackageFilter4=IgnoreSchema(SEQUENCES)</AdditionalDeploymentContributorArguments-->
    <!--AdditionalDeploymentContributorArguments>SqlPackageFilter4=IgnoreSchema(SEQUENCES)</AdditionalDeploymentContributorArguments-->
    <AdditionalDeploymentContributorArguments>SqlPackageFilter0=IgnoreType(Statistics);SqlPackageFilter1=IgnoreSecurity</AdditionalDeploymentContributorArguments>
    <IncludeCompositeObjects>True</IncludeCompositeObjects>
    <TargetDatabaseName>BRM</TargetDatabaseName>
    <DeployScriptFileName>BRM.sql</DeployScriptFileName>
    <TargetConnectionString>Data Source=mydb;Integrated Security=True;Persist Security Info=False;Pooling=False;MultipleActiveResultSets=False;Connect Timeout=60;Encrypt=False;TrustServerCertificate=True</TargetConnectionString>
    <BlockOnPossibleDataLoss>True</BlockOnPossibleDataLoss>
    <ExcludeAggregates>False</ExcludeAggregates>
    <ExcludeApplicationRoles>False</ExcludeApplicationRoles>
    <ExcludeAssemblies>True</ExcludeAssemblies>
    <ExcludeAsymmetricKeys>True</ExcludeAsymmetricKeys>
    <ExcludeBrokerPriorities>True</ExcludeBrokerPriorities>
    <ExcludeCertificates>True</ExcludeCertificates>
    <ExcludeExternalDataSources>True</ExcludeExternalDataSources>
    <ExcludeExternalFileFormats>True</ExcludeExternalFileFormats>
    <ExcludeExternalTables>True</ExcludeExternalTables>
    <ExcludeFilegroups>True</ExcludeFilegroups>
    <ExcludeFileTables>True</ExcludeFileTables>
    <ExcludeFullTextCatalogs>True</ExcludeFullTextCatalogs>
    <ExcludeFullTextStoplists>True</ExcludeFullTextStoplists>
    <ExcludePartitionFunctions>True</ExcludePartitionFunctions>
    <ExcludePartitionSchemes>True</ExcludePartitionSchemes>
    <ExcludeQueues>True</ExcludeQueues>
    <ExcludeRemoteServiceBindings>True</ExcludeRemoteServiceBindings>
    <IgnoreRoleMembership>True</IgnoreRoleMembership>
    <ExcludeRules>True</ExcludeRules>
    <ExcludeSecurityPolicies>True</ExcludeSecurityPolicies>
    <ExcludeServices>True</ExcludeServices>
    <ExcludeSignatures>True</ExcludeSignatures>
    <ExcludeUserDefinedDataTypes>True</ExcludeUserDefinedDataTypes>
    <ExcludeUserDefinedTableTypes>True</ExcludeUserDefinedTableTypes>
    <ExcludeUsers>True</ExcludeUsers>
    <ExcludeXmlSchemaCollections>True</ExcludeXmlSchemaCollections>
    <DropObjectsNotInSource>True</DropObjectsNotInSource>
    <DropPermissionsNotInSource>False</DropPermissionsNotInSource>
    <DropRoleMembersNotInSource>False</DropRoleMembersNotInSource>
    <DisableAndReenableDdlTriggers>False</DisableAndReenableDdlTriggers>
    <IncludeTransactionalScripts>True</IncludeTransactionalScripts>
    <ProfileVersionNumber>1</ProfileVersionNumber>
    <DropStatisticsNotInSource>False</DropStatisticsNotInSource>
    <ExcludeLogins>True</ExcludeLogins>
    <ExcludeAudits>True</ExcludeAudits>
    <ExcludeClrUserDefinedTypes>True</ExcludeClrUserDefinedTypes>
    <ExcludeCredentials>True</ExcludeCredentials>
    <ExcludeCryptographicProviders>True</ExcludeCryptographicProviders>
    <ExcludeDatabaseScopedCredentials>True</ExcludeDatabaseScopedCredentials>
    <ExcludeDatabaseAuditSpecifications>True</ExcludeDatabaseAuditSpecifications>
    <ExcludeEndpoints>True</ExcludeEndpoints>
    <ExcludeErrorMessages>True</ExcludeErrorMessages>
    <ExcludeEventSessions>True</ExcludeEventSessions>
    <ExcludeLinkedServerLogins>True</ExcludeLinkedServerLogins>
    <ExcludeLinkedServers>True</ExcludeLinkedServers>
    <ExcludeRoutes>True</ExcludeRoutes>
    <ExcludeSearchPropertyLists>True</ExcludeSearchPropertyLists>
    <ExcludeServerAuditSpecifications>True</ExcludeServerAuditSpecifications>
    <ExcludeServerRoleMembership>True</ExcludeServerRoleMembership>
    <ExcludeServerRoles>True</ExcludeServerRoles>
    <ExcludeServerTriggers>True</ExcludeServerTriggers>
    <DoNotDropLogins>True</DoNotDropLogins>
    <DoNotDropUsers>True</DoNotDropUsers>
    <DoNotDropRoleMembership>True</DoNotDropRoleMembership>
    <DoNotDropServerRoleMembership>True</DoNotDropServerRoleMembership>
  </PropertyGroup>
  <ItemGroup>
    <SqlCmdVariable Include="mscrm">
      <Value>mscrm</Value>
    </SqlCmdVariable>
    <SqlCmdVariable Include="sysdb">
      <Value>sysdb</Value>
    </SqlCmdVariable>
  </ItemGroup>
</Project>

VS2015 Update 3 和 SSDT 14.0.61712.050(我认为是最新的)。

【问题讨论】:

  • 嗨@SMM,你有没有设法解决这个问题?我遇到了同样的问题。
  • @mfalkus 我已经发布了部分答案,可能会对您有所帮助。

标签: visual-studio-2015 sql-server-data-tools sqlpackage


【解决方案1】:

因此,作为后续行动,我还没有令人满意地解决这个问题,并且已经离开了一段时间。我什至不确定它在最新版本中是否仍然是一个问题。但是,对于仍在研究此问题的任何人,这是我开始遵循的路径,结果喜忧参半。我会留给其他人继续。

我决定尝试直接调用 sqlpackage.exe,结果我记得这似乎解决了这个特定问题,但后来我遇到了其他奇怪的问题。一些问题围绕着哪个版本的 sqlpackage 与哪个 SQL 服务器一起使用。无论如何,您可以自己尝试一下,如果您在此处查看回复或发布更完整的答案。

  1. 按照您认为应该从 Visual Studio 中的方式创建发布 XML。我想我右键单击了|在数据库上发布,并从对话框中保存了发布 XML 文件。
  2. 查看 XML 文件并确保一切都符合需要(或至少符合预期 :-))。
  3. 使用批处理文件调用:"&lt;path to sqlpackage&gt;\sqlpackage.exe" /a:script /pr:"MyDB.Publish.xml" /sf:"MyDB.dacpac" /dsp:"c:\temp\sqlpackage test\deploy.sql" /p:DropStatisticsNotInSource=False

再次,我按原样提供此内容,但如果您的某些内容运行良好,请随时编辑答案或发布您自己更完整的答案。

【讨论】:

  • 这是一个错误还是一些预期的行为?当我想添加新用户并将它们部署在下一个环境中时,发布脚本会在破坏一切的撤销连接之后立即生成创建用户。我再次添加了一个带有授权的部署后脚本,它可以工作,但它也应该以另一种方式工作。
  • 我觉得这是一个错误。我们从来没有让这个工作令人满意。我不确定用户,因为我们从对象列表中省略了用户,而是将授权分配给角色(不同的用户在不同的环境中分配给这些角色)。我被叫去其他更紧迫的项目。我相信处理部署的人仍然使用 Visual Studio 架构比较来生成脚本而不是发布 dacpacs。
【解决方案2】:

将此添加到发布配置文件

<ExcludeUsers>True</ExcludeUsers>
<ExcludeLogins>True</ExcludeLogins>
<IgnorePermissions>True</IgnorePermissions>
<IgnoreRoleMembership>True</IgnoreRoleMembership>

【讨论】:

  • 4 个中的 3 个已经存在。 IgnorePermissions 无法设置,因为需要为角色适当设置权限。
【解决方案3】:

您可以在 SSDT 中的创建用户语句之后添加“GRANT CONNECT TO [YourUser]”吗?它将覆盖撤销连接执行。

CREATE USER [YourUser] FOR EXTERNAL PROVIDER
GO
GRANT CONNECT TO [YourUser]
GO

【讨论】:

  • 请避免在回答中提问(即使是修辞问题)。它有被误解并被标记为“不是答案”的风险。
  • 感谢您的建议。因为我们在不同的预生产数据库中有不同的用户,我们实际上并没有在 SSDT 中编写大多数用户的脚本,我们使用问题中提到的 ExcludeUsers 等标志来确保它们被忽略。通常它们是(用户未删除等),但我们确实得到了这些 REVOKE CONNECT - 并且仅在使用 Publish 时(而不是在进行 VS 模式比较时)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多