從 Linux 或 macOS 連線
本文討論如何建立與 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=<password>
上述連接字串相當於指定不含 DSN
關鍵字的連接字串,例如:Driver=ODBC Driver 18 for SQL Server;Server=tcp:localhost,1433;Encrypt=yes;UID=my_username;PWD=<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 的連接和使用加密而不需驗證。
無論 Encrypt 和 TrustServerCertificate的設定為何,伺服器登入認證 (使用者名稱和密碼) 一律都會加密。 下列表格說明 Encrypt 和 TrustServerCertificate 設定的效用。
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 開始,可在連接字串中指定 KeepAlive
和 KeepAliveInterval
關鍵字。
KeepAlive=<integer>
會藉由傳送 keep-alive 封包,控制 TCP 嘗試驗證閒置連線是否仍完整無缺的頻率。 預設值是 30 秒。KeepAliveInterval=<integer>
可決定在收到回應之前,用以分隔 keep-alive 重新傳輸的間隔。 預設值為 1 秒。