我想从 TSQL 中使用视图从表中提取数据,使用 BCP 输出,然后使用非 3rd 方工具使用密码和 AES 加密对其进行压缩。或者,我可以使用不需要本地安装的第 3 方工具(例如,网络驱动器上的独立 EXE)。
我尝试使用sp_OA*
,但发现这篇文章说它们有错误、内存泄漏和不推荐使用的功能。所以我正在寻找替代品,如果有的话。Google 搜索都返回相同的解决方案:7zip、Winrar 或sp_OA*
.
我不想要代码,只想要可以帮助我的功能或方法的名称,所以我会知道要搜索什么。
MSSQL2008 及更高版本。可以是 Powershell 解决方案。如果可能,不要使用 SSIS。作为记录,它是每天使用当前数据更新软件,因为它无法直接访问源。
如果 7zip 是最好的/唯一的方法,我将需要填写大量的文书工作并参加会议以证明在 SQL 服务器上安装非数据库软件的合理性。:-)
是的,远离
sp_OA*
OLE 自动化程序。如果您想/需要纯粹在 SQL Server 中处理此问题,则可以使用 SQLCLR 来完成,它取代了
sp_OA*
OLE 自动化过程。如果您不使用xp_cmdshell
其他任何东西,则无需为此启用它(尽管公平地说,如果使用 SQL 代理,则 CMD 步骤将能够执行 BCP 和/或 7zip 而无需启用xp_cmdshell
)。使用 SQLCLR,您可以:
使用密码加密(请参阅RijndaelManaged和AesManaged)。虽然您确实指定了 AES,但 AesManaged 的 MSDN 文档指出:
不同之处在于您使用的是 SQL Server 2005、2008 还是 2008 R2。这些版本仅限于使用 .NET 3.5,并且
AesManaged
(针对该版本)的 MSDN 文档声明它具有主机保护属性 (HPA),这意味着使用该类的任何程序集都必须标记为PERMISSION_SET = UNSAFE
,而RijndaelManaged
没有问题并且可以在EXTERNAL_ACCESS
程序集中使用。但是,似乎文档AesManaged
显示,从 .NET Framework 4.0 版开始(SQL Server 2012、2014 和 2016 使用 .NET Framework 4.0 和更新版本——目前最高为 4.6),有关 HPA 的注释已被删除. 即使UNSAFE
可以接受,请注意特定的 HPA 是MayLeakOnAbort,这意味着“如果操作终止,可能会泄漏内存”。在此设置中,密码是加密的一部分,而不是压缩的一部分。因此,您要么有一个包含加密文件的 zip 文件,要么有一个包含 zip 文件的加密文件。前一种方法为您提供了一个文件,任何人都可以解压缩,但只能由具有正确密码的人读取。后一种方法需要知道密码才能获得压缩文件,并且还允许更好的压缩,因为压缩将在文本文件上完成(压缩模式的可能性更大)。
虽然我还没有实现加密算法,但我已经在 SQLCLR 中对文件导出(任何随机查询)和 GZip/GZunzip 进行了编码,并且可以声明它们确实有效地运行,或者至少可以变得高效(并且可以也会变得低效)。我的意思是我已经使用它们来提取产生 5 GB 文本文件的查询,并对那些 5 GB 文本文件进行 GZipping,并且由于这两个操作都是流式传输的,因此内存从未受到不利影响。请注意,.NET 提供的 GZipStream 类不支持 Zip64 格式,因此限制为 4 GB 的源数据。
对于对预先构建的 SQLCLR 函数进行提取和压缩(我上面提到的那些)感兴趣的任何人,它们都可以在SQL#库(我是该库的作者)中获得。请注意:
GZipStream
该类的 4 GB 限制,我必须合并一个支持 Zip64 的第三方库。我这样做是使用
xp_cmdshell
. 您可以从 SQL 作业中导出数据,然后可以使用该存储过程进行压缩。最好的方法是为 zip 运行一个 bat 文件。备注:要使用该 sp,您需要允许它(在 SQL Server 级别)并且您必须具有运行它的权限。