从SQL Server触发器发送消息

3

当SQL Server(2005)发生特定事件时,我需要向正在运行的应用程序(Windows服务)发送信号。是否有可能从触发器向同一系统上的外部应用程序发送消息?

7个回答

18
你可以使用SQL Service Broker队列来实现所需的功能。触发器可以创建对话并将消息发送到队列中。当触发器发送消息时,外部进程应连接到数据库并在该队列上发出一个WAITFOR(RECEIVE)语句。它将在触发器发送消息时接收该消息。

3
整个答案堆中,这是唯一明智的解决方案。为什么人们把“message”解释为“email”?那纯粹是疯狂的行为。 - stephbu

1

不确定数据库管理员会批准这样做,但是有一种方法可以使用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

0

你可以从触发器发送电子邮件,但这不是推荐的做法,因为如果电子邮件系统出现故障,则无法对表进行任何数据更改。

个人而言,如果您可以接受低于实时的情况,我建议将您感兴趣的事件信息发送到另一个表中(这样即使电子邮件出现故障,真正的数据更改也可以顺利进行)。然后,我会设置一个作业,每5-10分钟检查该表是否有新条目,并将其发送电子邮件通知。


2005年的邮件已经改为异步发送 - 现在已排队等待外部投递。 - Sam

0

您可以使用dbmail电子邮件消息。如果邮件服务器关闭,该消息将排队,然后由外部(非SQL)进程发送,因此不应使触发器变慢。

如果应用程序可以访问SQL Server,则表格的想法听起来不错。

您还可以通过SQL 2005本机XML服务提供对同一表格的访问-它通过xml公开procs。 http://msdn.microsoft.com/en-us/library/ms345123(SQL.90).aspx


0
根据您想要发送的信息类型,您可以使用CLR存储过程连接到正在运行的进程上的套接字并将消息写入其中。如果您无法控制该进程(即无法修改它),则可以构建一个桥接器或使用能够以合适格式发出消息的库。
为了可靠地传递消息,您可以使用MSMQ来执行某些操作。

0
提醒一下,触发器在这种情况下可能会有问题,因为它们嵌入在设置操作中。并且与表相关联,它们对触发它们的上下文不太敏感。问题可能出现在涉及多行的操作上,因为很难避免调用与操作中记录数量相同的动作实例。例如,几百封电子邮件是不太可能避免的。
希望“发生的事情”可以更紧密地与其发生的上下文相关联(这也可以尝试从触发器中回溯)。

0

可以选择以下任一方法:

  • 使用 RAISERROR (severity 10) 触发 SQL agent 警报和作业。

  • 加载一个单独的表,由单独的邮件处理进程定期轮询。(如 HLGEM 建议的那样)

  • 使用存储过程发送消息并写入表中。

每种解决方案都将事务触发器与潜在的长时间消息调用分离。


我发现了这个解决方案,因为我只想从一个失败的触发器中发送一条消息,所以使用 RAISERROR 将自定义错误消息从触发器返回到应用程序就足够了。我不得不使用严重性 16 而不是 10,而这个链接帮了我很多忙:http://www.sommarskog.se/error-handling-I.html#triggercontext - We Are All Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接