【问题标题】:How to run a program from SQL?如何从 SQL 运行程序?
【发布时间】:2009-07-22 01:49:42
【问题描述】:

当数据库记录匹配某些条件时,我需要实现一个从 SQL Server 数据库运行程序的工具。有没有办法做到这一点?

【问题讨论】:

    标签: sql sql-server-2008


    【解决方案1】:

    我会小心使用 xp_cmdshell,因为它会造成相当大的安全漏洞。看看这篇文章来自 http://www.databasejournal.com/features/mssql/article.php/3372131/Using-xpcmdshell.htm

    如果服务帐户具有本地管理权限,那么您可以使用此过程来执行任何 Windows 操作系统命令。

    查看我前段时间提出的类似问题。经过一些研究,我认为安全风险对于生产数据库服务器来说太大了。您的情况可能会有所不同,而 xp_cmdshell 可能就是答案。 SQL Server xp_cmdshell

    【讨论】:

      【解决方案2】:

      xp_cmdshell 是一个安全问题,也是一个设计问题(让 SQL Server 运行其他应用程序并不是一件令人愉快的事情,即使可以强制这样做)。请不要接受触发建议——这是最糟糕的主意。我首先要做的是修改或为您要运行的程序创建一个包装器,以便它轮询数据库以查找符合条件的行,然后使用它们。如有必要,在数据库中创建一个表作为要处理的行的队列,或者一个列来指示处理完成的行。

      【讨论】:

        【解决方案3】:

        您可以使用 xp_cmdshell 启动程序

        http://msdn.microsoft.com/en-us/library/aa260689(SQL.80).aspx

        【讨论】:

          【解决方案4】:

          从触发器运行进程是一种可疑的做法。您的交易将被阻止,直到进程启动并完成。此外,保证进程不能安全地读取它导致它启动的记录,因为它被锁定在等待进程终止的事务中。

          执行此操作的正确方法是检测触发器中的条件,将通知排入队列,并让提交后阅读器将通知出列并启动进程。所有这些都可以在 Transact-SQL 中完成。

          更新

          顺便说一句,当我说“在 Transact-SQL 中都可行”时,我指的是 Service Broker 和 activation:触发器 SENDs 向本地服务发送消息,可能描述了匹配的更新项目的键标准,在提交消息后激活程序,激活的程序读取消息并启动 xp_cmdshell 以使用适当的参数运行工具。激活过程has the rights to run xp_cmdshell because is properly signed。该工具在更新后的几毫秒内运行,但在不会阻止更新/插入/删除的完全安全的上下文中运行。

          【讨论】:

          • 这也假定您希望执行的任务应该从 SQL/Broker 机器运行。如果任务需要外部网络权限等,适当隔离的 SQL 环境不会让它“脱身”。
          • 可以通过凭据以安全的方式精细控制外部访问,并且可以通过代码签名控制凭据的使用。不适合胆小的人,但可以实现。
          • 顺便说一句,“完全安全的上下文”我指的是事务阻塞 pov。对于必须启用 xp_cmdshell 以及它打开潘多拉魔盒这一事实的所有反对意见当然仍然适用。
          猜你喜欢
          • 1970-01-01
          • 2017-04-25
          • 1970-01-01
          • 2013-08-30
          • 1970-01-01
          • 1970-01-01
          • 2019-03-10
          • 1970-01-01
          • 2013-01-04
          相关资源
          最近更新 更多