Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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 conexão pode ter apenas uma consulta ou instrução ativa por vez. Se precisar rodar consultas simultâneas, use conexões separadas do pool.
Escopo temporário de tabela com pooling de conexão
O comportamento temporário de tabelas segue as regras de escopo do SQL Server, mas o agrupamento de conexões muda a forma como esse comportamento aparece no código da aplicação:
- Tabelas temporárias locais (
#name) têm escopo para uma sessão (conexã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, chamadas separadas db.Execdb.Query e podem usar conexões pooled diferentes. Uma tabela temporária local criada em uma chamada não é visível na próxima chamada quando essa próxima chamada roda em uma conexão diferente.
Para tabelas temporárias globais, a visibilidade entre conexões funciona como esperado, mas 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 a uma conexão, ou envolver operações em uma 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, Pool de conexão e Tabela temporária não encontrada.
Restrições Always Encrypted
- Cópia em massa com colunas criptografadas: 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 Always Encrypted com enclaves seguros.
-
Registro de provedor: Você deve importar o pacote de provedores de chave (
localcert,akv) como uma importação por efeito colateral. Sem ele, o driver não pode descriptografar dados. -
Correspondência exata do tipo de parâmetro: Parâmetros criptografados devem corresponder de perto ao tipo de coluna do SQL Server. Um Go
stringpadrão passa a sernvarchar, que pode falhar contra tipos de parâmetros criptografados mais específicos. -
Criptografado
charevarchartexto: Inserções e atualizações contra colunas ou criptografadascharvarcharsão atualmente limitadas. Prefira criptografadoncharounvarcharcolunas quando precisar de Sempre Criptografado 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 versões posteriores. Ao conectar a essas versões com encrypt=true, a conexã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 do driver mssql obsoleto
O nome mssql do driver (usado com sql.Open("mssql", ...)) está obsoleto. Em vez disso, use sqlserver :
// 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 ? placeholders para @p1, @p2, e nomes ordinais similares. O nome do sqlserver driver exige parâmetros nomeados explícitos e proporciona um comportamento mais previsível.
Se você precisar de uso baseado sql.OpenDB em conectores e precisar 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 uniqueidentifier.
O driver retorna uniqueidentifier valores de coluna como arrays brutos []byte por padrão. Use mssql.UniqueIdentifier como destino de varredura para obter strings padrão formatadas por GUID.
Sem compatibilidade ODBC
O driver é uma implementação puramente do Go e não usa nem depende do unixODBC, FreeTDS ou do driver Microsoft ODBC. Recursos específicos do ODBC (configuração DSN, rastreamento ODBC) não estão disponíveis.
Conexões de tubulação nomeadas
Conexões de pipe nomeadas podem exigir permissões específicas do sistema de arquivos no endpoint do pipe. No Linux, o cliente SMB deve ser configurado para acesso por pipe nomeado.
Precisão de flutuação
O tipo do float64 Go fornece aproximadamente 15-16 dígitos decimais significativos. SQL Server decimal e numeric tipos podem representar até 38 dígitos de precisão. Ao escanear decimal/numeric colunas para float64, pode ocorrer perda de precisão para valores com mais de 15 dígitos significativos.
Solução alternativa: Escaneie 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.