SQL 数据更改时触发脚本

Posted

技术标签:

【中文标题】SQL 数据更改时触发脚本【英文标题】:Trigger script when SQL Data changes 【发布时间】:2021-02-13 20:49:03 【问题描述】:

我正在尝试制作一个实时反应控制面板,因此当您按下 Web 控制面板上的按钮时,数据(真或假)将进入 SQL 数据库(phpmyadmin),并且当数据更改时,SQL 数据库应该在树莓派上触发一个脚本来打开灯。

我知道如何将数据写入 SQL 数据库以及如何使用树莓派控制灯,但我不知道如何在 SQL 数据库中的数据更新时触发或执行某些操作。

它需要存活,比如在最多 20 毫秒内做出反应。谁能帮我这个? SQL 数据库在 Ubuntu 上运行,并且基于 phpmyadmin。

您好, 朱尔斯

示意图: DataUpdateGraphical

【问题讨论】:

你不能用 vanilla mysql 做到这一点,你需要一个用 C++ 编写的用户定义函数,它可以与外部应用程序对话。但是,从您的应用程序而不是从 mysql 执行此操作要简单得多 【参考方案1】:

在 MySQL 中使用触发器来激活任何外部进程并不是一个好主意。原因是触发器在执行 INSERT/UPDATE/DELETE 时触发,而不是在事务提交时触发。因此,如果外部进程收到事件,它可能会立即去查询数据库以获取有关该数据更改的其他详细信息,并发现它看不到未提交的数据。

相反,我建议任何正在写入数据库的应用程序都应该负责创建通知。只有这样,应用程序才能等到之后事务被确认提交。

因此,您处理按钮按下的 PHP 代码将在数据库中插入/更新一些数据,并检查 SQL 是否完成且没有错误(始终检查执行 SQL 语句的结果)以及事务是否已提交。

然后相同的 PHP 代码随后调用您的脚本,或将一个偶数发送到脚本正在等待的消息队列,或类似的东西。

只是不要将 MySQL 用作穷人的消息队列!这不是正确的工具。


同样的建议适用于您想要在数据库外部执行的任何其他操作。比如发送邮件、写文件、调用 http API 等等。

不要在 SQL 触发器中执行此操作,因为外部操作不遵守事务隔离。触发器或其中一个级联数据更新可以回滚,但无法回滚外部操作的效果。

【讨论】:

【参考方案2】:

MySQL 无法从触发器内将事件传递给外部软件。这就是你需要让你的数据库将事件推送到你的应用程序。

(实际上,可以安装一个 user-defined function 将行业标准的 stomp 消息发送到像 rabbitmq 这样的消息队列系统。但是您必须控制整个服务器和您的数据库管理员,才能安装它。)

另一种选择:每隔一段时间运行一次查询以检索更改的信息,并将其推送到您的应用程序。这是一个令人讨厌的选择:轮询是 xxx 脖子上的痛苦。

您能否让您的服务器应用程序在更新数据库时检测更改?这需要一些编程和测试,但它可以很好地解决您的问题。

除了 MySql 之外,您还可以使用 redis 代替 /。每当值发生变化时,redis 都会向 Web 服务器发送事件,这对于您想要做的事情来说几乎是完美的。 https://redis.io/topics/notifications

【讨论】:

我想我会尝试自动轮询,但我希望我的系统不会慢到硬。而且我会坚持使用 mysql,因为我有很多基于 mysql 的脚本。但是感谢您的帮助! :) Mysql.does 有一种方法可以从触发器调用外部脚本:通过编译的 udf。您可以在 Internet 上找到一些示例。您可能不想这样做,但这是可能的。

以上是关于SQL 数据更改时触发脚本的主要内容,如果未能解决你的问题,请参考以下文章

列值更改的 T-SQL (SQL Server 2016) 触发器,在插入

如何自定义 Visual Studio 生成的 SQL 脚本

SQL Server 触发器触发 3 次

创建触发器以了解谁在 SQL Server 表中进行了更改

触发器实现对插入数据的字段更改 Oracle+SQL Server

在每个 DOM 更改“完成”时触发 javascript 事件