代码之家  ›  专栏  ›  技术社区  ›  George

从SQL Server触发器发送消息

  •  3
  • George  · 技术社区  · 17 年前

    7 回复  |  直到 17 年前
        1
  •  17
  •   Sean Reilly    17 年前

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

        2
  •  1
  •   vfilby    17 年前

    不确定DBA是否会同意,但有一种方法可以使用 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
    
        3
  •  0
  •   HLGEM    17 年前

        4
  •  0
  •   Sam    17 年前

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

    http://msdn.microsoft.com/en-us/library/ms345123(SQL.90).aspx

        5
  •  0
  •   ConcernedOfTunbridgeWells    17 年前

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

        6
  •  0
  •   dkretz    17 年前

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

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

        7
  •  0
  •   gbn    17 年前

    要么:

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

    每个解决方案都将事务触发器与可能很长的消息传递调用分离。