Estou usando: SSMS-18.4 SQL Server-SQL 2019 CU3 Windows 10
Consegui criar um servidor vinculado com êxito do SQL 2017 local para o banco de dados SQL do Azure sem expor minha senha.
--Read the password from text file
DECLARE @password VARCHAR(MAX)
SELECT @password = BulkColumn
FROM OPENROWSET(BULK 'C:\Azure SQL Database - Where is my SQL Agent\password.txt', SINGLE_BLOB) AS x
--Drop and create linked server
IF EXISTS(SELECT * FROM sys.servers WHERE name = N'AzureDB_adventureworks')
EXEC master.dbo.sp_dropserver @server=N'AzureDB_adventureworks', @droplogins='droplogins';
EXEC master.dbo.sp_addlinkedserver
@server = N'AzureDB_adventureworks',
@srvproduct=N'',
@provider=N'SQLNCLI',
@datasrc=N'ugdemotargetserver.database.windows.net',
@catalog=N'adventureworks';
EXEC master.dbo.sp_addlinkedsrvlogin
@rmtsrvname=N'AzureDB_adventureworks',
@useself=N'False',
@rmtuser=N'taiob',@rmtpassword=@password;
GO
Mas a senha não está obtendo o valor correto. Estou recebendo uma falha de login.
Algumas das mensagens de erro:
Login failed for user 'taiob'.
(.Net SqlClient Data Provider) Server
Name: .\SQL2019
Error Number: 18456
Severity: 14
State: 1
Line Number: 1
Confirmei que ele está lendo a senha correta do arquivo executando o seguinte código:
DECLARE @password VARCHAR(MAX)
SELECT @password = BulkColumn
FROM OPENROWSET(BULK 'C:\Azure SQL Database - Where is my SQL Agent\password.txt', SINGLE_BLOB) AS x
SELECT @password
Estou usando o mesmo arquivo em outros lugares usando o PowerShell sem problemas.
#Replace with password file location
$password = Get-Content "C:\Azure SQL Database - Where is my SQL Agent\password.txt"
Se eu codificar a senha, funciona bem. Se eu imprimir a variável, posso ver que o valor está correto. Não é um problema de firewall, pois posso me conectar diretamente do mesmo SSMS do qual estou executando o código.
Dependendo de como você cria o arquivo de texto, ele pode estar em todos os tipos de formatos. Unicode ou ANSI. Com ou sem uma marca de ordem de byte. Com ou sem espaço em branco à direita e feeds de linha, no estilo posix ou Windows.
JSON é mais simples assim.
Por exemplo, se você executar cmd.exe
e, em seguida, despeje a coluna em massa
Você vai ver
Uma string ANSI com um espaço à direita e CRLF à direita, que você precisará aparar, assim:
Se você escrever o arquivo do PowerShell, é provável que seja unicode, etc.
Mas se você armazenar a senha em um arquivo json, o SQL Server fará a análise do formato do arquivo para você.
por exemplo, algo tão simples como:
e
Acabei de reproduzir seu cenário e no meu ambiente funciona. O único problema que eu poderia pensar pode ser a leitura do arquivo de texto. Você poderia talvez:
hth