我想编写一个监视数据库表的服务(可能在c#中)。当记录插入表中时,我希望服务获取新插入的数据,并使用它执行一些复杂的业务逻辑(对于TSQL来说太复杂)。

一种选择是让服务定期检查表以查看是否已插入新记录。这样做的问题是我希望服务一旦发生就知道插件,我不想破坏数据库性能。

做一点研究,似乎写一个CLR触发器可以完成这项工作。我可以在插件发生时触发的c#中写入触发器,然后将新插入的数据发送到Windows或WCF服务。

您认为,SQL CLR触发器的良好(甚至可能)使用是什么?

关于如何实现这一目标的任何其他想法?

有帮助吗?

解决方案

可能你应该将后处理与插入分开:

在Insert触发器中,将记录的PK添加到队列表中。

在单独的服务中,从队列表中读取并执行复杂操作。完成后,将记录标记为已处理(与错误/状态信息一起),或从队列中删除记录。

其他提示

您所描述的内容有时称为作业队列或消息队列。有几个关于使用DBMS表(以及其他技术)的线程可以通过搜索找到。

我会考虑使用触发器做任何事情,因为它是对数据库功能的不当使用,无论如何都很容易遇到麻烦。触发器最适合用于低开销的dbms结构功能(例如,细粒度的参照完整性检查),并且需要是轻量级和同步的。它可以做到,但可能不是一个好主意。

我建议在桌面上调用 SQL Server服务代理,然后(异步)执行CLR存储过程,该过程在不同的线程中完成所有工作。

我有一个每分钟轮询数据库的服务,它不会导致太多的性能问题,而且它是一个干净的解决方案。此外,如果您的服务或其他wcf端点不存在,您的触发器将失败或丢失,您将不得不稍后进行轮询。

我不建议使用CLR触发器或任何类型的触发器。您正在打开自己的严重可维护性和潜在的锁定问题。 (如果您在插入后不关心@@ identity,那么将一些非常简单的触发器放入审计/队列表中是可以接受的,并且您永远不会锁定审计/队列表)

相反,您应该从应用程序/ orm中触发将内容插入队列表并定期处理此队列。这可以通过在ORM中创建事务或启动存储过程来完成,事务启动事务会以原子方式提交更改和审计/队列。 (小心锁定在这里)

如果您需要立即采取行动,请查看在您在表格上执行插入/更新/删除后生成作业以清除队列

同时确保您每分钟检查一次队列,以防后台进程未正确启动。如果它是一个Web应用程序,并且您希望避免生成线程,则可以与后台进程通信以清除队列。

为什么不在存储过程中实现insert,并在插入后的过程中执行业务逻辑?它是如此复杂以至于无法用T-SQL编写?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top