Dieser Artikel beantwortet häufig gestellte Fragen zur Installation, Verbindung und zum Entwickeln von Anwendungen für den Microsoft ODBC Driver für SQL Server unter Linux und macOS.
Informationen zum Treiber
Welche ODBC-Treiberversion sollte ich verwenden?
Verwenden Sie Microsoft ODBC Driver 18 für SQL Server, die aktuelle Treiberreihe, für neue Entwicklungen. Microsoft ODBC Driver 17 für SQL Server wird weiterhin für Anwendungen unterstützt, die ihn bereits einsetzen, wie im Support-Lebenszyklus beschrieben.
Die Upgrade-Änderung, die die meisten Anwendungen betrifft, ist, dass Driver 18 die Verbindungen standardmäßig verschlüsselt. Alle Unterschiede siehe Unterschiede zwischen Hauptversionen.
Welche Betriebssysteme und Prozessorarchitekturen unterstützt der Treiber?
Driver 18 unterstützt folgende Betriebssysteme und Prozessorarchitekturen:
| Betriebssystem | x64-Unterstützung | Arm64-Unterstützung |
|---|---|---|
| Alpine Linux | Yes | Ab Treiber 18.3 |
| Azure Linux | Yes | Beginnend mit Treiber 18.6.1 |
| Debian | Yes | Ab Driver 18.1 |
| Oracle Linux | Yes | No |
| Red Hat Enterprise Linux | Yes | Ab Driver 18.1 |
| SUSE Linux Enterprise Server | Yes | No |
| Ubuntu | Yes | Ab Driver 18.1 |
| macOS | Yes | Ab Driver 17.8 |
Die unterstützten Betriebssystemversionen ändern sich mit jeder Treiberveröffentlichung. Die versionsspezifische Tabelle finden Sie unter Systemanforderungen.
Welche SQL Server-Funktionen unterstützt der Linux- und macOS-Treiber?
Der Treiber unter Linux und macOS unterstützt die meisten SQL Server-Funktionen. Es unterstützt keine verteilte Transaktionsanmeldung über die SQL_ATTR_ENLIST_IN_DTC Attribute, Datenbankspiegelung, FILESTREAM oder die Treiber-Performance-Profiling-Attribute. LocalDB ist weder unter Linux noch macOS verfügbar. XA-Transaktionen über den Distributed Transaction Coordinator (DTC) werden ab Driver 17.3 unterstützt. Weitere Informationen finden Sie unter Verwenden von XA-Transaktionen mit DTC. Die vollständige Liste finden Sie unter Einschränkungen.
Ist der Treiber Open Source?
No. Der Microsoft ODBC-Treiber für SQL Server ist nicht Open Source.
Installieren und konfigurieren
Welchen Driver Manager verwendet der Driver?
Der Treiber verwendet den unixODBC-Treibermanager. Wenn du Treiber 17 oder 18 mit dem Paketmanager deiner Plattform oder Homebrew installierst, wird unixODBC als Abhängigkeit installiert. Folgen Sie den Schritten für Linux oder macOS.
Baue und führe deine Anwendung unter macOS mit unixODBC statt iODBC aus. Passen Sie die Prozessorarchitektur der Anwendung, des Treibermanagers und des Treibers an. Ein Fehler wie dies incompatible architecture (have 'arm64', need 'x86_64') deutet auf eine Architekturfehlanpassung hin, nicht unbedingt auf den falschen Treibermanager.
Wie überprüfe ich, welche Treiber installiert sind und welche Konfigurationsdateien verwendet werden?
Führen Sie odbcinst -q -d aus, um die registrierten Treiber aufzulisten. Die Ausgabe zeigt jeden Treibernamen genau so, wie eine Verbindungszeichenfolge ihn schreiben muss:
[ODBC Driver 18 for SQL Server]
Führe odbcinst -j aus, um die unixODBC-Version und die Pfade von odbcinst.ini anzuzeigen, das Treiber registriert, und odbc.ini, das System- und Benutzerdatenquellennamen (DSNs) enthält:
unixODBC 2.3.11
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /home/<user>/.odbc.ini
Informationen zum Konfigurieren eines DSN finden Sie unter Verbindungszeichenfolgen und DSNs.
Warum meldet der Treiber-Manager, dass er die Treiberbibliothek nicht öffnen kann?
Der Fehler sieht wie folgt aus:
[01000][unixODBC][Driver Manager]Can't open lib 'ODBC Driver 18 for SQL Server' : file not found
Überprüfen Sie diese Ursachen in der Reihenfolge:
- Der
DriverWert im Verbindungszeichenfolge oder DSN stimmt nicht mit einem registrierten Treibernamen überein. Führeodbcinst -q -daus und kopiere den Namen genau. - Deine Anwendung verwendet andere Konfigurationsdateien als die, die du bearbeitet hast. Führe
odbcinst -jaus derselben Umgebung wie die Anwendung aus und überprüfe, welchen Treibermanager die Anwendung lädt. Auf macOS erstellen Sie symbolische Konfigurationslinks nur, wenn die Anwendung sie benötigt, wie in Fehlerbehebung auf macOS beschrieben. - Mehr als eine Kopie des unixODBC-Treibermanagers ist installiert, und Ihre Anwendung lädt die falsche Kopie. Führen Sie
find /usr -name 'libodbc*.so*'unter Linux aus. Auf macOS führefind /opt/homebrew /usr/local -name 'libodbc*.dylib'aus. Mehrere Pfade allein beweisen nicht, dass mehrere Treibermanager installiert sind: Homebrew-Links können auf dieselbe Bibliothek im Cellar-Verzeichnis verweisen. Überprüfe, welche Bibliothek die Anwendung tatsächlich lädt. Weitere Informationen finden Sie unter „Fehlerbehebung bei Verbindungsproblemen“.
Verbinden und Authentifizieren
Warum schlägt eine Verbindung, die mit Treiber 17 funktioniert, mit einem Zertifikatsfehler auf Treiber 18 ab?
Treiber 18 setzt standardmäßig auf Encrypt=yes. Treiber 17 verwendet standardmäßig nur Encrypt=no, wenn keine nichtleere Authentication Einstellung oder kein Zugriffstoken bereitgestellt wird. Eine nichtleere Authentication-Einstellung, einschließlich Authentication=SqlPassword, oder ein Zugriffstoken ändert die Standardeinstellung von Treiber 17 auf Encrypt=yes. Explizite Verschlüsselungseinstellungen überschreiben diese Standardeinstellungen.
Überprüfen Sie die effektiven Einstellungen in Ihren Verbindungszeichenfolgen-, DSN- und Vorverbindungsattributen, die durch SQLSetConnectAttr festgelegt werden. Zum Beispiel fordern Encrypt=yes in einem DSN oder SQL_COPT_SS_ENCRYPT=SQL_EN_ON die Verschlüsselung an, selbst wenn in der Verbindungszeichenfolge Encrypt fehlt. Stellen Sie Zugriffstoken nur über das SQL_COPT_SS_ACCESS_TOKEN Verbindungsattribut bereit, nicht über ein Verbindungsstring-Schlüsselwort.
Mit Encrypt=yes und TrustServerCertificate=noverschlüsseln beide Treiber die Verbindung und validieren das Serverzertifikat. Mit Encrypt=no validiert Treiber 17 das Zertifikat nicht, während Treiber 18 es validiert, wenn der Server Verschlüsselung und TrustServerCertificate=no erzwingt. Eine Verbindung, die zuvor den Standard von Treiber 17 Encrypt=no verwendete, kann daher mit Treiber 18 gegen einen Server mit selbstsigniertem oder anderweitig nicht vertrauenswürdigem Zertifikat ausfallen. Bei einem selbstsignierten Zertifikat sieht der Fehler Treiber 18 folgendermaßen aus:
[Microsoft][ODBC Driver 18 for SQL Server]SSL Provider: [error:0A000086:SSL routines::certificate verify failed:self-signed certificate]
[Microsoft][ODBC Driver 18 for SQL Server]Client unable to establish connection. For solutions related to encryption errors, see https://go.microsoft.com/fwlink/?linkid=2226722
Bevorzugen Sie ein vertrauenswürdiges Zertifikat oder das Anheften von Zertifikaten. Nutzen Sie diese Optionen:
- Installiere ein Zertifikat auf dem Server, das von einer Zertifizierungsstelle ausgestellt wird, der der Client vertraut. Wenn das Zertifikat vertrauenswürdig ist, sein Name aber nicht mit dem
ServerWert übereinstimmt, setzeHostNameInCertificateauf den Namen im Zertifikat.HostNameInCertificateändert nur den erwarteten Namen, sodass ein selbstsigniertes Zertifikat nicht behoben wird. - Bei Treiber 18.1 und neueren Versionen sowie einem Server, der Tabular Data Stream (TDS) 8.0 unterstützt, legen Sie
Encrypt=strictfest und setzen SieServerCertificateauf den Pfad einer Kopie des Serverzertifikats. Der Fahrer akzeptiert dann nur genau dieses Zertifikat.ServerCertificatefunktioniert nur im strengen Modus. - Legen Sie
Encrypt=nonur fest, wenn Sie unverschlüsselten Anwendungsverkehr akzeptieren, wenn der Server keine Verschlüsselung erzwingt. Dies entspricht dem Standard von Driver 17 nur, wenn keine nichtleereAuthenticationEinstellung oder Zugriffstoken angegeben ist und keine Verschlüsselungsüberschreibung festgelegt ist. Wenn der Server die Verschlüsselung erzwingt, validiert Treiber 18 das Zertifikat weiterhin, es sei denn,TrustServerCertificate=yesdeaktiviert die Validierung.
Caution
TrustServerCertificate=yes aktiviert die Verschlüsselung nicht. Mit Encrypt=yes wird die Zertifikatsvalidierung umgangen, während der Datenverkehr verschlüsselt bleibt, wodurch die Verbindung für Man-in-the-Middle-Angriffe offen bleibt. Mit Encrypt=no bleibt Anwendungsverkehr unverschlüsselt, es sei denn, der Server erzwingt die Verschlüsselung; erzwingt der Server die Verschlüsselung, wird die Zertifikatsvalidierung umgangen. Mit Encrypt=strict ignoriert der Treiber TrustServerCertificate und validiert das Zertifikat oder gleicht es bei entsprechender Konfiguration mit ServerCertificate ab. Bevorzugen Sie ein vertrauenswürdiges Zertifikat oder das Anheften von Zertifikaten.
Weitere Informationen finden Sie unter Standard-Verschlüsselungsverhalten.
Unterstützt der Treiber die Kerberos-Authentifizierung?
Ja. Hol dir ein Kerberos-Ticket mit kinit, dann verbinde dich mit Trusted_Connection=yes in der Verbindungszeichenfolge oder im DSN. Die SQL Server-Instanz benötigt einen registrierten Service Principal Name (SPN). Für Einrichtungsschritte siehe Integrierte Authentifizierung verwenden.
Unterstützt der Treiber Microsoft Entra ID-Authentifizierung?
Ja, für Azure SQL-Datenbank, Azure SQL Managed Instance und SQL Server 2022 und spätere Versionen. Um SQL Server einzurichten, auch über Azure Arc, verwenden Sie die Microsoft Entra-Authentifizierung für SQL Server. Unter Linux und macOS unterstützen Driver 17 und neuere Versionen folgende Methoden:
- Verwaltete Identität, mit
Authentication=ActiveDirectoryMsi, beginnend mit Treiber 17.3. - Service Principal, mit
Authentication=ActiveDirectoryServicePrincipal, beginnend mit Driver 17.7. - Integrierte Authentifizierung über Kerberos in einer föderierten Umgebung, mit
Authentication=ActiveDirectoryIntegrated, ab Driver 17.6. - Ein Zugriffstoken, den Ihre Anwendung erhält, das über das Verbindungsattribut
SQL_COPT_SS_ACCESS_TOKENübergeben wird.
ActiveDirectoryInteractiveist nur im Windows-Treiber verfügbar.
ActiveDirectoryPassword ist veraltet. Treibergesteuerte Authentifizierung unter Linux und macOS unterstützt keine Szenarien, die bedingten Zugriff erfordern. Wenn Ihre Anwendung ein Zugriffstoken separat erwirbt, regeln die Authentifizierungsbibliothek und die Microsoft Entra ID-Richtlinien diese Tokenbeschaffung. Leite den Token durch SQL_COPT_SS_ACCESS_TOKEN weiter.
Auf Alpine Linux erfordert integrierte Authentifizierung einen libcurl Build mit Unterstützung für den Simple and Protected Generic Security Service Application Program Interface Negotiation Mechanism (SPNEGO). Überprüfen Sie Ihre installierten libcurl-Funktionen, anstatt davon auszugehen, dass das Standardpaket diese unterstützt.
Für Verbindungszeichenfolgen und Codebeispiele siehe Use Microsoft Entra ID with the ODBC Driver.
Entwickeln und Fehler beheben
Kann eine bestehende ODBC-Anwendung den Treiber unter Linux oder macOS verwenden?
Ja. Eine für die ODBC Application Programming Interface (API) geschriebene und gegen unixODBC erstellte Anwendung kann diesen Treiber laden. Um SQL Server-spezifische Funktionen zu verwenden, fügen Sie msodbcsql.h nach den unixODBC-Headern hinzu. Für Compiler-Befehle und Bibliotheksnamen siehe C- und C++-Anwendungen mit dem ODBC-Treiber entwickeln.
Gibt es eine Beispielanwendung?
Ja. In Mit C++ und ODBC verbinden und abfragen wird ein Beispiel unter Linux, macOS und Windows erstellt und ausgeführt.
Wie kann ich ODBC-Aufrufe verfolgen?
Trace-Dateien können sensible Daten enthalten. Erstelle als das Konto, das deine Anwendung ausführt, ein Verzeichnis, auf das nur dieses Konto Zugriff hat:
mkdir -m 700 "$HOME/odbc-trace"
Fügen Sie diese Einstellungen dem [ODBC] Abschnitt von odbcinst.inihinzu. Ersetze /home/<user>/odbc-trace/odbctrace.log durch den absoluten Pfad innerhalb des von dir erstellten Verzeichnisses. Unter macOS verwenden Home-Verzeichnisse typischerweise /Users/<user> statt /home/<user>.
Behalten Sie den vollständigen Pfad der Trace-Datei auf 62 Bytes oder weniger, um eine Trunkierung durch unixODBC zu vermeiden.
[ODBC]
Trace = Yes
TraceFile = /home/<user>/odbc-trace/odbctrace.log
Diese Einstellungen ermöglichen die Ablaufverfolgung von Anwendungen, die diese Treibermanager-Konfiguration verwenden, und die Ablaufverfolgung verlangsamt diese Anwendungen. Verwenden Sie für jedes Anwendungskonto ein separates privates Verzeichnis. Entfernen Sie Trace = Yes, wenn Sie fertig sind, und löschen Sie Trace-Dateien, die Sie nicht mehr benötigen. Für die Nachverfolgung pro Anwendung, siehe Nachverfolgung des Datenzugriffs auf Linux und macOS.
Charakterdaten
Welche Unicode-Codierung sollte eine Anwendung verwenden?
Nutze UTF-16LE (Little Endian) für SQLWCHAR Daten. Verwenden Sie UTF-16-Puffer SQLWCHAR mit den ODBC-Breitzeichen-APIs anstelle des nativen wchar_t Typs, der unter Linux und macOS 32 Bit ist.
Nutze UTF-8 für SQLCHAR Daten. Ab Treiber 17 akzeptiert der Treiber auch eine Reihe von Single-Byte- und Double-Byte-Codepages für SQLCHAR-Daten, wenn das Prozessgebietsschema eine auswählt. Prozesse starten in der C-Locale, sodass der Treiber UTF-8 verwendet, es sei denn, die Anwendung ruft setlocale auf. Für die Liste der Codierungen siehe Zeichendaten verarbeiten.