SQL 用于事件驱动通信的 CLR
SQL CLR for Event Driven Communication
在我工作的地方,他们使用长轮询 技术来检测数据库中发生的事件。虽然有效...我想每个人都会同意轮询数据库不是最佳选择。
我宁愿尝试某种推送技术或技巧。因此,我正在考虑使用 table 触发器 来调用 SQL CLR 对象,该对象要么删除事件进入队列或调用网络服务。
有很多关于如何执行此操作的示例:
- How to invoke webservice from SQL Server stored procedure
- Using Webservices and Xml Serialization in CLR Integration
不过,我有点担心这样做的智慧和表现。
所以我的问题是:
- long-运行ning 触发进程可以阻止原始 INSERT 完成吗?
- 失败的触发器进程是否会阻止原始 INSERT 完成?
- 在自己的线程上执行 TRIGGERS 运行?
- 这种尝试是愚蠢的还是有更好的选择?
I was thinking about using a table trigger to call a SQL CLR object that either drops the event into a queue or calls a web service.
虽然需要 SQLCLR 来进行 Web 服务调用,但您可能不需要 SQLCLR 来简单地将事件放入队列中。
Can long-running trigger processes prevent the original INSERT from completing?
这不是 "can" 的问题:他们绝对会,因为触发器是 DML 语句(或 DDL 触发器中的 DDL 语句,或LOGON 触发器的情况)。只要触发器正在执行,触发它的 DML 语句就会等待提交(这都是自动处理的)。
Can failed trigger processes prevent the original INSERT from completing?
这不是 "can" 的问题:它们绝对会,因为触发器是作为 DML 语句的事务的一部分。事实上,如果你想根据某种逻辑取消一个DML操作,只需要调用ROLLBACK;
.
Do TRIGGERS run on their own thread?
如果您要问它们是否 运行 与触发它们的 DML 语句异步,没有。根据上面的前两个答案,它们是同一交易的一部分。在 DML 语句完成初始工作之前,触发器无事可做——包括验证 CHECK/UNIQUE/等约束——并且 DML 语句在触发器完成之前无法完成。
Is this stupid to attempt or is there a better option?
不傻,尽管直接调用 Web 服务比其他情况更适合某些情况。人们当然已经这样做了并且已经成功了,但是我相信相当多的人也会在条件不利的情况下试图这样做而把事情弄得一团糟。我会说,如果 a) Web 服务位于本地 Intranet 上(即没有延迟,或者实际上 none),并且 b) Web 服务调用快速完成(或至少足够快地超时),然后你应该可以这样做。
但是,考虑到这将在触发器中,应该更加谨慎地处理。这让我想到了一些 "better options" 我在一个几乎重复的问题中提出的建议,就在 2 天前 DBA.StackExchange:
Can I run a CLR Stored Procedure on a different server than the database instance?
而且,下面的 link 是另一个非常相似的问题(在 S.O 上),就在 6 天前,关于 Web 服务调用。我对那个问题的回答有关于减少一般网络呼叫之间争用的信息。这是您应该注意的事情,即使您采用队列方法并拥有 T-SQL 存储过程,由 SQL 服务器代理作业启动,调用 SQLCLR 对象执行 Web 服务调用。
在我工作的地方,他们使用长轮询 技术来检测数据库中发生的事件。虽然有效...我想每个人都会同意轮询数据库不是最佳选择。
我宁愿尝试某种推送技术或技巧。因此,我正在考虑使用 table 触发器 来调用 SQL CLR 对象,该对象要么删除事件进入队列或调用网络服务。
有很多关于如何执行此操作的示例:
- How to invoke webservice from SQL Server stored procedure
- Using Webservices and Xml Serialization in CLR Integration
不过,我有点担心这样做的智慧和表现。
所以我的问题是:
- long-运行ning 触发进程可以阻止原始 INSERT 完成吗?
- 失败的触发器进程是否会阻止原始 INSERT 完成?
- 在自己的线程上执行 TRIGGERS 运行?
- 这种尝试是愚蠢的还是有更好的选择?
I was thinking about using a table trigger to call a SQL CLR object that either drops the event into a queue or calls a web service.
虽然需要 SQLCLR 来进行 Web 服务调用,但您可能不需要 SQLCLR 来简单地将事件放入队列中。
Can long-running trigger processes prevent the original INSERT from completing?
这不是 "can" 的问题:他们绝对会,因为触发器是 DML 语句(或 DDL 触发器中的 DDL 语句,或LOGON 触发器的情况)。只要触发器正在执行,触发它的 DML 语句就会等待提交(这都是自动处理的)。
Can failed trigger processes prevent the original INSERT from completing?
这不是 "can" 的问题:它们绝对会,因为触发器是作为 DML 语句的事务的一部分。事实上,如果你想根据某种逻辑取消一个DML操作,只需要调用ROLLBACK;
.
Do TRIGGERS run on their own thread?
如果您要问它们是否 运行 与触发它们的 DML 语句异步,没有。根据上面的前两个答案,它们是同一交易的一部分。在 DML 语句完成初始工作之前,触发器无事可做——包括验证 CHECK/UNIQUE/等约束——并且 DML 语句在触发器完成之前无法完成。
Is this stupid to attempt or is there a better option?
不傻,尽管直接调用 Web 服务比其他情况更适合某些情况。人们当然已经这样做了并且已经成功了,但是我相信相当多的人也会在条件不利的情况下试图这样做而把事情弄得一团糟。我会说,如果 a) Web 服务位于本地 Intranet 上(即没有延迟,或者实际上 none),并且 b) Web 服务调用快速完成(或至少足够快地超时),然后你应该可以这样做。
但是,考虑到这将在触发器中,应该更加谨慎地处理。这让我想到了一些 "better options" 我在一个几乎重复的问题中提出的建议,就在 2 天前 DBA.StackExchange:
Can I run a CLR Stored Procedure on a different server than the database instance?
而且,下面的 link 是另一个非常相似的问题(在 S.O 上),就在 6 天前,关于 Web 服务调用。我对那个问题的回答有关于减少一般网络呼叫之间争用的信息。这是您应该注意的事情,即使您采用队列方法并拥有 T-SQL 存储过程,由 SQL 服务器代理作业启动,调用 SQLCLR 对象执行 Web 服务调用。