Jon*_*ica 10 trigger sql-server service-broker python
我们有一个很好的 Python 代码,它可以发送一些电子邮件并与云系统进行交互。工作正常。但是我们必须每隔几分钟就启动它来轮询数据库。出于业务目的,我们确实需要实时启动 python 脚本,因此没有轮询延迟。(这服务于与客户通电话的销售人员。)
我们真的不想要 1 分钟的轮询循环。或 30 秒。我们希望记录显示在数据库中并立即发生。
实现此目的的快速方法是在将特定记录类型插入到表中时触发它。
我们可以从触发器触发 python 脚本吗?
根据下面 Aaron 的说明,我们知道这是一个非常糟糕的事情™,但是这张表很少使用(每天插入 0-12 次)。轮询表无法满足我们的业务需求(我们需要 .py 立即运行——它不仅仅是发送电子邮件)。
我们认为满足我们业务需求的一种方法是在 SQL Server 上设置 .net 版本的 python,然后让 T-SQL 以调用 C# 东西的方式调用 python 脚本......但我们不知道如何真的这样做!(因此这个问题)。
文档/细节?
我在 Stack Overflow 上问了一个后续问题:如何在 SQL Server 中创建 Python CLR 过程?
问题下的问题:你有一块python。您希望它从 SQL 触发器触发,但您知道这是一件非常糟糕的事情。那么,在 SQL 操作中间没有 python 代码的情况下,您如何实际实现相同的效果?
解决这种需求的非触发、非轮询方法是什么?
(同样的效果=“插入/更新/删除发生在表中,并且在db事件的2秒内触发python脚本,不轮询表”)
Aar*_*and 12
不要让您的用户事务等待(希望如此!)Python 脚本成功完成。你的整个交易都在那里等待这个外部进程运行,尝试发送邮件等。我怀疑电子邮件真的必须立即发出 - 特别是考虑到你无法控制它在路由时的任何延迟无论如何都发送到收件人的收件箱。如果时间如此重要,为什么不更频繁地运行该过程?
如果您真的,真的,真的想以错误的方式执行此操作,则可以启用xp_cmdshell并开火。
EXEC sp_configure 'show advanced options', 1;
GO
RECONFIGURE WITH OVERRIDE;
GO
EXEC sp_configure 'xp_cmdshell', 1;
GO
RECONFIGURE WITH OVERRIDE;
GO
Run Code Online (Sandbox Code Playgroud)
现在,假设用户有权访问xp_cmdshell和/或 SQL Server 服务帐户可以看到存储 python 脚本的文件夹,您应该能够从触发器中执行此操作:
EXEC master..xp_cmdshell N'C:\Python27\python.exe C:\source\NotifyAgents.py';
Run Code Online (Sandbox Code Playgroud)
顺便说一句,您应该在问题中声明您知道这是一件非常糟糕的事情TM,但无论出于何种原因,您都不关心这一点。我仍然认为您不会像预期的那样实时,即使您确实从触发器中触发了它。您是否考虑过数据库邮件而不是 python?