共用方式為


從 Linux 或 macOS 連線

下載 ODBC 驅動程式

本文討論如何建立與 SQL Server 資料庫之間的連線。

Connection Properties

如需 Linux 和 macOS 上支援的所有連接字串關鍵字和屬性,請參閱 DSN 和連接字串關鍵字和屬性

重要

連接到使用資料庫鏡像的資料庫 (具有容錯移轉夥伴) 時,請不要在連接字串中指定資料庫名稱。 但是,請傳送 use database_name 命令,以便在執行查詢前先連線到資料庫。

傳遞至驅動程式關鍵字的值可以是下列其中之一:

  • 安裝驅動程式時所使用的名稱。

  • 驅動程式庫的路徑,指定於用來安裝驅動程序的範本 .ini 檔案中。

DSN 是選擇性的。 您可以使用 DSN 在 DSN 名稱下定義連接字串關鍵字,然後您就可在連接字串中加以參考。 若要建立 DSN,請建立 (如有必要) 並編輯檔案 ~/.odbc.ini (主目錄中的 .odbc.ini),以取得僅供目前使用者存取的使用者 DSN,或編輯 /etc/odbc.ini 以取得系統 DSN (需要系統管理權限)。以下 odbc.ini 是範例,其中顯示 DSN 的最低必要項目:

# [DSN name]
[MSSQLTest]  
Driver = ODBC Driver 18 for SQL Server  
# Server = [protocol:]server[,port]  
Server = tcp:localhost,1433
Encrypt = yes
#
# Note:  
# Port isn't a valid keyword in the odbc.ini file  
# for the Microsoft ODBC driver on Linux or macOS
#  

若要在連接字串中使用上述 DSN 進行連線,您可以指定 DSN 關鍵字,例如:DSN=MSSQLTest;UID=my_username;PWD=my_password
上述連接字串相當於指定不含 DSN 關鍵字的連接字串,例如:Driver=ODBC Driver 18 for SQL Server;Server=tcp:localhost,1433;Encrypt=yes;UID=my_username;PWD=my_password

您可以選擇性地指定用以連接到伺服器的通訊協定和連接埠。 例如,Server=tcp:servername,12345。 Linux 和 macOS 驅動程式所支援的唯一通訊協定是 tcp

若要在靜態連接埠上連線到具名執行個體,請使用 Server=伺服器名稱,port_number。 在 17.4 版之前,不支援連線到動態連接埠。

或者,您可將 DSN 資訊新增至範本檔案,並執行下列命令將其新增至 ~/.odbc.ini

odbcinst -i -s -f <template_file>

如需 ini 檔案與 odbcinst 的完整文件,請參閱 unixODBC 文件。 如需特定於 ODBC Driver for SQL Server 之 odbc.ini 檔案中的項目,請參閱 DSN 和連接字串關鍵字和屬性以了解 Linux 與 macOS 上所支援的項目。

您可以使用 isql 測試連接,以確認您的驅動程式可運作,或者您可以使用下列命令:

bcp master.INFORMATION_SCHEMA.TABLES out OutFile.dat -S <server> -U <name> -P <password>

使用 TLS/SSL

您可使用傳輸層安全性 (TLS) (先前稱為安全通訊端層 (SSL)) 來加密與 SQL Server 的連線。 TLS 會保護網路上的 SQL Server 使用者名稱和密碼。 TLS 也會驗證伺服器的身分識別,以防止攔截式 (MITM) 攻擊。

啟用加密可提高安全性,但會犧牲效能。

如需詳細資訊,請參閱加密 SQL Server 的連接使用加密而不需驗證

無論 EncryptTrustServerCertificate的設定為何,伺服器登入認證 (使用者名稱和密碼) 一律都會加密。 下列表格說明 EncryptTrustServerCertificate 設定的效用。

ODBC 驅動程式 18 和更新版本

加密設定 信任伺服器憑證 伺服器強制加密 結果
No 不檢查伺服器憑證。
在用戶端和伺服器之間傳送的資料不會加密。
No .是 不檢查伺服器憑證。
在用戶端和伺服器之間傳送的資料不會加密。
No 會檢查伺服器憑證。
在用戶端和伺服器之間傳送的資料會加密。
Yes .是 不檢查伺服器憑證。
在用戶端和伺服器之間傳送的資料會加密。
No Yes 會檢查伺服器憑證。
在用戶端和伺服器之間傳送的資料會加密。
No .是 Yes 不檢查伺服器憑證。
在用戶端和伺服器之間傳送的資料會加密。
Yes 會檢查伺服器憑證。
在用戶端和伺服器之間傳送的資料會加密。
Yes .是 Yes 不檢查伺服器憑證。
在用戶端和伺服器之間傳送的資料會加密。
Strict - - 忽略 TrustServerCertificate。 會檢查伺服器憑證。
在用戶端和伺服器之間傳送的資料會加密。

注意

嚴格僅適用於支援 TDS 8.0 連線的伺服器。

ODBC 驅動程式 17 和更舊版本

加密設定 信任伺服器憑證 伺服器強制加密 結果
No 不檢查伺服器憑證。
在用戶端和伺服器之間傳送的資料不會加密。
No .是 不檢查伺服器憑證。
在用戶端和伺服器之間傳送的資料不會加密。
No 會檢查伺服器憑證。
在用戶端和伺服器之間傳送的資料會加密。
Yes .是 不檢查伺服器憑證。
在用戶端和伺服器之間傳送的資料會加密。
No Yes 不檢查伺服器憑證。
在用戶端和伺服器之間傳送的資料會加密。
No .是 Yes 不檢查伺服器憑證。
在用戶端和伺服器之間傳送的資料會加密。
Yes 會檢查伺服器憑證。
在用戶端和伺服器之間傳送的資料會加密。
Yes .是 Yes 不檢查伺服器憑證。
在用戶端和伺服器之間傳送的資料會加密。

使用連線加密時,SQL Server TLS/SSL 憑證內主體一般名稱 (CN) 或主體別名 (SAN) 中的名稱 (或 IP 位址) 應完全符合指定在連接字串中的伺服器名稱 (或 IP 位址)。 HostnameInCertificate 關鍵字 (v18.0+) 可以用來指定替代名稱,用於比對 TLS/SSL 憑證中的名稱。 指定關鍵字時,SQL Server TLS/SSL 憑證必須符合其中一個伺服器名稱或 HostnameInCertificate

根據預設,加密的連線一律會驗證伺服器的憑證。 不過,如果您連線到具有自我簽署憑證的伺服器,而且不是使用嚴格加密模式,則可以新增 TrustServerCertificate 選項,以略過檢查憑證是否符合受信任憑證授權單位的清單:

Driver={ODBC Driver 18 for SQL Server};Server=ServerNameHere;Encrypt=YES;TrustServerCertificate=YES  

在嚴格加密模式中,一律會驗證憑證。 作為標準憑證驗證的選項,ServerCertificate 關鍵字 (v18.1+) 可以用來指定憑證檔案的路徑,以比對 SQL Server 憑證。 只在使用嚴格加密時,才能使用這個選項。 接受的憑證格式為 PEM、DER 和 CER。 如果指定,則會檢查 SQL Server 憑證,方法是查看提供的 ServerCertificate 是否完全相符。

Linux 和 macOS 上的 TLS 會使用 OpenSSL 程式庫。 下表顯示 OpenSSL 的最低支援版本,以及每個平台的預設憑證信任存放區位置:

平台 最低 OpenSSL 版本 預設憑證信任存放區位置
Debian 10、11、12 1.1.1 /etc/ssl/certs
Debian 9 1.1.0 /etc/ssl/certs
Debian 8.71 1.0.1 /etc/ssl/certs
OS X 10.11、macOS 1.0.2 /usr/local/etc/openssl/certs
Red Hat Enterprise Linux 9 3.0.1 /etc/pki/tls/cert.pem
Red Hat Enterprise Linux 8 1.1.1 /etc/pki/tls/cert.pem
Red Hat Enterprise Linux 7 1.0.1 /etc/pki/tls/cert.pem
Red Hat Enterprise Linux 6 1.0.0-10 /etc/pki/tls/cert.pem
SUSE Linux Enterprise 15 1.1.0 /etc/ssl/certs
SUSE Linux Enterprise 11、12 1.0.1 /etc/ssl/certs
Ubuntu 22.04、23.04 3.0.2 /etc/ssl/certs
Ubuntu 20.04 1.1.1 /etc/ssl/certs
Ubuntu 18.04 1.1.0 /etc/ssl/certs
Ubuntu 16.04 1.0.2 /etc/ssl/certs
Ubuntu 14.04 1.0.1 /etc/ssl/certs
Alpine 3.17、3.18 3.0.1 /etc/ssl/certs

當您使用 SQLDriverConnect 連接時,也可以使用 Encrypt 選項指定連接字串中的加密。

調整 TCP Keep-Alive 設定

從 ODBC 驅動程式 17.4 開始,可設定驅動程式傳送 keep-alive 封包,並在未收到回應時重新傳輸這些封包的頻率。 若要設定,請將下列設定新增至 odbcinst.ini 中的驅動程式區段,或 odbc.ini 中的 DSN 區段。 使用 DSN 連線時,驅動程式將會使用 DSN 區段中的設定 (如果有的話);如果只使用連接字串連接,則會使用 odbcinst.ini 中驅動程式區段內的設定。 如果此設定不存在任一個位置中,驅動程式會使用預設值。 從 ODBC 驅動程式 17.8 開始,可在連接字串中指定 KeepAliveKeepAliveInterval 關鍵字。

  • KeepAlive=<integer> 會藉由傳送 keep-alive 封包,控制 TCP 嘗試驗證閒置連線是否仍完整無缺的頻率。 預設值是 30 秒。

  • KeepAliveInterval=<integer> 可決定在收到回應之前,用以分隔 keep-alive 重新傳輸的間隔。 預設值為 1 秒。

另請參閱