Sql-Server

從本地到 Azure SQL 數據庫的連結伺服器

  • March 29, 2020

我正在使用: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

c:\>echo CowboYs4EVR! > password.txt

然後轉儲大容量列

SELECT BulkColumn
FROM    OPENROWSET(BULK 'C:\temp\password.txt', SINGLE_blob) AS x   

你會看到的

0x436F77626F79733445565221200D0A

一個帶有尾隨空格和尾隨 CRLF 的 ANSI 字元串,您需要對其進行修剪,如下所示:

set @password = trim(replace(replace(@password, char(13),''),char(10),''))

如果您從 PowerShell 編寫文件,它可能是 unicode 等。

但如果您將密碼儲存在 json 文件中,SQL Server 將為您進行文件格式解析。

例如簡單的事情:

C:\temp>echo ["CowboYs4EVR!"] > password.json

DECLARE @password VARCHAR(MAX)
SELECT  @password = json_value(BulkColumn, '$[0]')
FROM    OPENROWSET(BULK 'C:\temp\password.json', SINGLE_CLOB) AS x   

引用自:https://dba.stackexchange.com/questions/263871