【问题标题】:What is the most secure way to allow users to execute BCP export command from SQL?允许用户从 SQL 执行 BCP 导出命令的最安全方法是什么?
【发布时间】:2012-10-29 17:50:48
【问题描述】:

我目前工作的环境中,从手动 SQL 脚本中编程方式导出表的能力将非常有帮助。

从脚本执行导出将是从存储过程中运行整个过程的第一步,因此我必须能够从 SQL 启动导出。

该组织目前在大多数服务器上具有以下配置 -

  • SQL Server 2005 或 2008
  • xp_cmdshell - 禁用
  • CLR - 启用

最终,我希望能够调用传递以下参数的过程并让它执行导出。

  • 表名
  • 文件路径/名称(在网络共享上)
  • 文件格式

目前 BCP 在功能方面似乎是一个完美的选择,但由于 xp_cmdshell 被禁用,我无法通过命令行调用它。

该组织规模很小,并且很高兴为安全解决方案而努力,到目前为止,我的印象是他们对安全性有很好的控制。他们已经做出了禁用 xp_cmdshell 的全面决定,但如果我能提出一种安全的方法来允许使用它,我认为他们会很容易接受。

在我的研究中,我遇到了 'EXECUTE AS' 功能以及带有 证书 的签名程序,但是如果任何一种方法都可以提供帮助,我仍然无法解决我实现了我想要的。

另外,如果您有其他解决方案可以让我达到相同的最终结果,我会全力以赴!

【问题讨论】:

  • 为什么不让应用程序为您执行此操作(您不一定需要 BCP - C# 命令行应用程序很容易编写) - 那么您所要做的就是给用户从应用程序转储文件的文件夹中获取文件的权限。或者它甚至可以通过电子邮件发送它们或将它们放在用户已经可以访问的网络位置。
  • 我将如何调用该应用程序?命令行?此外,能够将导出的表放在特定位置是该过程的重要组成部分,因为我正在自动化手动过程。这些文件可能需要放置在 2 个网络共享之一的某个文件夹下的任何位置。
  • 在调用 C# 命令行应用程序时会不会遇到与当前尝试调用 BCP 相同的问题?
  • 您可以从几乎任何地方调用该应用程序 - 网页、调用方应用程序等。
  • 不,您在调用 BCP 时遇到的问题是您在 SQL Server 中执行此操作,并且 xp_cmdshell 已禁用。一个新颖的想法:拥有一个无需通过 T-SQL 即可调用 BCP(或只是将 SELECT 从表转储到文件)的应用程序。

标签: sql-server security bcp xp-cmdshell sql-server-administration


【解决方案1】:

正如 Aaron Bertrand 指出的那样,问题在于 xp_cmdshell 已禁用。

您可以考虑两种选择。

  1. 使用BULK INSERT。需要 INSERT 和 ADMINISTER BULK OPERATIONS 权限

  2. 创建类型为“操作系统(CmdExec)”的 SQL 代理作业以运行 BCP。您可能需要代码来创建/更新作业以传递参数。

【讨论】:

  • 感谢 Eric,但我需要执行导出,而不是导入。 xp_cmdshell 已禁用,但如果我能找到一种只允许安全使用的方法,我认为可能会考虑将其打开。我读过有关 SQL 代理技术的文章,虽然我意识到很多人都成功地使用了它,但对我个人来说似乎有点太老套了。
猜你喜欢
  • 2014-03-26
  • 2019-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
  • 2012-05-15
  • 2011-04-06
  • 1970-01-01
相关资源
最近更新 更多