当触发器执行时,我需要将一些信息POST(HTTP方法)到外部URL.我知道使用触发器时会有很多安全性和性能影响,所以我担心这不是进行此类处理的地方.但无论如何,我发布这个是为了获得一些关于如何处理问题的反馈或想法.一些考虑:
真正触发此执行的应该是向表中插入或更新一条记录,因此我必须使用此触发器,因为我无法触及(第三方)应用程序.
另外,服务经纪人可以考虑一下吗?任何想法都将受到欢迎.
你是对的,这不是你想要在触发器中做的事情.您在应用程序中想要的最后一件事是在每次更新/插入/删除时引入HTTP请求的延迟,即使在运行良好的情况下也会非常明显.但是当事情工作不好时,它会非常糟糕:当HTTP资源出现可用性问题时,添加的耦合将导致应用程序失败,更糟糕的是与回滚相关的正确性问题(执行触发器的事务可能会回滚,但是HTTP调用已经完成).
这就是为什么最重要的是引入一个将触发器与HTTP调用分离的层,这是通过队列完成的.无论是用作队列的表,还是Service Broker队列,甚至是MSMQ队列都由您来进行调用.最简单的解决方案是使用表作为队列:
Service Broker优于自定义表 - 队列的优点是内部激活,它允许您的HTTP处理代码在队列中有待处理的项目时按需运行,而不是轮询.但是,通过SQLCLR从引擎内部进行HTTP调用是非常不明智的建议.外部进程对于访问HTTP等内容要好得多,因此不保证Service Broker的复杂性.