go-mssqldb Beperkingen

Dit artikel somt bekende beperkingen en beperkingen van de go-mssqldb driver op.

LastInsertId wordt niet ondersteund

De go-mssqldb driver ondersteunt de database/sqlResult.LastInsertId() methode niet. Het aanroepen geeft een foutmelding:

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

Oplossing: Gebruik een OUTPUT clausule in de INSERT instructie of query SCOPE_IDENTITY() apart.

Multiple Active Result Sets (MARS) worden niet ondersteund

De bestuurder ondersteunt MARS niet. Elke verbinding kan slechts één actieve query of instructie tegelijk hebben. Als je gelijktijdige queries moet uitvoeren, gebruik dan aparte verbindingen van de pool.

Tijdelijke tabelscope met verbindingspooling

Temporeel tabelgedrag volgt de SQL Server scopingregels, maar verbindingspooling verandert hoe dat gedrag in applicatiecode verschijnt:

  • Lokale tijdelijke tabellen (#name) zijn scoped naar één sessie (verbinding).
  • Globale tijdelijke tabellen (##name) zijn zichtbaar voor andere sessies terwijl de aanmakende sessie open blijft.

Met database/sql, gescheiden db.Exec en db.Query gesprekken kunnen verschillende gepoolde verbindingen gebruiken. Een lokale tijdelijke tabel die in één gesprek is aangemaakt, is niet zichtbaar in de volgende oproep wanneer die volgende oproep op een andere verbinding draait.

Voor globale tijdelijke tabellen werkt zichtbaarheid over verbindingen zoals verwacht, maar lifecycle en naamgeving botsingen vereisen nog steeds aandacht in gelijktijdige workloads.

Richtlijnen: Gebruik db.Conn(ctx) om gerelateerde bewerkingen aan één verbinding vast te pinnen, of om bewerkingen in een transactie te wikkelen. Gebruik globale tijdelijke tabellen alleen wanneer cross-session zichtbaarheid vereist is.

Voor implementatiepatronen, zie Tijdelijke tabellen en opgeslagen procedures, Verbindingspooling en Tijdelijke tabel niet gevonden.

Altijd versleutelde beperkingen

  • Massakopiëren met versleutelde kolommen: De driver ondersteunt geen bulkkopiebewerkingen op tabellen met Altijd Versleutelde kolommen.
  • Veilige enclaves: De driver ondersteunt Always Encrypted niet met beveiligde enclaves.
  • Providerregistratie: Je moet het key provider-pakket (localcert, akv) importeren als een neveneffectimport. Zonder die data kan de driver geen data ontsleutelen.
  • Exacte parametertype-matching: Versleutelde parameters moeten nauw overeenkomen met het kolomtype van SQL Server. Een standaard Go string wordt nvarchar, wat kan falen tegen meer specifieke versleutelde parametertypes.
  • Versleuteld char en varchar tekst: Inserts en updates tegen versleutelde char of varchar kolommen zijn momenteel beperkt. Geef de voorkeur aan versleutelde nchar of nvarchar kolommen wanneer je Always Encrypted nodig hebt voor tekstgegevens.

Oudere SQL Server-versies en TLS

Oudere, niet meer ondersteunde SQL Server-versies ondersteunen mogelijk geen TLS 1.2 of later. Bij het verbinden met deze versies met encrypt=true, kan de verbinding mislukken als de server geen compatibele TLS-versie kan onderhandelen.

Oplossing: Gebruik encrypt=false of upgrade naar een ondersteunde SQL Server-versie.

Verouderde mssql-drivernaam

De bestuurdersnaam mssql (gebruikt met sql.Open("mssql", ...)) is verouderd. Gebruik sqlserver in plaats daarvan:

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

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

De mssql drivernaam voert parametertokenvervanging uit, waarbij tijdelijke aanduidingen worden omgezet ? in @p1, @p2, en vergelijkbare ordinaalnamen. De sqlserver drivernaam vereist expliciete benoemde parameters en biedt voorspelbaarder gedrag.

Als je connector-gebaseerd sql.OpenDB gebruik nodig hebt en het oude query-tekstherschrijfgedrag tijdelijk moet behouden, gebruik NewConnectorWithProcessQueryTextdan . Voor nieuwe code geef je de voorkeur aan de sqlserver drivernaam en expliciete parameters.

Kolommen met unieke identificatie

De driver geeft standaard kolomwaarden terug uniqueidentifier als ruwe []byte arrays. Gebruik mssql.UniqueIdentifier als scanbestemming om standaard GUID-geformatteerde strings te krijgen.

Geen ODBC-compatibiliteit

De driver is een pure Go-implementatie en gebruikt of is niet afhankelijk van unixODBC, FreeTDS of de Microsoft ODBC Driver. ODBC-specifieke functies (DSN-configuratie, ODBC-tracing) zijn niet beschikbaar.

Benoemde pijpverbindingen

Benoemde pipe-verbindingen kunnen specifieke bestandssysteemrechten op het pipe-eindpunt vereisen. Op Linux moet de SMB-client worden geconfigureerd voor named pipe-toegang.

Vlotterprecisie

Het type van Go float64 levert ongeveer 15-16 significante decimale cijfers op. SQL Server's decimal en numeric types kunnen tot 38 cijfers precisie weergeven. Bij het scannen decimal/numeric van kolommen in float64kan precisieverlies optreden voor waarden met meer dan 15 significante cijfers.

Oplossing: Scan decimal/numeric kolommen in string en gebruik een decimale bibliotheek van shopspring/decimal derden zoals (github.com/shopspring/decimal) of cockroachdb/apd (github.com/cockroachdb/apd) voor precieze rekenkunde. Voor patronen, zie Data type mappings.