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

SQL Server触发器-将消息发送到队列

  •  7
  • anonymous  · 技术社区  · 16 年前

    是否可以在SQL Server 2005的CLR触发器上通过msmq向队列发送消息?

    我使用的是SQL Server项目类型,但System.Messaging不会显示为我可以添加的引用。


    基本上,当一行被写到表中时,我需要执行某种类型的操作(打印)。生成行的设备是一个手持扫描仪,只能执行基本操作,其中一个操作是通过ODBC向SQL Server写入数据。最初的想法是仅仅轮询表,获取记录,打印记录,删除记录。这可能会很好地工作,但似乎是了解消息队列的一个很好的案例和借口。

    5 回复  |  直到 6 年前
        1
  •  2
  •   dkretz    16 年前
        2
  •  4
  •   gbn    16 年前

    是的,这是可能的。

    不过,我不会在一个触发器中这样做:TXN将保持更长的开放时间,它是资源密集型的,如果它挂起会怎样。

    你能通过存储过程更新吗?

    或者将一行推送到由写入队列的SQL代理作业监视的轮询表中?

        3
  •  3
  •   SqlRyan    16 年前

    如果该程序集不受信任,您仍然可以从SQL Server访问它-它在本机不可用,必须手动导入并标记为“不受信任”本身。一段时间前,我在System.DirectoryServices中遇到了同样的问题。

    关于System.DirectoryServices,这个人和您有相同的问题,但是以同样的方式执行create assembly语句应该允许您访问System.Messaging:

    http://www.mydatabasesupport.com/forums/ms-sqlserver/218655-system-directoryservices-allowable-clr.html

        4
  •  0
  •   nightwatch    13 年前

    以下是关于如何处理这个旧问题的一些新想法: http://nginn.org/blog/?p=376

    nginmessagebus是我的基于SQL Server的消息队列项目,目标是依赖SQL Server的.NET应用程序。

        5
  •  0
  •   Мирон    6 年前

    很难通过推送技术进行交易。

    唯一可以这样做的事务性选项是使用WCF桥,它要求依次使用SQL Server 2008,自2012年以来,由SQL Server宿主的clr阻止的基于WSDL的程序集的动态后台编译,我从未破解过如何强制编译这些程序集,以避免引用主机禁止的程序集。ed clr策略。

    我找到的唯一可行的选择(可能是因为我没有找到解决方法)是使用httpclient restfull样式的网络客户端和clr集成过程,在SQL Server代理激活的过程之外工作。它只在一个问题上工作得很好,restfull不支持即时事务处理。因此,如果您需要保证消息的传递,那么您需要在消息流的某个地方进行支票呼叫。

    实际上,为了保护msmq操作的完整性,我在restfull和msmq之间插入了一个事务性wcf服务,并在msmq使用的触发器上插入了事务性wcf服务,后者反过来具有策略驱动的事务性数据处理功能。请注意,msmq触发器需要安装msmq触发器功能。我选择了基于EXE的触发器,另一种方法是使用基于COM的DLL,而我不喜欢使用COM,因为自由线程DLL需要实现复杂的C++应用程序,而在线程中用CW设计的相对简单的BooLoad线程限制了应用程序的规模。最后,restfull调用可以被认为是“接近事务性的”,因为它是在事务上下文中执行的,并且除非您有一些严重错误,例如缺少捕获错误条件(基本上没有实现try/catch)和throw,否则在需要引发错误条件时,您将受益于可靠的commit/rol。拉贝克但是,用检查调用和合理的超时来加强,当丢失的数据被认为等于没有提交时,为了确保消息传递的可靠性,最好有。