Estou procurando substituir alguns valores codificados no código CLR (SQL 2012), me deparei com o uso de arquivos de configuração aqui - https://stackoverflow.com/questions/16177769/assembly-configuration-clr-stored-procedure . Algumas respostas disseram que é melhor salvar pares de chave/valor em tabelas em vez de arquivos de configuração, uma das razões é que não era suportado no SQL 2014+.
Nosso desenvolvedor diz que funciona bem no SQL 2014, então não estou preocupado com isso, mas acho que armazenar os valores em uma tabela no banco de dados local seria uma ideia melhor.
- Alguém mais pode confirmar se os arquivos de configuração são ou não suportados no SQL 2014+?
- Existe alguma documentação sobre as melhores práticas para armazenar pares de chave/valor em uma tabela ou algum motivo para não fazê-lo?
Tenho certeza de que o
sqlservr.exe.config
arquivo de configuração funciona no SQL Server 2014, mas levarei alguns minutos para confirmar. Também tenho certeza de que não é "oficialmente" suportado e, portanto, não "recomendado" de usar, mas às vezes acho útil usar e o fiz.Se a localização dos dados deve ou não estar em um arquivo ou tabela de configuração depende muito de quais são as necessidades gerais. Com que frequência os valores serão alterados? Você diz "codificado", mas os valores de pesquisa podem mudar a cada versão, às vezes. Você quer ter que executar uma
UPDATE
instrução ou encontrar uma maneira de incluir a manutenção desse arquivo de configuração em seu processo de compilação (você precisa encontrar uma maneira de garantir que ele esteja sempre lá).Além disso, os valores serão necessários fora do código .NET/SQLCLR? Tê-los em uma tabela os torna mais disponíveis para todas as consultas existentes.
Além disso, haverá necessidade de separação entre bancos de dados para esses valores? Com um arquivo de configuração, ele é compartilhado em todos os domínios de aplicativo para essa instância. Uma tabela de configuração pode ser facilmente colocada em um banco de dados comum (assumindo que vários bancos de dados podem querer os valores) ou colocado em cada banco de dados. Você pode ter separação de valores dentro do arquivo de configuração, mas isso requer nomes diferentes para as chaves, e isso dificulta a padronização dentro do código .NET.
Se fizer sentido o suficiente para ser somente leitura e comum / compartilhado, por que não começar a tentar a abordagem do arquivo de configuração e, se você encontrar algum motivo para que ele não atenda às suas necessidades, basta movê-lo para ser armazenado em um tabela. Afinal, nenhuma das opções exigirá tantas horas de trabalho e a diferença de tempo entre elas é insignificante, portanto, não custará muito se você precisar mudar para a outra abordagem.
NOTAS:
Na pergunta do StackOverflow vinculada a esta pergunta, a resposta do @David afirma que esse arquivo de configuração não está mais funcionando a partir do SQL Server 2014. Acabei de testar e confirmar que ele realmente funciona no SQL Server 2014 e até mesmo no 2016!
Na pergunta do StackOverflow vinculada a esta pergunta, a resposta do @Remus afirma que o armazenamento no banco de dados é preferível devido ao arquivo de configuração estar desconectado do SQL Server e possivelmente não em servidores relacionados ou possivelmente fora de sincronia com eles. Esse ponto não deve ser ignorado, e essas preocupações devem ajudar a equipe a ter uma visão geral de como o aplicativo vive e, portanto, chegar a uma decisão mais informada. No entanto, certamente existem cenários que não têm essas preocupações e que permitem que o processo de compilação garanta que esse arquivo de configuração esteja em cada ambiente, assim como esse processo de compilação faz as mesmas verificações de arquivos de configuração em servidores web etc.
No blog referenciado na resposta de @Remus na pergunta vinculada, o autor menciona um "problema" ao obter erros ao tentar ler AppSettings, e uma solução alternativa é chamada
ConfigurationManager.ConnectionStrings.Count;
. Está correto. No entanto, você não precisa fazer essa ligação toda vez; isso só precisa ser feito uma vez durante a vida útil do App Domain. Portanto, funciona muito bem colocá-lo em um construtor de classe estática da seguinte maneira:E não, você não precisa ter uma
<connectionStrings>
seção em seu arquivo de configuração para que o acima funcione.Essa mesma postagem no blog também menciona que o arquivo de configuração é lido apenas uma vez, quando o domínio do aplicativo é criado e que você precisará reiniciar a instância - ou possivelmente descarregar o domínio do aplicativo - para que as alterações sejam feitas na configuração arquivo após a criação do domínio do aplicativo tornam-se visíveis para seu código. A primeira parte está correta: o arquivo de configuração é carregado uma vez e armazenado em cache durante a vida útil do domínio do aplicativo. No entanto, você não precisa reiniciar a instância para atualizar os valores de configuração, nem mesmo descarregar o domínio do aplicativo. Você só precisa ligar:
Mas não faça isso para cada chamada, a menos que a função ou procedimento armazenado seja executado ocasionalmente. Se isso for algo que será executado pelo menos uma vez por segundo, ou com mais frequência, crie uma função separada ou procedimento armazenado para fazer exatamente essa atualização e executá-la quando necessário.