我想编写一个监视数据库表的服务(可能在c#中)。当记录插入表中时,我希望服务获取新插入的数据,并使用它执行一些复杂的业务逻辑(对于TSQL来说太复杂)。
一种选择是让服务定期检查表以查看是否已插入新记录。这样做的问题是我希望服务一旦发生就知道插件,我不想杀死数据库性能。
做一点研究,似乎写一个CLR触发器可以完成这项工作。我可以在插件发生时触发的c#中写入触发器,然后将新插入的数据发送到Windows或WCF服务。
您认为,SQL CLR触发器的良好(甚至可能)使用是什么?
关于如何实现这一目标的任何其他想法?
答案 0 :(得分:6)
可能你应该将后处理与插入分开:
在Insert触发器中,将记录的PK添加到队列表中。
在单独的服务中,从队列表中读取并执行复杂操作。完成后,将记录标记为已处理(与错误/状态信息一起),或从队列中删除记录。
答案 1 :(得分:3)
您所描述的内容有时称为作业队列或消息队列。有几个关于使用DBMS表(以及其他技术)的线程可以通过搜索找到。
我会考虑使用触发器做任何事情,因为它是对数据库功能的不当使用,无论如何都很容易遇到麻烦。触发器最适合用于低开销的dbms结构功能(例如,细粒度的参照完整性检查),并且需要是轻量级和同步的。它可以做到,但可能不是一个好主意。
答案 2 :(得分:2)
我建议在表上调用SQL Server Service Broker,然后(异步)执行一个CLR存储过程,在不同的线程中完成所有工作。
答案 3 :(得分:1)
我有一个每分钟轮询数据库的服务,它不会导致太多的性能问题,而且它是一个干净的解决方案。此外,如果您的服务或其他wcf端点不存在,您的触发器将失败或丢失,您将不得不稍后进行轮询。
答案 4 :(得分:1)
我不建议使用CLR触发器或任何类型的触发器。您正在打开自己的严重可维护性和潜在的锁定问题。 (如果您在插入后不关心@@ identity,那么将一些非常简单的触发器放入审计/队列表中是可以接受的,并且您永远不会锁定审计/队列表)
相反,您应该从应用程序/ orm中触发将内容插入队列表并定期处理此队列。这可以通过在ORM中创建事务或启动存储过程来完成,事务启动事务会以原子方式提交更改和审计/队列。 (小心锁定在这里)
如果您需要立即采取行动,请查看在您在表格上执行插入/更新/删除后生成作业以清除队列
同时确保您每分钟检查一次队列,以防后台进程未正确启动。如果它是一个Web应用程序,并且您希望避免生成线程,则可以与后台进程通信以清除队列。
答案 5 :(得分:-1)
为什么不在存储过程中实现insert,并在插入后的过程中执行业务逻辑?它是如此复杂以至于无法用T-SQL编写?