Eu gostaria, do TSQL, de usar uma visão para extrair dados de uma tabela, produzi-los com BCP e, em seguida, usar ferramentas não terceirizadas para ZIP com uma senha e criptografia AES. Opcionalmente, eu poderia usar uma ferramenta de terceiros que não exija instalação local (exe autônomo em uma unidade de rede, por exemplo).
Eu tentei usar sp_OA*
, mas encontrei este post dizendo que eles eram recursos com bugs, vazamento de memória e obsoletos . Então, estou procurando alternativas, se houver alguma. Todas as pesquisas do Google retornaram às mesmas soluções: 7zip, Winrar ou sp_OA*
.
Não quero o código, apenas o nome dos recursos ou métodos que podem me ajudar, para saber o que procurar.
MSSQL2008 e superior. Pode ser uma solução Powershell. Não SSIS, se possível. Só para constar, é atualizar diariamente um software com dados atuais, pois não tem acesso direto à fonte.
Se o 7zip for o melhor/único caminho a percorrer, terei uma tonelada de papelada para preencher e reuniões para comparecer para justificar a instalação de software que não seja de banco de dados em um servidor SQL. :-)
Sim, fique longe dos
sp_OA*
procedimentos de Automação OLE.Se você quiser/precisar lidar com isso apenas dentro do SQL Server, poderá fazê-lo usando o SQLCLR, que substitui os
sp_OA*
procedimentos de automação OLE. E se você não estiver usandoxp_cmdshell
para mais nada, não há necessidade de ativá-lo apenas para isso (embora, para ser justo, se estiver usando o SQL Agent, uma etapa do CMD seria capaz de executar BCP e/ou 7zip sem a necessidade de habilitarxp_cmdshell
).Com o SQLCLR você pode:
criptografar com uma senha (consulte RijndaelManaged e AesManaged ). Enquanto você especificou o AES, a documentação do MSDN para AesManaged afirma:
A diferença é se você estiver usando SQL Server 2005, 2008 ou 2008 R2. Essas versões são limitadas ao uso do .NET 3.5, e a documentação do MSDN para
AesManaged
(para essa versão) afirma que ele possui um Host Protection Attribute (HPA), o que significa que qualquer assembly usando essa classe deve ser marcado comoPERMISSION_SET = UNSAFE
, enquantoRijndaelManaged
não tem esse problema e pode ser usado em umaEXTERNAL_ACCESS
montagem. No entanto, parece que a documentação deAesManaged
mostra que, começando no .NET Framework versão 4.0 (SQL Server 2012, 2014 e 2016 usam .NET Framework 4.0 e mais recente -- atualmente até 4.6), a observação sobre o HPA foi removida . Mesmo queUNSAFE
seja aceitável, observe que o HPA específico é MayLeakOnAbort , que significa "pode vazar memória se a operação for encerrada".Nesta configuração, a senha faz parte da criptografia, não da compactação. Portanto, você tem um arquivo zip contendo um arquivo criptografado ou um arquivo criptografado contendo o arquivo zip. O método anterior fornece um arquivo que pode ser descompactado por qualquer pessoa, mas lido apenas por alguém com a senha correta. O último método requer saber a senha para obter o arquivo compactado e também permite uma melhor compactação, pois a compactação será feita em um arquivo de texto (com maior probabilidade de padrões compressíveis).
Embora ainda não tenha implementado os algoritmos de criptografia, codifiquei a exportação de arquivo (de qualquer consulta aleatória) e GZip/GZunzip no SQLCLR e posso afirmar que eles são executados com eficiência ou, pelo menos, podem ser eficientes (e podem também ser feito para ser ineficiente). Com isso, quero dizer que os usei para extrair consultas produzindo arquivos de texto de 5 GB e GZipping esses arquivos de texto de 5 GB, e a memória nunca foi afetada negativamente, pois ambas as operações são transmitidas. Observe que a classe GZipStream fornecida pelo .NET não oferece suporte ao formato Zip64 e, portanto, está limitada a 4 GB de dados de origem.
Para quem estiver interessado em funções SQLCLR pré-construídas para fazer a extração e compactação (as que mencionei acima), elas estão disponíveis na biblioteca SQL# (da qual sou o autor). Observe que:
GZipStream
classe, tive que incorporar uma biblioteca de terceiros que suporta Zip64.Eu faço isso usando
xp_cmdshell
. Você pode exportar dados do trabalho SQL e compactar usando esse procedimento armazenado. A melhor maneira é executar um arquivo bat para zip.OBSERVAÇÃO: para usar esse sp você precisa que ele seja permitido (no nível do SQL Server) e você deve ter permissões para executá-lo.