关于此问题,有很多问题。这是一个-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时,使用了相同的配置文件,但是过程略有不同。在生产配置文件中使用凭据时,我可以成功连接到数据库。
感觉好像我必须丢失一些明显的东西,但是我不确定它是什么。我知道这不是一个容易复制的问题,但是如果有人有任何想法,我都会耳熟。
正如你所说的,这很难复制。我只分享一些我知道的可能原因,您可以自己检查。
1]服务器具有防火墙规则,因此代理无法通过。
[2)不确定在此使用的是哪个代理,但是尝试使用self-agent或在管道中使用deployment group job运行。
3) (这是最容易错过的,而且我见过)
检查SQL用户名/密码,并确保它是正确的。
4)服务器角色不正确。
publish profile
中使用的用户帐户可以具有sysadmin
特权。另外,由于服务器上的sysadmin
用户与数据库中的用户"dbo"
映射在一起,因此导致此错误。
要解决此问题,请尝试使用对数据库具有db_owner
权限的另一个用户。
希望这些可以提供帮助。