我正在为iPhone应用程序构建RESTful API。
当用户“签入”[将新行插入表格]时,我想从该插入中获取数据并调用Web服务,该服务将根据该插入发送推送通知。
我能想到这样做的唯一方法是通过trigger
进行,或者使用实际的插入方法,在成功插入后调用Web服务。这对我来说似乎是一个坏主意。
想知道你是否对此有任何想法,或者是否有一个我没有想过的更好的方法。
答案 0 :(得分:18)
即使技术上可行,但这确实不是一个好主意!触发器应该非常精简,它绝对不应该涉及冗长的操作(网络服务肯定是这样)!重新思考你的架构 - 应该有更好的方法来做到这一点!
我的建议是将您需要在触发器中调用Web服务的“注意”任务与实际执行该Web服务调用分开。
类似的东西:
在你的触发器代码中,插入一个“稍后再调用web服务”到一个表中(只有INSERT
以保持它的精益和快速 - 这就是全部)
具有异步服务(SQL作业,或者最好是Windows NT服务),它将这些调用与实际的触发器执行分开,并将从该Web服务检索到的任何数据存储到数据库中的相应表中。 / p>
触发器是一个非常挑剔的东西 - 它应该总是很快,非常精简 - 最多只需INSERT
或两个 - 并且无论如何都要避免触发器中的游标或其他冗长的操作(如网络)服务电话)
Brent Ozar在The Top 10 Developer Mistakes That Don't Scale上有一个很棒的网络广播(在SQL PASS上发布),触发器是他关注的第一件事!强烈推荐
答案 1 :(得分:2)
这取决于业务需求。通常我会远离使用触发器,因为这是一个业务逻辑,应该由BL处理。
但问题的答案是肯定的 - 您可以这样做,只需确保异步调用Web服务,这样就不会在Web服务调用完成时延迟插入。
您也可以考虑使用OneWay网络服务 - 即点不费力。
但是,正如其他人指出的那样 - 你最好不要使用触发器。
如果架构得当,应该只有一段代码可以与数据库通信,即只在一个服务中对DAL进行一些抽象。在插入后用钩子做任何需要的东西。
如果有许多不同的应用程序可以在数据库中直接访问数据库而不是通过DAL服务,那么我会使用触发器。这又是一场等待发生的灾难。
另一种情况,我可以使用触发器,如果我必须处理内部托管的第三方应用程序,即我是否可以访问数据库服务器本身,而不是访问数据库中写入的代码。< / p>
答案 2 :(得分:1)
存储过程怎么样?而不是在触发器上设置它,而是调用存储过程,它将插入数据,并可能执行其他操作。
据我所知,触发器的范围非常有限。存储过程可能有更多范围(或可能不是)。
在最糟糕的情况下,您始终可以构建自己的“API”页面;而不是直接插入数据,请求API页面,它可以插入数据并执行推送通知。
答案 3 :(得分:1)
Trigger-&gt; Queue-&gt; SP-&gt; XP_XMDShell-&gt; BAT-&gt; cURL-&gt;第三方网络服务
我使用触发器在Queue表中插入记录, 然后使用游标将存储过程拉出队列条目。
我没有WSDL或访问第三方API开发人员并且迫切需要完成原型,因此存储过程调用XP_CMDShell调用带参数的.bat文件。
bat文件调用cURL来管理REST / JSON调用和响应。
它是免费的,快速的,可靠的。不是在建筑上纯粹,而是让原型开始实施。
答案 4 :(得分:0)
一个好的做法是让用户点击页面时该网页进入另一个表格(我将调用 message_queue )。
然后在服务器上安装一个Windows服务/ * nix守护程序扫描 message_queue 表,并通过Web服务执行推送到移动应用程序。您可以利用SQL中事务处理的强大功能来管理队列处理。
这种方法的好处是你可以从1台独立服务器开始,甚至在扩展时将网站,数据库,服务/守护进程分离到不同的物理服务器或服务器集群上。