Sql-Server
從本地到 Azure SQL 數據庫的連結伺服器
我正在使用: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