在 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 的表中插入图片字段为无效值怎么办

SQL怎么在有外键的主键表中插数据

读取 XML 数据并构建查询以将值插入 SQL Server DB 的最佳方法是啥?

sql插入的操作

如何将 R 数据框插入到 SQL Server 中的现有表中

sql server 2000 中怎么去掉 和 还原 自增字段