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