go-mssqldb Ograniczenia

Ten artykuł wymienia znane ograniczenia i ograniczenia sterownika go-mssqldb .

LastInsertId nie jest obsługiwany

Sterownik go-mssqldb nie wspiera database/sqlResult.LastInsertId() tej metody. Wywołanie tego powoduje błąd:

LastInsertId is not supported. Please use the OUTPUT clause or add
'select ID = convert(bigint, SCOPE_IDENTITY())' to the end of your query.

Obejście: Użyj klauzuli OUTPUT w zdaniu INSERT lub zapytaniu SCOPE_IDENTITY() osobno.

Multiple Active Result Sets (MARS) nie jest obsługiwany

Sterownik nie obsługuje MARS. Każde połączenie może mieć tylko jedno aktywne zapytanie lub polecenie w danym momencie. Jeśli musisz uruchamiać zapytania współcześnie, użyj oddzielnych połączeń z puli.

Zakres tabeli tymczasowej z poolingiem połączeń

Tymczasowe zachowanie tabeli podąża za regułami zakresu SQL Server, ale pula połączeń zmienia sposób, w jaki to zachowanie pojawia się w kodzie aplikacji:

  • Lokalne tabele tymczasowe (#name) są ograniczone do jednej sesji (połączenia).
  • Globalne tabele tymczasowe (##name) są widoczne dla innych sesji, podczas gdy sesja tworząca pozostaje otwarta.

Przy , oddzielne database/sqldb.Exec i db.Query wywołania mogą używać różnych połączeń w grupie. Lokalna tabela tymczasowa utworzona w jednym połączeniu nie jest widoczna w następnym, gdy kolejne połączenie działa na innym połączeniu.

W globalnych tabelach tymczasowych widoczność między połączeniami działa zgodnie z oczekiwaniami, ale kolizje cyklu życia i nazewnictwa nadal wymagają uwagi przy jednoczesnych obciążeniach.

Wskazówki: Użyj do db.Conn(ctx) przypinania powiązanych operacji do jednego połączenia lub operacji wrap w transakcji. Globalne tabele tymczasowe używaj tylko wtedy, gdy wymagana jest widoczność między sesjami.

Wzorce implementacyjne można znaleźć w artykule Tabele tymczasowe i procedury przechowywane, Pulowanie połączeń oraz Tabela tymczasowa nie znaleziona.

Ograniczenia zawsze szyfrowane

  • Kopiowanie masowe z zaszyfrowanymi kolumnami: Sterownik nie obsługuje operacji kopiowania masowego w tabelach z kolumnami Always Encrypted (Zawsze szyfrowane).
  • Secure enklavy: Sterownik nie obsługuje Always Encrypted z bezpiecznymi enklawami.
  • Rejestracja dostawcy: Musisz zaimportować pakiet kluczowego dostawcy (localcert, akv) jako import skutku ubocznego. Bez niego sterownik nie może odszyfrować danych.
  • Dokładne dopasowanie typów parametrów: Zaszyfrowane parametry muszą ściśle odpowiadać typowi kolumny SQL Server. Domyślne Go string staje się , nvarcharktóre może zawiódć wobec bardziej specyficznych typów zaszyfrowanych parametrów.
  • Zaszyfrowane i char tekstowevarchar: Obecnie ograniczono wstawianie i aktualizacje względem zaszyfrowanych char lub varchar kolumnowych. Wolej używać zaszyfrowanych nchar lub nvarchar kolumn, gdy potrzebujesz Always Encrypted dla danych tekstowych.

Starsze wersje SQL Server i TLS

Starsze, nieobsługiwane wersje SQL Server mogą nie wspierać TLS 1.2 lub nowszych. Podczas łączenia z tymi wersjami z encrypt=true, połączenie może się zerwać, jeśli serwer nie będzie w stanie wynegocjować kompatybilnej wersji TLS.

Obejście: Użyj encrypt=false lub zaktualizuj wersję do wspieranej wersji SQL Server.

Wycofana nazwa sterownika mssql

Nazwa mssql sterownika (używana z sql.Open("mssql", ...)) jest przestarzała. Użyj sqlserver zamiast tego:

// Deprecated
db, err := sql.Open("mssql", connString)

// Recommended
db, err := sql.Open("sqlserver", connString)

Nazwa sterownika mssql wykonuje zastępowanie tokenów parametrów, konwertując ? zastępcze na @p1, @p2, i podobne nazwy porządkowe. Nazwa sterownika sqlserver wymaga wyraźnie nazwanych parametrów i zapewnia bardziej przewidywalne zachowanie.

Jeśli potrzebujesz zastosowania opartego na sql.OpenDB konektorze i musisz tymczasowo zachować zachowanie przepisywania zapytań w starszym tekście, użyj NewConnectorWithProcessQueryText. W przypadku nowego kodu preferuj sqlserver nazwę sterownika i wyraźne parametry.

kolumny uniqueidentifier

Sterownik domyślnie zwraca uniqueidentifier wartości kolumn jako []byte surowe tablice. Użyj jako mssql.UniqueIdentifier miejsca docelowego skanowania, aby uzyskać standardowe ciągi w formacie GUID.

Brak zgodności z ODBC

Sterownik jest czystą implementacją Go i nie korzysta ani nie zależy od unixODBC, FreeTDS ani sterownika Microsoft ODBC. Funkcje specyficzne dla ODBC (konfiguracja DSN, śledzenie ODBC) nie są dostępne.

Nazwane połączenia rur

Nazwane połączenia potokowe mogą wymagać określonych uprawnień systemu plików na końcu potokowym. Na Linuksie klient SMB musi być skonfigurowany do dostępu do nazwanych potoków.

Precyzja pływania

Typ float64 Go zawiera około 15-16 cyfr znakowych dziesiętnych. Typy decimal i SQL Server mogą numeric reprezentować do 38 cyfr precyzyjności. Podczas skanowania decimal/numeric kolumn do float64, może wystąpić utrata precyzji dla wartości o więcej niż 15 cyfrach istotnych.

Obejście: Przeskanuj decimal/numeric kolumny do string i użyj zewnętrznej biblioteki dziesiętnej, takiej jak shopspring/decimal (github.com/shopspring/decimal) lub cockroachdb/apd (github.com/cockroachdb/apd) do precyzyjnej arytmetyki. Wzorce można znaleźć w odwzorowaniach typów danych.