AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 107366
Accepted
Philippe
Philippe
Asked: 2015-07-18 07:17:27 +0800 CST2015-07-18 07:17:27 +0800 CST 2015-07-18 07:17:27 +0800 CST

导出表格并使用密码压缩

  • 772

我想从 TSQL 中使用视图从表中提取数据,使用 BCP 输出,然后使用非 3rd 方工具使用密码和 AES 加密对其进行压缩。或者,我可以使用不需要本地安装的第 3 方工具(例如,网络驱动器上的独立 EXE)。

我尝试使用sp_OA*,但发现这篇文章说它们有错误、内存泄漏和不推荐使用的功能。所以我正在寻找替代品,如果有的话。Google 搜索都返回相同的解决方案:7zip、Winrar 或sp_OA*.

我不想要代码,只想要可以帮助我的功能或方法的名称,所以我会知道要搜索什么。

MSSQL2008 及更高版本。可以是 Powershell 解决方案。如果可能,不要使用 SSIS。作为记录,它是每天使用当前数据更新软件,因为它无法直接访问源。

如果 7zip 是最好的/唯一的方法,我将需要填写大量的文书工作并参加会议以证明在 SQL 服务器上安装非数据库软件的合理性。:-)

sql-server export
  • 2 2 个回答
  • 2706 Views

2 个回答

  • Voted
  1. Best Answer
    Solomon Rutzky
    2015-07-18T09:08:07+08:002015-07-18T09:08:07+08:00

    是的,远离sp_OA*OLE 自动化程序。

    如果您想/需要纯粹在 SQL Server 中处理此问题,则可以使用 SQLCLR 来完成,它取代了sp_OA*OLE 自动化过程。如果您不使用xp_cmdshell其他任何东西,则无需为此启用它(尽管公平地说,如果使用 SQL 代理,则 CMD 步骤将能够执行 BCP 和/或 7zip 而无需启用xp_cmdshell)。

    使用 SQLCLR,您可以:

    • 也可以从 T-SQL 中进行导出,而不需要弄乱作为外部进程的 BCP(请参阅FileStream)。
    • 压缩文件,作为一个单独的步骤,因为。NET 具有 gzip 和 gunzip 的方法(请参阅GZipStream)。
    • 使用密码加密(请参阅RijndaelManaged和AesManaged)。虽然您确实指定了 AES,但 AesManaged 的​​ MSDN 文档指出:

      AES 算法本质上是具有固定块大小和迭代次数的 Rijndael 对称算法。此类的功能与 RijndaelManaged 类相同,但将块限制为 128 位并且不允许反馈模式。

      不同之处在于您使用的是 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#库(我是该库的作者)中获得。请注意:

    • 虽然有免费版的 SQL#,但这里提到的两个对象DB_BulkExport和File_GZip仅在完整版中可用。
    • 为了克服GZipStream该类的 4 GB 限制,我必须合并一个支持 Zip64 的第三方库。
    • 很快就会有函数通过 Rijndael(至少适用于 SQL Server 2005 - 2016)和 Aes(至少适用于 SQL Server 2012 - 2016)来处理文件加密和解密。
    • 3
  2. Bogdan Bogdanov
    2015-07-18T07:21:13+08:002015-07-18T07:21:13+08:00

    我这样做是使用xp_cmdshell. 您可以从 SQL 作业中导出数据,然后可以使用该存储过程进行压缩。最好的方法是为 zip 运行一个 bat 文件。

    备注:要使用该 sp,您需要允许它(在 SQL Server 级别)并且您必须具有运行它的权限。

    • 0

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve