【发布时间】:2009-07-22 01:49:42
【问题描述】:
当数据库记录匹配某些条件时,我需要实现一个从 SQL Server 数据库运行程序的工具。有没有办法做到这一点?
【问题讨论】:
标签: sql sql-server-2008
当数据库记录匹配某些条件时,我需要实现一个从 SQL Server 数据库运行程序的工具。有没有办法做到这一点?
【问题讨论】:
标签: sql sql-server-2008
我会小心使用 xp_cmdshell,因为它会造成相当大的安全漏洞。看看这篇文章来自 http://www.databasejournal.com/features/mssql/article.php/3372131/Using-xpcmdshell.htm
如果服务帐户具有本地管理权限,那么您可以使用此过程来执行任何 Windows 操作系统命令。
查看我前段时间提出的类似问题。经过一些研究,我认为安全风险对于生产数据库服务器来说太大了。您的情况可能会有所不同,而 xp_cmdshell 可能就是答案。 SQL Server xp_cmdshell
【讨论】:
xp_cmdshell 是一个安全问题,也是一个设计问题(让 SQL Server 运行其他应用程序并不是一件令人愉快的事情,即使可以强制这样做)。请不要接受触发建议——这是最糟糕的主意。我首先要做的是修改或为您要运行的程序创建一个包装器,以便它轮询数据库以查找符合条件的行,然后使用它们。如有必要,在数据库中创建一个表作为要处理的行的队列,或者一个列来指示处理完成的行。
【讨论】:
您可以使用 xp_cmdshell 启动程序
http://msdn.microsoft.com/en-us/library/aa260689(SQL.80).aspx
【讨论】:
从触发器运行进程是一种可疑的做法。您的交易将被阻止,直到进程启动并完成。此外,保证进程不能安全地读取它导致它启动的记录,因为它被锁定在等待进程终止的事务中。
执行此操作的正确方法是检测触发器中的条件,将通知排入队列,并让提交后阅读器将通知出列并启动进程。所有这些都可以在 Transact-SQL 中完成。
更新
顺便说一句,当我说“在 Transact-SQL 中都可行”时,我指的是 Service Broker 和 activation:触发器 SENDs 向本地服务发送消息,可能描述了匹配的更新项目的键标准,在提交消息后激活程序,激活的程序读取消息并启动 xp_cmdshell 以使用适当的参数运行工具。激活过程has the rights to run xp_cmdshell because is properly signed。该工具在更新后的几毫秒内运行,但在不会阻止更新/插入/删除的完全安全的上下文中运行。
【讨论】: