Go-mssqldb Limitações

Este artigo lista limitações e restrições conhecidas do go-mssqldb driver.

LastInsertId não é suportado

O go-mssqldb driver não suporta o database/sqlResult.LastInsertId() método. Chamá-la retorna um erro:

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

Solução alternativa: Use uma OUTPUT cláusula na INSERT instrução ou consulta SCOPE_IDENTITY() separadamente.

Múltiplos Conjuntos de Resultados Ativos (MARS) não são suportados

O driver não suporta MARS. Cada ligação pode ter apenas uma consulta ou instrução ativa de cada vez. Se precisares de fazer consultas simultâneas, usa ligações separadas do pool.

Âmbito temporário de tabela com pooling de ligações

O comportamento temporário das tabelas segue as regras de alcance do SQL Server, mas o agrupamento de ligações altera a forma como esse comportamento aparece no código da aplicação:

  • Tabelas temporárias locais (#name) têm âmbito para uma sessão (ligação).
  • Tabelas temporárias globais (##name) são visíveis para outras sessões enquanto a sessão de criação permanece aberta.

Com database/sql, as chamadas db.Exec separadas db.Query podem usar ligações agrupadas diferentes. Uma tabela temporária local criada numa chamada não é visível na chamada seguinte quando essa chamada seguinte é executada numa ligação diferente.

Para tabelas temporárias globais, a visibilidade entre ligações funciona como esperado, mas as colisões do ciclo de vida e de nomeação ainda precisam de cuidados em cargas de trabalho concorrentes.

Orientação: Use db.Conn(ctx) para fixar operações relacionadas numa ligação, ou envolver operações numa transação. Use tabelas temporárias globais apenas quando for necessária visibilidade entre sessões.

Para padrões de implementação, veja Tabelas e procedimentos armazenados temporários, Pooling de conexões e Tabela temporária não encontrada.

Restrições sempre encriptadas

  • Cópia em massa com colunas encriptadas: O driver não suporta operações de cópia em massa em tabelas com colunas Always Crypted.
  • Enclaves seguros: O driver não suporta o Always Encrypted com enclaves seguros.
  • Registo do fornecedor: Deve importar o pacote do fornecedor chave (localcert, akv) como uma importação por efeito secundário. Sem ele, o driver não consegue desencriptar dados.
  • Correspondência exata do tipo de parâmetro: Os parâmetros encriptados devem corresponder de perto ao tipo de coluna do SQL Server. Um Go string por defeito torna-se nvarchar, que pode falhar contra tipos de parâmetros encriptados mais específicos.
  • Encriptado char e varchar texto: Inserções e atualizações contra colunas encriptadas charvarchar são atualmente limitadas. Prefira encriptação nchar ou nvarchar colunas quando precisar de Sempre Encriptado para dados de texto.

Versões antigas do SQL Server e TLS

Versões antigas do SQL Server fora de suporte podem não suportar TLS 1.2 ou posteriores. Ao ligar a estas versões com encrypt=true, a ligação pode falhar se o servidor não conseguir negociar uma versão TLS compatível.

Solução alternativa: Use encrypt=false ou atualize para uma versão suportada do SQL Server.

Nome de driver mssql obsoleto

O nome mssql do driver (usado com sql.Open("mssql", ...)) está obsoleto. Use sqlserver em vez disso:

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

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

O nome do mssql driver realiza a substituição de tokens de parâmetro, convertendo ? marcadores de posição para @p1, @p2, e nomes ordinais semelhantes. O nome do sqlserver driver requer parâmetros explícitos e proporciona um comportamento mais previsível.

Se precisar de utilização baseada sql.OpenDB em conectores e tiver de preservar temporariamente o comportamento legado de reescrita de texto de consulta, use NewConnectorWithProcessQueryText. Para código novo, prefira o nome do sqlserver driver e parâmetros explícitos.

colunas de identificador único

O driver devolve uniqueidentifier os valores das colunas como arrays brutos []byte por defeito. Use mssql.UniqueIdentifier como destino de varrimento para obter cadeias de caracteres formatadas por GUID.

Sem compatibilidade ODBC

O driver é uma implementação pura do Go e não usa nem depende do unixODBC, FreeTDS ou do driver Microsoft ODBC. Funcionalidades específicas do ODBC (configuração DSN, rastreio ODBC) não estão disponíveis.

Ligações de tubos nomeadas

Ligações de pipe nomeadas podem exigir permissões específicas do sistema de ficheiros no endpoint do pipe. No Linux, o cliente SMB tem de ser configurado para acesso por pipe nomeado.

Precisão do flutuador

O tipo do float64 Go fornece aproximadamente 15-16 dígitos decimais significativos. Os decimal SQL Server e numeric tipos podem representar até 38 dígitos de precisão. Ao digitalizar decimal/numeric colunas para float64, pode ocorrer perda de precisão para valores com mais de 15 dígitos significativos.

Solução alternativa: Digitalize decimal/numeric colunas e string use uma biblioteca decimal de terceiros como shopspring/decimal (github.com/shopspring/decimal) ou cockroachdb/apd (github.com/cockroachdb/apd) para cálculos precisos. Para padrões, veja Mapeamentos de tipos de dados.