什么原因会导致在一个服务器而不是另一个服务器上部署dacpac失败?

问题描述 投票:0回答:1

关于此问题,有很多问题。这是一个-SSDT failing to publish: "Unable to connect to master or target server"。我遇到了同样的错误:

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。

develop中的发布步骤的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-server azure-devops dacpac
1个回答
1
投票

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

1]服务器具有防火墙规则,因此代理无法通过。

[2)不确定在此使用的是哪个代理,但是尝试使用self-agent或在管道中使用deployment group job运行。

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

检查SQL用户名/密码,并确保它是正确的。

4)服务器角色不正确。

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

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

5)启用Mixed Mode Authenication

希望这些可以提供帮助。

© www.soinside.com 2019 - 2024. All rights reserved.