go-mssqldb Begränsningar

Den här artikeln listar kända begränsningar och begränsningar för drivrutinen go-mssqldb .

LastInsertId stöds inte

Drivrutinen go-mssqldb stöder inte metoden database/sqlResult.LastInsertId() . Att anropa den ger ett fel:

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

Lösning: Använd en OUTPUT klausul i satsen INSERT eller fråga SCOPE_IDENTITY() separat.

Multiple Active Result Sets (MARS) stöds inte

Drivrutinen stödjer inte MARS. Varje anslutning kan ha endast en aktiv fråga eller ett uttalande åt gången. Om du behöver köra samtidiga frågor, använd separata anslutningar från poolen.

Tillfällig tabellomfång med anslutningspoolning

Temporärt tabellbeteende följer SQL Server begränsningsregler, men anslutningspoolning ändrar hur det beteendet visas i applikationskoden:

  • Lokala temporära tabeller (#name) är begränsade till en session (anslutning).
  • Globala temporära tabeller (##name) är synliga för andra sessioner medan den skapande sessionen förblir öppen.

Med database/sql, separata db.Exec och db.Query samtal kan använda olika poolade anslutningar. En lokal tillfällig tabell som skapats i ett samtal är inte synlig i nästa samtal när nästa samtal körs på en annan anslutning.

För globala tillfälliga tabeller fungerar synligheten över anslutningar som förväntat, men livscykel- och namnkollisioner kräver fortfarande omsorg i samtidiga arbetsbelastningar.

Vägledning: Använd db.Conn(ctx) för att fästa relaterade operationer till en anslutning, eller wrappa operationer i en transaktion. Använd globala temporära tabeller endast när synlighet över sessioner krävs.

För implementeringsmönster, se Tillfälliga tabeller och lagrade procedurer, Anslutningspooling och Temporär tabell ej hittad.

Alltid krypterade begränsningar

  • Bulkkopiering med krypterade kolumner: Drivrutinen stöder inte masskopiering av tabeller med Alltid krypterade kolumner.
  • Säkra enklaver: Drivrutinen stöder inte Alltid Krypterat med säkra enklaver.
  • Leverantörsregistrering: Du måste importera nyckelleverantörspaketet (localcert, akv) som en bieffektsimport. Utan den kan drivrutinen inte dekryptera data.
  • Exakt parametertypmatchning: Krypterade parametrar måste noggrant matcha kolumntypen i SQL Server. En standard-Go string blir nvarchar, vilket kan misslyckas mot mer specifika krypterade parametertyper.
  • Krypterad char och varchar text: Insättningar och uppdateringar mot krypterade char eller varchar kolumner är för närvarande begränsade. Föredra krypterade nchar eller nvarchar kolumner när du behöver Alltid krypterat för textdata.

Äldre SQL Server-versioner och TLS

Äldre, icke-stödda SQL Server-versioner kanske inte stödjer TLS 1.2 eller senare. När man ansluter till dessa versioner med encrypt=true, kan anslutningen misslyckas om servern inte kan förhandla fram en kompatibel TLS-version.

Lösning: Använd encrypt=false eller uppgradera till en stödd SQL Server-version.

Föråldrat mssql-drivrutinsnamn

Förarnamnet mssql (som används med sql.Open("mssql", ...)) är föråldrat. Använd sqlserver i stället:

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

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

Drivrutinsnamnet mssql utför parametertokenersättning och omvandlar ? platshållare till @p1, @p2, och liknande ordningsnamn. Drivrutinsnamnet sqlserver kräver explicita namngivna parametrar och ger mer förutsägbart beteende.

Om du behöver användning baserad på connectors sql.OpenDB och måste tillfälligt bevara det gamla frågetextomskrivningsbeteendet, använd NewConnectorWithProcessQueryText. För ny kod, föredra drivrutinsnamnet sqlserver och tydliga parametrar.

Unika identifierarkolumner

Drivrutinen returnerar uniqueidentifier kolumnvärden som råarrayer []byte som standard. Använd mssql.UniqueIdentifier som skanningsmål för att få standard GUID-formaterade strängar.

Ingen ODBC-kompatibilitet

Drivrutinen är en ren Go-implementation och använder inte eller är beroende av unixODBC, FreeTDS eller Microsoft ODBC-drivrutinen. ODBC-specifika funktioner (DSN-konfiguration, ODBC-spårning) finns inte tillgängliga.

Namngivna röranslutningar

Namngivna röranslutningar kan kräva specifika filsystembehörigheter på rörändpunkten. På Linux måste SMB-klienten konfigureras för namngiven pipåtkomst.

Flottörprecision

Gos float64 typ ger ungefär 15–16 betydande decimalsiffror. SQL Server decimal och numeric typer kan representera upp till 38 siffror i precision. När man skannar decimal/numeric kolumner in i float64kan precisionsförlust uppstå för värden med fler än 15 signifikanta siffror.

Lösning: Skanna decimal/numeric kolumner i string och använd ett decimalbibliotek från tredje part såsom shopspring/decimal (github.com/shopspring/decimal) eller cockroachdb/apd (github.com/cockroachdb/apd) för exakt aritmetik. För mönster, se Datatypmappningar.