2009-07-22 47 views

回答

4

我会小心xp_cmdshell,因为它可以创造一个安全漏洞。看看这篇文章从 http://www.databasejournal.com/features/mssql/article.php/3372131/Using-xpcmdshell.htm

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

看看我以前问的这个类似的问题。经过一番研究后,我决定安全风险对于生产数据库服务器来说太大了。你的情况可能不同,xp_cmdshell可能是答案。 SQL Server xp_cmdshell

1

运行的进程从一个触发器是一个可疑的实践启动程序。您的交易将阻止,直到过程启动并结束。另外,该进程被保证不能安全地读取它导致它被启动的记录,因为它被锁定在等待进程终止的事务中。

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

更新

BTW,当我说“是所有在Transact-SQL可行”我指的是服务代理和activation:触发SEND SA消息的本地服务,也许是描述的关键项目更新与条件相符,在提交消息激活过程后,激活的过程读取消息并启动xp_cmdshell以使用适当的参数运行该工具。激活的程序has the rights to run xp_cmdshell because is properly signed。该工具在更新后的毫秒级内运行,但是从完全安全的上下文中进行更新/插入/删除。

+0

这也假定您希望执行的任务应该从SQL/Broker机器运行。如果任务需要外部网络权限等,一个适当隔离的SQL环境不会让它“脱身”。 – devstuff 2009-07-22 05:56:16

+0

可以通过凭证以安全的方式细粒度地控制外部访问,并且可以通过代码签名来控制凭证的使用。不是为了心脏,而是可以实现的。 – 2009-07-22 06:06:08

3

xp_cmdshell是一个安全问题,同时也是一个设计问题(使得SQL Server运行其他应用程序并不是一个真正令人开心的情况,即使它可以被迫这样做)。请,请不要采取触发器建议 - 这是最糟糕的主意。我首先要做的是为要运行的程序修改或创建一个包装器,以便轮询数据库以查找符合条件的行,然后使用它们。如有必要,请在数据库中创建一个表作为要处理的行的队列,或者在列中指示进程完成的行。