在 SQL Server 表中观察插入的最佳方法
Posted
技术标签:
【中文标题】在 SQL Server 表中观察插入的最佳方法【英文标题】:Best way to watch for insert in a SQL Server table 【发布时间】:2021-11-21 20:12:52 【问题描述】:上下文
当新数据插入特定表时,我想实时通知相关用户。
当前设置
我已经在 php 中设置了一个带有 websocket 服务器的 laravel 应用程序。 目前,我正在通过工匠命令在表中查找数据,并通过 websocket 调度客户端正确接收的事件。
public function handle()
$exports = DB::connection('dialer_ico')->table('Export')
->select('*')
->whereNotNull('FRoute')
->get();
foreach($exports as $export)
DialerCallExportedEvent::dispatch($export->responsable, $export->FRoute);
这工作正常,但是,我想要实现的是,一旦表中有插入,事件就会被调度,而不必每隔 n 秒使用调度程序运行这个工匠命令。
使用 SQL Server 执行此操作的正确方法是什么?
【问题讨论】:
这能回答你的问题吗? WebSocket listener for Microsoft SQL Database 【参考方案1】:您有两种方法可以实现这一点:事件或观察者。
-
如果只需要很少的听众,可以直接使用模型events
如果你正在监听许多模型事件,你可以使用observers
这两种情况都适用于模型实例,因此您使用什么数据库引擎并不重要。 广播事件应在生命周期事件内调度。
编辑:
由于您需要在数据库中发生开箱即用的事情时触发事件,因此我会尝试扩展 TransactionCommitted
DB 事件。
在您的EventServiceProvider.php
中添加一个侦听器以侦听TransactionCommitted
DB 事件
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Event;
use Illuminate\Database\Events\TransactionCommitted;
/**
* Register any other events for your application.
*
* @return void
*/
public function boot()
Event::listen(function (TransactionCommitted $event)
// Dispatch your DialerCallExportedEvent here
);
看看 Laravel events docs 和 Laravel API
【讨论】:
我不够精确,我不是自己创建模型,它们是由第三方服务创建的,因此我无法使用模型事件/观察者。 我已经更新了我的答案。仅供参考,我从未这样做过,但它可能会为您指明正确的方向 感谢您的想法。但是,由于我要观看的表格不受 laravel 应用程序的控制,我无法使用事件 api。到目前为止,我的研究指向我的触发器或存储的 clr 过程,它将在我的 laravel 应用程序中调用 api 路由以通知插入发生,然后在 laravel 应用程序中,我将通过 websockets 调度我的事件。以上是关于在 SQL Server 表中观察插入的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章
怎样在SQL server 2005 的表中插入图片字段为无效值怎么办
读取 XML 数据并构建查询以将值插入 SQL Server DB 的最佳方法是啥?