当SQL Server(2005)发生特定事件时,我需要向正在运行的应用程序(Windows服务)发送信号。是否有可能从触发器向同一系统上的外部应用程序发送消息?
当SQL Server(2005)发生特定事件时,我需要向正在运行的应用程序(Windows服务)发送信号。是否有可能从触发器向同一系统上的外部应用程序发送消息?
不确定数据库管理员会批准这样做,但是有一种方法可以使用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
你可以从触发器发送电子邮件,但这不是推荐的做法,因为如果电子邮件系统出现故障,则无法对表进行任何数据更改。
个人而言,如果您可以接受低于实时的情况,我建议将您感兴趣的事件信息发送到另一个表中(这样即使电子邮件出现故障,真正的数据更改也可以顺利进行)。然后,我会设置一个作业,每5-10分钟检查该表是否有新条目,并将其发送电子邮件通知。
您可以使用dbmail电子邮件消息。如果邮件服务器关闭,该消息将排队,然后由外部(非SQL)进程发送,因此不应使触发器变慢。
如果应用程序可以访问SQL Server,则表格的想法听起来不错。
您还可以通过SQL 2005本机XML服务提供对同一表格的访问-它通过xml公开procs。 http://msdn.microsoft.com/en-us/library/ms345123(SQL.90).aspx
可以选择以下任一方法:
使用 RAISERROR (severity 10) 触发 SQL agent 警报和作业。
加载一个单独的表,由单独的邮件处理进程定期轮询。(如 HLGEM 建议的那样)
使用存储过程发送消息并写入表中。
每种解决方案都将事务触发器与潜在的长时间消息调用分离。
RAISERROR
将自定义错误消息从触发器返回到应用程序就足够了。我不得不使用严重性 16 而不是 10,而这个链接帮了我很多忙:http://www.sommarskog.se/error-handling-I.html#triggercontext - We Are All Monica