首页 > 解决方案 > 什么会导致在一台服务器而不是另一台服务器上部署 dacpac 失败?

问题描述

关于这个问题有很多问题。这是一个 - SSDT 无法发布:“无法连接到主服务器或目标服务器”。我遇到了同样的错误:

2020-03-03T13:51:28.5079081Z *** Could not deploy package.
2020-03-03T13:51:28.5080013Z Unable to connect to master or target server 'databasename'. You must have a user with the same password in master or target server 'databasename'.
2020-03-03T13:51:28.6466638Z ##[error]Publishing to database 'databasename' on server 'server'. 
Initializing deployment (Start) 
Initializing deployment (Failed) 

我正在通过 Azure DevOps 进行部署。当我部署到我们的两个较低环境(在同一开发服务器上运行)时,它工作正常,但今天早上是我们的第一次生产部署。SQL Server 2016 在两台服务器上运行。不过版本还是有区别的。开发服务器正在运行Microsoft SQL Server 2016 (RTM) - 13.0.1601.5 (X64),而生产正在运行Microsoft SQL Server 2016 (RTM-CU5) (KB4013105) - 13.0.2197.0 (X64)。两者都将兼容性级别设置为 130。

开发中发布步骤的 YAML 如下所示:

steps:
- task: SqlDacpacDeploymentOnMachineGroup@0
  displayName: 'Deploy using : dacpac'
  inputs:
    DacpacFile: '$(System.DefaultWorkingDirectory)/database/Database.dacpac'
    TargetMethod: publishProfile
    PublishProfile: '$(System.DefaultWorkingDirectory)/Database/develop.publish.xml'

开发步骤和生产步骤之间的唯一区别是发布配置文件不同。两个发布配置文件 XML 文件之间的唯一区别是服务器名称和数据库名称。

这是开发配置文件:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <IncludeCompositeObjects>True</IncludeCompositeObjects>
    <TargetDatabaseName>develop</TargetDatabaseName>
    <DeployScriptFileName>develop.sql</DeployScriptFileName>
    <ProfileVersionNumber>1</ProfileVersionNumber>
    <TargetConnectionString>validconnectionstring</TargetConnectionString>
    <BlockOnPossibleDataLoss>False</BlockOnPossibleDataLoss>
    <GenerateSmartDefaults>True</GenerateSmartDefaults>
  </PropertyGroup>
  <ItemGroup>
    <SqlCmdVariable Include="dbEnvironment">
      <Value>develop</Value>
    </SqlCmdVariable>
    <SqlCmdVariable Include="migratedLegacyDatabase">
      <Value>Migration-Develop</Value>
    </SqlCmdVariable>
    <SqlCmdVariable Include="migrationSource">
      <Value>false</Value>
    </SqlCmdVariable>
  </ItemGroup>
</Project>

我们使用 Jenkins 时使用了相同的配置文件,但过程略有不同。当我在生产配置文件中使用凭据时,我能够成功连接到数据库。

感觉我必须遗漏一些明显的东西,但我不确定它是什么。我知道这不是一个容易重现的问题,但如果有人有任何想法,我会全力以赴。

标签: sql-serverazure-devopsdacpac

解决方案


正如你所说,这很难复制。我只是分享一些我知道的可能原因,您可以自己检查。

1)服务器有防火墙规则,导致代理无法通过。

2)在这里不确定您使用的是哪个代理,但请尝试使用自我代理或在管道中使用部署组作业运行。

3) (这将是最容易错过的,我见过)

检查 SQL 用户名/密码,并确保其正确。

4)服务器角色不正确。

中使用的用户帐户publish profile可能具有sysadmin特权。此外,由于sysadmin服务器上的用户"dbo"与数据库中的用户映射,因此导致此错误。

要解决这个问题,请尝试使用另一个db_owner对数据库具有权限的用户。

5)启用混合模式认证

希望这些可以提供帮助。


推荐阅读