Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从SQL Server触发器发送消息_Sql Server - Fatal编程技术网

Sql server 从SQL Server触发器发送消息

Sql server 从SQL Server触发器发送消息,sql-server,Sql Server,当SQLServer(2005)中发生某些事情时,我需要向正在运行的应用程序(Windows服务)发送信号。是否可以从触发器向同一系统上的外部应用程序发送消息?您可以从触发器发送电子邮件,但这不是推荐的做法,因为如果电子邮件系统关闭,则无法更改表中的数据 就我个人而言,如果你的实时性较差,我会将你感兴趣的事件的相关信息发送到另一个表中(这样,即使电子邮件因某种原因被关闭,数据的实际更改也可以顺利进行)然后我会有一个工作,每5-10分钟检查一次表中的任何新条目,并通过电子邮件发送出去。不确定DBA

当SQLServer(2005)中发生某些事情时,我需要向正在运行的应用程序(Windows服务)发送信号。是否可以从触发器向同一系统上的外部应用程序发送消息?

您可以从触发器发送电子邮件,但这不是推荐的做法,因为如果电子邮件系统关闭,则无法更改表中的数据


就我个人而言,如果你的实时性较差,我会将你感兴趣的事件的相关信息发送到另一个表中(这样,即使电子邮件因某种原因被关闭,数据的实际更改也可以顺利进行)然后我会有一个工作,每5-10分钟检查一次表中的任何新条目,并通过电子邮件发送出去。

不确定DBA是否会同意,但有一种方法可以使用

“以操作系统命令shell的形式执行给定的命令字符串,并以文本行的形式返回任何输出。授予非管理用户执行xp\u 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

您可以使用dbmail电子邮件。如果邮件服务器关闭,则不应减慢触发器的速度,因为邮件已排队,然后由外部(到sql)进程发送

如果应用程序可以访问sql server,表的想法听起来不错

您还可以通过SQL2005NativeXML服务访问同一个表,该服务通过XML公开进程。

根据要发送的消息类型,可以使用CLR存储过程连接到正在运行的进程上的套接字并将消息写入该套接字。如果您无法控制流程(即无法修改流程),则可以构建一个桥接器或使用一个库,以适当的格式发布消息

为了实现可靠的传递,您可以使用MSMQ来传递消息。

您可以使用队列来做您想做的事情。 触发器可以创建对话并在队列上发送消息。
启动时,外部进程应连接到数据库,并在此队列上发出WAITFOR(RECEIVE)语句。当触发器发送消息时,它将收到该消息。

一个提示,提示触发器可能会对这样的东西产生问题,因为它们嵌入到集合操作中。由于它们与表相关联,因此它们对激发它们的上下文不太敏感。问题可能是,如果它们在涉及多行的操作上触发,因为很难避免调用操作中记录数量相同的操作实例。例如,数百封电子邮件并非不可能

希望“发生的事情”能够与它们发生的上下文更紧密地联系起来被检测到(尝试从触发器中回溯也会很有趣。)

或者:

  • 使用RAISERROR(严重性10)触发SQL代理警报和作业

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

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


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

2005年的邮件已更改为异步-现在它已排队等待外部传递。这是整个答案堆中唯一合理的解决方案。为什么人们会解读信息==电子邮件?我遇到这个解决方案是因为我只想从失败的触发器发送消息,所以使用
RAISERROR
将自定义错误消息从触发器返回到应用程序就足够了。我不得不使用严重度16而不是10,这个链接帮助很大: