SQL 数据更改时触发脚本
Trigger script when SQL Data changes
我正在尝试制作一个实时反应控制面板,因此当您在 Web 控制面板上按下一个按钮时,数据(真或假)会进入 SQL 数据库(phpmyadmin),然后数据更改 te SQL 数据库应触发 raspberry pi 上的脚本,该脚本将打开灯。
我知道如何将数据写入 SQL 数据库以及如何使用 raspberry pi 控制 lamp 但我不知道如何在数据进入时触发或执行某些操作SQL 数据库得到更新。
它需要生存,比如最多 20 毫秒之类的反应。谁能帮我这个?
SQL 数据库在 Ubuntu 上运行并且基于 phpmyadmin。
您好,
朱尔斯
示意图:
DataUpdateGraphical
MySQL 无法从触发器内将事件传递给外部软件。这就是让数据库将事件推送到应用程序所需要的。
(实际上,可以安装 user-defined function that sends an industry-standard stomp messsage to a message queue system like rabbitmq。但是您必须控制整个服务器,并且您的数据库管理员才能安装它。)
备选方案:运行 每隔一段时间进行一次查询以检索更改的信息,并将其推送到您的应用程序。这是一个令人讨厌的选择:轮询是 xxx 脖子上的痛苦。
你能让你的服务器应用在更新数据库时检测到变化吗?它需要一些编程和测试,但它是解决您的问题的好方法。
除了 MySql 之外,您还可以使用 redis 代替 /。每当值发生变化时,redis 都会将事件发送到 Web 服务器,这对于你想做的事情来说几乎是完美的。 https://redis.io/topics/notifications
在 MySQL 中使用触发器来激活任何外部进程不是一个好主意。原因是触发器在 INSERT/UPDATE/DELETE 执行时触发,而不是在事务提交时触发。因此,如果外部进程收到事件,它可能会立即去查询数据库以获取有关该数据更改的其他详细信息,并发现它看不到未提交的数据。
相反,我建议任何正在写入数据库的应用程序都应该负责创建通知。只有这样,应用程序才能等到 after 事务被确认提交。
因此您的 PHP 处理按钮按下的代码将 insert/update 数据库中的一些数据,并检查 SQL 是否完成且没有错误(始终检查执行 insert/update 的结果=34=] 语句)和事务已提交。
然后相同的 PHP 代码随后会调用您的脚本,或将事件发送到脚本正在等待的消息队列,或类似的事情。
只是不要将 MySQL 用作穷人的消息队列!这不是正确的工具。
同样的建议适用于您想在数据库外部执行的任何其他操作。比如发送电子邮件、写入文件、进行 http API 调用等
不要在 SQL 触发器中执行此操作,因为外部操作不遵守事务隔离。触发器或级联数据更新之一可以回滚,但无法回滚外部操作的影响。
我正在尝试制作一个实时反应控制面板,因此当您在 Web 控制面板上按下一个按钮时,数据(真或假)会进入 SQL 数据库(phpmyadmin),然后数据更改 te SQL 数据库应触发 raspberry pi 上的脚本,该脚本将打开灯。
我知道如何将数据写入 SQL 数据库以及如何使用 raspberry pi 控制 lamp 但我不知道如何在数据进入时触发或执行某些操作SQL 数据库得到更新。
它需要生存,比如最多 20 毫秒之类的反应。谁能帮我这个? SQL 数据库在 Ubuntu 上运行并且基于 phpmyadmin。
您好, 朱尔斯
示意图: DataUpdateGraphical
MySQL 无法从触发器内将事件传递给外部软件。这就是让数据库将事件推送到应用程序所需要的。
(实际上,可以安装 user-defined function that sends an industry-standard stomp messsage to a message queue system like rabbitmq。但是您必须控制整个服务器,并且您的数据库管理员才能安装它。)
备选方案:运行 每隔一段时间进行一次查询以检索更改的信息,并将其推送到您的应用程序。这是一个令人讨厌的选择:轮询是 xxx 脖子上的痛苦。
你能让你的服务器应用在更新数据库时检测到变化吗?它需要一些编程和测试,但它是解决您的问题的好方法。
除了 MySql 之外,您还可以使用 redis 代替 /。每当值发生变化时,redis 都会将事件发送到 Web 服务器,这对于你想做的事情来说几乎是完美的。 https://redis.io/topics/notifications
在 MySQL 中使用触发器来激活任何外部进程不是一个好主意。原因是触发器在 INSERT/UPDATE/DELETE 执行时触发,而不是在事务提交时触发。因此,如果外部进程收到事件,它可能会立即去查询数据库以获取有关该数据更改的其他详细信息,并发现它看不到未提交的数据。
相反,我建议任何正在写入数据库的应用程序都应该负责创建通知。只有这样,应用程序才能等到 after 事务被确认提交。
因此您的 PHP 处理按钮按下的代码将 insert/update 数据库中的一些数据,并检查 SQL 是否完成且没有错误(始终检查执行 insert/update 的结果=34=] 语句)和事务已提交。
然后相同的 PHP 代码随后会调用您的脚本,或将事件发送到脚本正在等待的消息队列,或类似的事情。
只是不要将 MySQL 用作穷人的消息队列!这不是正确的工具。
同样的建议适用于您想在数据库外部执行的任何其他操作。比如发送电子邮件、写入文件、进行 http API 调用等
不要在 SQL 触发器中执行此操作,因为外部操作不遵守事务隔离。触发器或级联数据更新之一可以回滚,但无法回滚外部操作的影响。