我正在使用:SSMS-18.4 SQL Server-SQL 2019 CU3 Windows 10
我能够成功创建从本地 SQL 2017 到 Azure SQL 数据库的链接服务器,而不会暴露我的密码。
--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
但是密码没有得到正确的值。我登录失败。
一些错误信息:
Login failed for user 'taiob'.
(.Net SqlClient Data Provider) Server
Name: .\SQL2019
Error Number: 18456
Severity: 14
State: 1
Line Number: 1
我通过运行以下代码确认它正在从文件中读取正确的密码:
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
我在其他地方使用 PowerShell 使用相同的文件,没有任何问题。
#Replace with password file location
$password = Get-Content "C:\Azure SQL Database - Where is my SQL Agent\password.txt"
如果我对密码进行硬编码,它可以正常工作。如果我打印变量,我可以看到值是正确的。这不是防火墙问题,因为我可以从运行代码的同一个 SSMS 直接连接。
根据您创建文本文件的方式,它可以是各种格式。Unicode 或 ANSI。带或不带字节顺序标记。带有或不带有尾随空格和换行符,无论是 posix 还是 Windows 样式。
JSON 这样更简单。
例如,如果您运行 cmd.exe
然后转储大容量列
你会看到的
一个带有尾随空格和尾随 CRLF 的 ANSI 字符串,您需要对其进行修剪,如下所示:
如果您从 PowerShell 编写文件,它可能是 unicode 等。
但如果您将密码存储在 json 文件中,SQL Server 将为您进行文件格式解析。
例如简单的事情:
和
我刚刚复制了您的场景,在我的环境中,它有效。我能想到的唯一问题可能是读取文本文件。你能不能:
hth