Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Dieser Artikel listet bekannte Einschränkungen und Einschränkungen des go-mssqldb Treibers auf.
LastInsertId wird nicht unterstützt
Der Treiber go-mssqldb unterstützt die Methode database/sqlResult.LastInsertId() nicht. Das Aufrufen ergibt einen Fehler:
LastInsertId is not supported. Please use the OUTPUT clause or add
'select ID = convert(bigint, SCOPE_IDENTITY())' to the end of your query.
Workaround: Verwenden Sie eine OUTPUT Klausel in der INSERT Anweisung oder eine separate Abfrage SCOPE_IDENTITY() .
Multiple Active Result Sets (MARS) wird nicht unterstützt
Der Fahrer unterstützt MARS nicht. Jede Verbindung kann jeweils nur eine aktive Abfrage oder Anweisung haben. Wenn du gleichzeitig Abfragen ausführen musst, verwende separate Verbindungen vom Pool.
Temporärer Tabellenbereich mit Verbindungspooling
Das temporäre Tabellenverhalten folgt den SQL Server-Scoping-Regeln, aber Connection Pooling verändert, wie dieses Verhalten im Anwendungscode erscheint:
- Lokale temporäre Tabellen (
#name) sind auf eine Sitzung (Verbindung) begrenzt. - Globale temporäre Tabellen (
##name) sind für andere Sitzungen sichtbar, solange die erstellte Sitzung offen bleibt.
Mit database/sql, getrennt db.Exec und db.Query Anrufe können unterschiedliche gepoolte Verbindungen verwenden. Eine lokale temporäre Tabelle, die in einem Anruf erstellt wurde, ist im nächsten Anruf nicht sichtbar, wenn dieser auf einer anderen Verbindung läuft.
Für globale temporäre Tabellen funktioniert die Sichtbarkeit über Verbindungen hinweg wie erwartet, aber Lebenszyklus- und Benennungskollisionen erfordern weiterhin Aufmerksamkeit in gleichzeitigen Workloads.
Leitfaden: Verwenden db.Conn(ctx) Sie es, um verwandte Operationen an eine Verbindung zu pinnen oder Operationen in einer Transaktion zu verpacken. Verwenden Sie globale temporäre Tabellen nur, wenn Sicht über mehrere Sitzungen erforderlich ist.
Für Implementierungsmuster siehe Temporäre Tabellen und gespeicherte Prozeduren, Verbindungspooling und Temporäre Tabelle nicht gefunden.
Immer verschlüsselte Einschränkungen
- Massenkopierung mit verschlüsselten Spalten: Der Treiber unterstützt keine Massenkopieroperationen bei Tabellen mit immer verschlüsselten Spalten.
- Sichere Enklaven: Der Treiber unterstützt Always Encrypted mit sicheren Enklaven nicht.
-
Provider-Registrierung: Sie müssen das Key Provider-Paket (
localcert,akv) als Nebeneffekt-Import importieren. Ohne sie kann der Treiber keine Daten entschlüsseln. -
Exakte Parametertypabgleichung: Verschlüsselte Parameter müssen eng mit dem Spaltentyp des SQL Server übereinstimmen. Ein Standard-Go
stringwirdnvarcharzu , was bei spezifischeren verschlüsselten Parametertypen ausfallen kann. -
Verschlüsselt
charundvarcharText: Einfüge und Aktualisierungen gegen verschlüsseltecharodervarcharSpalten sind derzeit begrenzt. Bevorzuge verschlüsseltncharodernvarcharSpalten, wenn du Always Encrypted für Textdaten brauchst.
Ältere SQL Server-Versionen und TLS
Ältere, nicht mehr unterstützte SQL Server-Versionen unterstützen möglicherweise kein TLS 1.2 oder neuer. Beim Verbinden mit diesen Versionen kann encrypt=truedie Verbindung ausfallen, wenn der Server keine kompatible TLS-Version aushandeln kann.
Workaround: Verwenden encrypt=false Sie oder aktualisieren Sie eine unterstützte SQL Server-Version.
Veralteter mssql-Treibername
Der Fahrername mssql (verwendet mit sql.Open("mssql", ...)) ist veraltet. Verwenden Sie sqlserver stattdessen:
// Deprecated
db, err := sql.Open("mssql", connString)
// Recommended
db, err := sql.Open("sqlserver", connString)
Der mssql Treibername ersetzt Parameter-Tokens und wandelt Platzhalter in ?, @p1, und ähnliche @p2 Ordinalnamen um. Der sqlserver Treibername erfordert explizit benannte Parameter und bietet vorhersehbareres Verhalten.
Wenn Sie eine konnektorbasierte sql.OpenDB Nutzung benötigen und das Alt-Abfragetext-Umschreibverhalten vorübergehend erhalten müssen, verwenden NewConnectorWithProcessQueryTextSie . Für neuen Code bevorzugen Sie den sqlserver Treibernamen und explizite Parameter.
Uniqueidentifier-Spalten
Der Treiber gibt standardmäßig Spaltenwerte als rohe uniqueidentifier Arrays zurück.[]byte Verwenden Sie mssql.UniqueIdentifier dies als Scan-Ziel, um standardisierte GUID-formatierte Strings zu erhalten.
Keine ODBC-Kompatibilität
Der Treiber ist eine reine Go-Implementierung und verwendet oder hängt nicht von unixODBC, FreeTDS oder dem Microsoft ODBC-Treiber ab. ODBC-spezifische Funktionen (DSN-Konfiguration, ODBC-Nachverfolgung) sind nicht verfügbar.
Benannte Rohrverbindungen
Benannte Pipe-Verbindungen benötigen möglicherweise spezifische Dateisystemberechtigungen am Pipe-Endpunkt. Unter Linux muss der SMB-Client für den Named Pipe-Zugriff konfiguriert werden.
Schwimmerpräzision
Gos float64 Typ liefert etwa 15–16 signifikante Dezimalziffern. SQL Server decimal und numeric -Typen können bis zu 38 Ziffern Genauigkeit darstellen. Beim Scannen decimal/numeric von Spalten in float64kann ein Präzisionsverlust bei Werten mit mehr als 15 signifikanten Ziffern auftreten.
Workaround: Spalten in decimal eine Dezimalbibliothek / von Drittanbietern wie (numeric) oder string (shopspring/decimal) für präzise Arithmetik einscannen github.com/shopspring/decimalcockroachdb/apdgithub.com/cockroachdb/apd und verwenden. Für Muster siehe Datentypabbildungen.