【问题标题】:Unable to upgrade/import a dacpac file无法升级/导入 dacpac 文件
【发布时间】:2020-07-29 22:23:04
【问题描述】:

原始问题:

尝试使用 .dacpac 文件升级在测试 VM 中创建的空白数据库,但收到以下错误消息:

Error SQL72014: .Net SqlClient Data Provider: Msg 15401, Level 16, State 1, Line 1 Windows NT user or group 'SOURCE_DOMAIN\SOURCE SQL Readers' not found. Check the name again.
Error SQL72045: Script execution error.  The executed script:
CREATE LOGIN [SOURCE_DOMAIN\SOURCE SQL Readers]
    FROM WINDOWS WITH DEFAULT_LANGUAGE = [us_english];


 (Microsoft.SqlServer.Dac)

------------------------------
Program Location:

   at Microsoft.SqlServer.Dac.DeployOperation.ThrowIfErrorManagerHasErrors()
   at Microsoft.SqlServer.Dac.DeployOperation.<>c__DisplayClass14.<>c__DisplayClass16.<CreatePlanExecutionOperation>b__13()
   at Microsoft.Data.Tools.Schema.Sql.Dac.OperationLogger.Capture(Action action)
   at Microsoft.SqlServer.Dac.DeployOperation.<>c__DisplayClass14.<CreatePlanExecutionOperation>b__12(Object operation, CancellationToken token)
   at Microsoft.SqlServer.Dac.Operation.Microsoft.SqlServer.Dac.IOperation.Run(OperationContext context)
   at Microsoft.SqlServer.Dac.ReportMessageOperation.Microsoft.SqlServer.Dac.IOperation.Run(OperationContext context)
   at Microsoft.SqlServer.Dac.OperationExtension.CompositeOperation.Microsoft.SqlServer.Dac.IOperation.Run(OperationContext context)
   at Microsoft.SqlServer.Dac.OperationExtension.CompositeOperation.Microsoft.SqlServer.Dac.IOperation.Run(OperationContext context)
   at Microsoft.SqlServer.Dac.DeployOperation.Microsoft.SqlServer.Dac.IOperation.Run(OperationContext context)
   at Microsoft.SqlServer.Dac.OperationExtension.Execute(IOperation operation, DacLoggingContext loggingContext, CancellationToken cancellationToken)
   at Microsoft.SqlServer.Dac.DacServices.InternalDeploy(IPackageSource packageSource, Boolean isDacpac, String targetDatabaseName, DacDeployOptions options, CancellationToken cancellationToken, DacLoggingContext loggingContext, Action`3 reportPlanOperation, Boolean executePlan)
   at Microsoft.SqlServer.Dac.DacServices.Deploy(DacPackage package, String targetDatabaseName, Boolean upgradeExisting, DacDeployOptions options, Nullable`1 cancellationToken)
   at Microsoft.SqlServer.Management.Dac.DacWizard.UpgradeModel.RunAction()
   at Microsoft.SqlServer.Management.Dac.DacWizard.ExecuteDacPage.backgroundWorker1_DoWork(Object sender, DoWorkEventArgs e)
   at System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)
   at System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument)

假设用户存在于源中,但不存在于目标中。在 VM 上创建该用户是否会解决此问题,或者我是否需要使用不同的方法从在 VM 目标中重新创建的源中获取架构数据以进行测试?


对问题 1 的更新:

.dacpac 文件是在位于完全不同域的服务器上生成的,并且测试 VM 不可能位于同一域中。考虑到这一点,如何让 .dacpac 文件在测试 VM 上运行?

【问题讨论】:

  • 无需在测试 VM 上创建域用户,因为 SQL Server 将信任 Windows 进行身份验证。该错误表明测试 VM 未加入 SOURCE_DOMAIN,因此 SQL Server 找不到 Windows 帐户(组)。
  • 没错,测试虚拟机与生成.dacpac 文件的域之间没有任何连接。没有机会像外部公司那样将测试 VM 与源域连接。考虑到这一点,我如何在我的测试 VM 上使用这个 .dacpac 文件?

标签: sql sql-server sql-server-2016 dacpac


【解决方案1】:

如果您仍然可以访问 VM,您可以忽略登录再次生成 .dacpac。根据您使用的工具,您应该可以访问“包括用户登录映射”之类的选项。

最健壮的有VS:"How to create DACPAC file?" by Kamil Nowinski:

图片来源:https://sqlplayer.net/wp-content/uploads/2018/10/visual-studio-extract-dacpac-options.png

之后您可以使用自己的 SQL 脚本重新创建正确的登录名和用户。


相关:Using Publish Profiles to Deploy a DACPAC Database Without User Accounts

此问题的解决方案在于为您的 DACPAC 定义适当的发布配置文件,然后指导您选择的部署工具(SQLPackage.exe、Visual Studio 或 Azure DevOps)如何执行部署

配置文件被定义为 XML 文件。

ExcludeUsers
ExcludeLogins
ExcludeDatabaseRoles

通过在我们的发布配置文件中将这些选项设置为 True,在任何数据库部署期间将完全跳过这些对象的创建或修改。


另一种选择是使用dbtools.io - Export-DbaDacPackage

这里的重点是:

$exportProperties = "/p:IgnorePermissions=True /p:IgnoreUserLoginMappings=True" # Ignore 

和发布.xml:

...
<ExcludeLogins>True</ExcludeLogins>
<IgnorePermissions>True</IgnorePermissions>
<IgnoreLoginSids>True</IgnoreLoginSids>
<IgnoreRoleMembership>True</IgnoreRoleMembership>

总结:

  • 无需登录即可创建 dacpac
  • 创建一个将忽略权限的 publish.xml 文件

【讨论】:

    【解决方案2】:

    在 VM 中创建用户是解决此问题的一种方法,但您需要将“SOURCE_DOMAIN”更改为 VM 主机名,因为该用户将成为本地用户数据库的一部分。

    可能最好的解决方案是修复 VM 与域控制器的通信,这样身份验证将起作用,并且用户帐户最终在 VM 中实际上是可见的。

    【讨论】:

    • 由于测试 VM 与生成 .dacpac 文件的服务器不在同一个域中,因此无法将测试 VM 连接到该域控制器。由于无法将测试 VM 连接到生成 .dacpac 文件的域,我该如何在测试 VM 上使用此 .dacpac 文件?
    【解决方案3】:

    看看this, 这个错误通常是因为COMPATIBILITY_LEVEL 我建议尝试这个采石场:

    ALTER DATABASE database_name
    SET COMPATIBILITY_LEVEL =  130;
    

    希望对你有帮助!

    【讨论】:

      【解决方案4】:

      如果 dacpac 包含不在部署 dacpac 的域中的用户或组,那么部署它的一种方法是使用 SqlPackage 命令行工具,因为这允许您显式列出对象类型你想排除。

      要排除用户和组,PowerShell 命令应该是这样的:

      .\SqlPackage.exe `
        /a:Publish `
        /tsn:"(localdb)\mssqllocaldb" `
        /tdn:YourDatabaseName `
        /p:ExcludeObjectTypes="Users;RoleMembership;Logins;ServerRoles;ServerRoleMembership;Permissions" `
        /sf:YourFile.dacpac
      

      此命令使用以下开关:

      • /a (Action):要运行的动作,在本例中为 Publish
      • /tsn (TargetServerName):要部署到的服务器的名称
      • /tdn (TargetDatabaseName):要部署到的数据库的名称
      • /p(属性):特定于操作的属性的名称值对,在这种情况下:
        • ExcludeObjectTypes:应忽略的以分号分隔的对象类型列表
      • /sf (SourceFile):要部署的 dacpac 文件

      有关 Publish 语法的更多详细信息(包括可以排除的对象类型的列表),请参阅 docs for the publish action

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-24
        相关资源
        最近更新 更多