在MSSQL触发器中使用POST方法

时间:2012-10-16 08:27:56

标签: sql-server post

当触发器执行时,我需要将 POST (HTTP方法)的一些信息发送到外部URL。 我知道使用触发器时会有很多安全性和性能影响,所以我担心这不是进行这种处理的地方。但无论如何,我发布这个是为了获得一些关于如何处理问题的反馈或想法。一些注意事项:

  • 触发器触发的事务可能是异步的。
  • 流程必须处理授权
  • 结束网址是互联网上的PHP脚本。

真正触发此执行的应该是向表中插入或更新一条记录,因此我必须使用此触发器,因为我无法触及(第三方)应用程序。

另外, Service Broker 可以考虑吗? 任何想法都会受到欢迎。

1 个答案:

答案 0 :(得分:8)

你是对的,这不是你想要在触发器中做的事情。您在应用程序中想要的最后一件事是在每次更新/插入/删除时引入HTTP请求的延迟,即使在运行良好的情况下也会非常明显。但是当事情工作不好时,它会起作用非常坏:当HTTP资源出现可用性问题时,添加的耦合将导致应用程序失败,更糟糕的是与回滚相关的正确性问题(您的事务是执行触发器可能会回滚,但已经进行了HTTP调用。)

这就是为什么最重要的是引入一个将触发器与HTTP调用分离的层,这是通过队列完成的。无论是用作队列的表,还是Service Broker队列,甚至是MSMQ队列都由您来进行调用。最简单的解决方案是use a table as a queue

  • 触发器将对要进行的HTTP调用的请求进行排队(插入)
  • 在运行触发器提交的事务之后,该请求可用于出列
  • 监视(轮询)队列的外部应用程序接收请求并发出HTTP调用

Service Broker优于自定义表 - 队列的优势是Internal Activation,这将允许您的HTTP处理代码在队列中处理项目时按需运行,而不是轮询。但是,通过SQLCLR从引擎内部进行HTTP调用是非常不明智的建议。外部进程对于访问HTTP等内容要好得多,因此不保证Service Broker的复杂性。