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

时间:2009-02-23 19:45:19

标签: c# sql-server sql-server-2005 msmq

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

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


基本上我需要在向表写入行时进行某种类型的操作(打印)。生成该行的设备是一个只能执行基本操作的手持式扫描程序 - 其中一个是通过odbc写入SQL服务器。最初的想法是只是轮询表,抓取记录,打印记录,删除记录。这可能会很好,但它似乎是了解消息队列的好例子和借口。

5 个答案:

答案 0 :(得分:4)

是的,这是可能的。

我不会在触发器中执行此操作:TXN将保持打开更长时间,它是资源密集型的,如果它挂起等等。

您可以通过存储过程更新吗?

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:2)

这可能对您有用:http://support.microsoft.com/kb/555070

答案 3 :(得分:0)

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

Nginn-messagebus是我基于SQL服务器的消息排队项目,针对依赖SQL服务器的.Net应用程序。

答案 4 :(得分:0)

通过推送技术很难进行事务处理。

这样做的唯一事务选择是使用WCF桥,而这又需要使用SQL Server 2008,自2012年以来,对由SQL Server托管的CLR阻止的基于WSDL的程序集进行动态后台编译,而我从未破解过强制编译这些程序集,以免引用托管的CLR策略禁止的程序集。

我发现可行的唯一选择(可能是由于未能弄清解决方法)是将HttpClient RESTFull样式的网络客户端与CLR集成过程一起使用,而该过程是从SQL Server Broker Activated过程开始工作的。它仅遇到一个麻烦就可以很好地工作,RESTFull不支持开箱即用的事务。因此,如果您需要保证邮件的传递,则需要在邮件流中的某个地方进行检查。

实际上,为了保护MSMQ操作的完整性,我在RESTFull和MSMQ之间插入了事务性WCF服务,并在MSMQ上使用了触发器,后者又具有策略驱动的事务性数据处理。请注意,MSMQ触发器需要安装MSMQ触发器功能。我选择了基于exe的触发器,因为替代方法是使用基于COM的DLL,而且我不喜欢使用COM,因为自由线程的DLL需要实现复杂的C ++应用程序和单元线程,而使用CCW在C#中相对容易设计,对应用规模施加限制。最后,由于RESTFull调用是在事务的上下文中执行的,因此可以认为它是“近事务的”,除非您遇到一些严重的错误,例如缺少捕获错误条件(基本上是错过了实现try / catch的方法)并抛出,当需要提高错误条件时,您将受益于可靠的提交/回滚。但是,通过检查调用和合理的超时来增强功能,当丢失的数据被认为等同于没有提交时,可以确保消息传递的可靠性。