Portanto, determinei que o comportamento errático do meu SQL Server é devido à configuração padrão do .Net SqlClient Data Provider de SET ARITHABORT OFF
. Com isso dito, li vários artigos que debatem a melhor maneira de implementar isso. Para mim, eu só quero uma maneira fácil porque o SQL Server está sofrendo e meu ajuste de consulta não transcendeu totalmente o aplicativo (e, obviamente, adicionar o SET
em um sp NÃO FUNCIONA).
No brilhante artigo de Erland Sommarskog sobre o assunto, ele basicamente sugere adotar a abordagem segura alterando o aplicativo para emitir SET ARITHABORT ON
para a conexão. No entanto, nesta resposta de uma pergunta dba.stackexchange , Solomon Rutzky oferece uma abordagem em toda a instância e em todo o banco de dados.
Quais ramificações estou perdendo aqui com a configuração dessa instância? Como eu vejo ... como o SSMS tem isso definido ON
por padrão, não vejo nenhum mal em definir isso ON
em todo o servidor para todas as conexões. No final das contas, só preciso que esse SQL Server funcione acima de tudo.
Existem alguns padrões que existem simplesmente porque ninguém sabe realmente qual seria o efeito de alterá-los. Por exemplo, o agrupamento de nível de instância padrão ao instalar em um sistema que usa "inglês dos EUA" como idioma do sistema operacional é
SQL_Latin1_General_CP1_CI_AS
. Isso não faz sentido, pois osSQL_*
agrupamentos são para compatibilidade anterior ao SQL Server 2000. A partir do SQL Server 2000, você pode escolher um agrupamento do Windows e, portanto, o padrão para sistemas em inglês dos EUA deve ter sido alterado paraLatin1_General_CI_AS
. MAS, acho que ninguém na Microsoft sabe realmente qual será o impacto em todos os vários subsistemas potenciais e procedimentos armazenados do sistema, etc.Portanto, não estou ciente de nenhum impacto negativo específico de defini-lo como ON como um padrão de banco de dados ou mesmo em toda a instância. Ao mesmo tempo, não testei. Mas mesmo se eu tivesse testado, ainda posso não usar os mesmos caminhos de código que seu aplicativo, então isso é algo que você realmente precisa testar em seu ambiente. Defina para
ON
no nível da instância em seus ambientes de desenvolvimento e controle de qualidade e veja como isso funciona por um mês ou dois. Em seguida, habilite-o em Staging / UAT. Se tudo continuar indo bem por várias semanas, passe essa alteração de configuração para Produção. A chave é dar o máximo de tempo possível para testar vários caminhos de código que não são atingidos diariamente. Alguns são atingidos semanalmente ou meses ou anualmente. Alguns caminhos de código são atingidos apenas pelo suporte, ou algum relatório ad hoc ou proc de manutenção que alguém criou anos atrás e nunca lhe contou e só é usado em intervalos aleatórios (nah, isso nunca acontece ;-).Então, fiz alguns testes em uma instância que ainda tem a configuração padrão de "opções do usuário", pois nunca a alterei.
Observe:
@@OPTIONS
/'user options'
é um valor com máscara de bitsARITHABORT ON
CONFIGURAR
Testei com SQLCMD (que usa ODBC) e LINQPad (que usa .NET SqlClient):
(o
^
é o caractere de continuação da linha do DOS; o.
da última linha é apenas para forçar a linha extra para facilitar a cópia e colagem)No LINQPad:
TESTE 1: Antes
SQLCMD retorna:
O LINQPad retorna:
ALTERAR OPÇÃO DE CONEXÃO PADRÃO:
O T-SQL a seguir habilita
ARITHABORT
sem remover nenhuma outra opção que possa ser definida e sem alterar nada seARITHABORT
já estiver definido no valor de máscara de bits.TESTE 2: Depois
SQLCMD retorna:
O LINQPad retorna:
Conclusão
Dado que:
ARITHABORT OFF
ARITHABORT ON
OFF
ARITHABORT
, portanto, eles aceitam a configuração padrãoSugiro alterar as opções de conexão padrão em toda a instância (como mostrado acima). Isso seria menos intrusivo do que atualizar o aplicativo. Eu só atualizaria o aplicativo se você encontrar um problema ao alterar a configuração de toda a instância.
PS Eu fiz um teste simples com alteração
tempdb
e não alteração da configuração de toda a instância e não pareceu funcionar.