Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento článek uvádí známá omezení a omezení go-mssqldb ovladače.
LastInsertId není podporován
Ovladač go-mssqldb tuto database/sqlResult.LastInsertId() metodu nepodporuje. Zavolání vrátí chybu:
LastInsertId is not supported. Please use the OUTPUT clause or add
'select ID = convert(bigint, SCOPE_IDENTITY())' to the end of your query.
Řešení: Použijte klauzuli OUTPUT ve INSERT výroku nebo dotazu SCOPE_IDENTITY() zvlášť.
Multiple Active Result Sets (MARS) není podporován
Ovladač nepodporuje MARS. Každé spojení může mít v daném okamžiku pouze jeden aktivní dotaz nebo příkaz. Pokud potřebujete spouštět souběžné dotazy, použijte samostatná připojení od poolu.
Rozsah dočasné tabulky s poolováním spojení
Chování dočasné tabulky se řídí pravidly SQL Server scoping, ale pooling spojení mění, jak se toto chování projevuje v aplikačním kódu:
- Lokální dočasné tabulky (
#name) jsou omezeny na jednu relaci (připojení). - Globální dočasné tabulky (
##name) jsou viditelné pro jiné relace, zatímco vytvářecí relace zůstává otevřená.
S , oddělené database/sql a db.Exec volání, db.Querymohou používat různé sdílené spojení. Lokální dočasná tabulka vytvořená v jednom hovoru není viditelná v dalším hovoru, když ten další hovor běží na jiném připojení.
U globálních dočasných tabulek funguje přehled napříč spojeními podle očekávání, ale kolize životního cyklu a pojmenování stále vyžadují pozornost při současných pracovních zátěžích.
Doporučení: Použijte db.Conn(ctx) k připnutí souvisejících operací k jednomu spojení nebo k zabalení operací v transakci. Používejte globální dočasné tabulky pouze tehdy, když je potřeba viditelnost mezi relacemi.
Pro implementační vzory viz Dočasné tabulky a uložené procedury, Poolování spojení a Dočasná tabulka nenalezena.
Vždy šifrovaná omezení
- Hromadné kopírování se šifrovanými sloupci: Ovladač nepodporuje hromadné kopírování v tabulkách s Always Encrypted sloupci.
- Zabezpečené enklávy: Ovladač nepodporuje Always Encrypted se zabezpečenými enklávami.
-
Registrace poskytovatele: Musíte importovat balíček klíče poskytovatele (
localcert,akv) jako vedlejší efekt importu. Bez něj ovladač nemůže data dešifrovat. -
Přesné porovnání typů parametrů: Šifrované parametry musí přesně odpovídat typu sloupce SQL Server. Výchozí Go
stringse stává ,nvarcharcož může selhat proti specifickějším typům šifrovaných parametrů. -
Šifrované a
chartextovévarchar: Vklady a aktualizace vůči šifrovanýmcharnebovarcharsloupcovým prvkům jsou v současnosti omezené. Raději šifrujtencharnvarcharnebo používejte sloupce, když potřebujete Always Encrypted pro textová data.
Starší verze SQL Server a TLS
Starší, mimo podporu podporované verze SQL Server nemusí podporovat TLS 1.2 nebo novější. Při připojení k těmto verzím s encrypt=true, může připojení selhat, pokud server nedokáže vyjednat kompatibilní verzi TLS.
Řešení: Použijte nebo encrypt=false upgradujte na podporovanou verzi SQL Server.
Zastaralý název ovladače mssql
Název mssql ovladače (použitý s sql.Open("mssql", ...)) je zastaralý. Místo toho použijte sqlserver :
// Deprecated
db, err := sql.Open("mssql", connString)
// Recommended
db, err := sql.Open("sqlserver", connString)
Název mssql ovladače provádí nahrazení tokenů parametrů, převádí ? zástupné znaky na @p1, @p2, a podobné ordinální názvy. Název ovladače sqlserver vyžaduje explicitně pojmenované parametry a poskytuje předvídatelnější chování.
Pokud potřebujete použití založené sql.OpenDB na konektorech a musíte dočasně zachovat starší chování přepisování dotazového textu, použijte NewConnectorWithProcessQueryText. Pro nový kód preferujte sqlserver název ovladače a explicitní parametry.
sloupce uniqueidentifier
Ovladač vrací uniqueidentifier sloupcové hodnoty jako surová []byte pole ve výchozím nastavení. Použijte mssql.UniqueIdentifier to jako cíl skenování pro získání standardních řetězců formátovaných s GUID.
Žádná kompatibilita s ODBC
Ovladač je čistě implementace v Go a nepoužívá ani nezávisí na unixODBC, FreeTDS ani Microsoft ODBC ovladači. Specifické funkce ODBC (konfigurace DSN, trasování ODBC) nejsou dostupné.
Pojmenované potrubní spojení
Pojmenovaná připojení potrubí mohou vyžadovat specifická oprávnění souborového systému na koncovém bodu potrubí. Na Linuxu musí být SMB klient nakonfigurován pro přístup pojmenovaným potrubím.
Přesnost plováku
Go float64 typ obsahuje přibližně 15–16 znakových desetinných číslic. Typy decimal a SQL Server mohou numeric reprezentovat až 38 číslic přesnosti. Při skenování decimal/numericsloupců do float64, může nastat ztráta přesnosti u hodnot s více než 15 významnými číslicemi.
Řešení: Naskenujte decimal/numeric sloupce do string a použijte třetí stranu v desetinné knihovně, jako shopspring/decimal je (github.com/shopspring/decimal) nebo cockroachdb/apd (github.com/cockroachdb/apd), pro přesnou aritmetiku. Pro vzory viz mapování datových typů.