在 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 表中观察插入的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章