当SQL Server(2005)中发生某些事情时,我需要发出正在运行的应用程序(Windows服务)的信号。是否有可能将触发器中的消息发送到同一系统上的外部应用程序?
答案 0 :(得分:16)
您可以使用SQL Service Broker队列来执行您想要的操作。 触发器可以创建对话并在队列上发送消息。 启动时,外部进程应连接到数据库并在此队列上发出WAITFOR(RECEIVE)语句。它会在触发器发送时收到消息。
答案 1 :(得分:1)
不确定DBA会批准这一点,但有一种方法可以使用xp_cmdshell
运行命令“将给定的命令字符串作为操作系统命令shell执行,并将任何输出作为文本行返回。授予非管理用户执行xp_cmdshell的权限。”
来自MS网站的示例:
CREATE PROC shutdown10
AS
EXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server shutting down
in 10 minutes. No more connections allowed.', no_output
EXEC xp_cmdshell 'net pause sqlserver'
WAITFOR DELAY '00:05:00'
EXEC xp_cmdshell 'net send /domain: SQL_USERS ''SQL Server shutting down
in 5 minutes.', no_output
WAITFOR DELAY '00:04:00'
EXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server shutting down
in 1 minute. Log off now.', no_output
WAITFOR DELAY '00:01:00'
EXEC xp_cmdshell 'net stop sqlserver', no_output
答案 2 :(得分:0)
您可以从触发器发送电子邮件,但这不是推荐的做法,因为如果电子邮件系统关闭,则无法对表格进行任何数据更改。
就个人而言,如果你的生活时间少于实时,我会将你感兴趣的事件信息发送到另一个表格(因此,即使电子邮件由于某种原因而失败,数据的真正变化也会顺利进行。)然后我会有一个工作,每隔5-10分钟检查一次该表,以查找任何新条目并通过电子邮件发送。
答案 3 :(得分:0)
您可以使用dbmail电子邮件。如果邮件服务器关闭,它不应该减慢触发器因为邮件排队然后由外部(到sql)进程发送。
如果应用程序可以访问sql server,表格的想法听起来不错。
您还可以通过sql 2005本机XML服务访问同一个表 - 它通过xml公开procs。 http://msdn.microsoft.com/en-us/library/ms345123(SQL.90).aspx
答案 4 :(得分:0)
根据要发送的消息类型,可以使用CLR存储过程连接到正在运行的进程上的套接字并将消息写入该消息。如果您无法控制该过程(即无法修改它),您可以构建一个桥接器或使用可以以适当格式发出消息的库。
为了实现可靠的交付,您可以使用MSMQ来传递消息。
答案 5 :(得分:0)
提醒一下,触发器对于这样的东西可能会有问题,因为它们嵌入在集合操作中。并且与表相关联,它们对于触发它们的上下文不是非常敏感。问题可能在于它们触发涉及多行的操作,因为很难避免调用与操作中的记录一样多的操作实例。例如,数百封电子邮件不太可能发生。
希望“发生的事情”可以与它们发生的上下文更紧密地联系起来(尝试从触发器回溯也很有趣。)
答案 6 :(得分:0)
或者:
使用RAISERROR(严重级10)触发SQL代理警报和作业。
加载一个单独的表,该表由一个单独的邮件处理过程定期轮询。 (正如HLGEM建议的那样)
使用存储过程发送消息并写入表格。
每个解决方案都将事务触发器与可能长的消息传递调用解耦。