当前位置: 首页 > 知识库问答 >
问题:

在mysql中从触发器调用url

陈实
2023-03-14

我知道这是非常不受赞扬的,

我知道这是一个性能、速度等方面的问题,但这是一个集成问题,他们只通过mysql进行更新(我知道这样做也很疯狂,但我无法改变他们所做的,他们正在进行大量的销售,所以他们不想改变任何事情)。

我只需要发布到一个URL(它可以像http://www.google.com?id=skuid)

我读了这个博客和堆栈,但他们是2岁,想知道是否有替代使用udf:

http://open-bi.blogspot.pe/2012/11/call-restful-web-services-from-mysql.html

http://www.mooreds.com/wordpress/archives/1497

使用mysql触发器调用php文件

非常感谢你所做的一切!!

共有3个答案

慎星纬
2023-03-14

您可以通过触发器中的“sys_exec”命令执行外部脚本。诀窍是以非阻塞的方式编写脚本,所以它会产生异步完成工作的后台进程,主进程会立即完成。

例如像这样的东西:

#!/bin/sh
nohup curl(or wget) http://www.example.com ...other_post_parameters... &

不过,您需要确保不会创建太多的同时进程。这可以在触发器中完成(例如,它可以将最后一次执行时间写入某个表,然后检查是否经过了一定的时间),也可以在shell脚本中完成(它可以创建/删除指示正在运行的进程的某个标志文件)。

麹飞航
2023-03-14

下面是一个MySQL服务器5.6 64位(!)的解决方案在Windows平台上。我在Win10 64位下测试了它。我需要一点。dll版本的插件,它为您提供了在shell中运行命令的功能,我在这里找到了一个有效的插件:http://winadmin.blogspot.nl/2011/06/mysql-sysexec-udf-for-64-bit-windows.html

您也可以在Windows上自己编译它。请参见:http://rpbouman.blogspot.nl/2007/09/creating-mysql-udfs-with-microsoft.html

对于MySQL 5.1,您必须将plugin/dll放在MySQL安装根目录的子目录中,例如C:\wamp\bin\mysql\mysql5.6.17\lib\plugin,否则会出错:

无法打开共享库dll-errorcode 193

还需要curl.exe,由sys_eval调用。你需要在这里下载正确的(一定要复制两个(!)从PATH env. var文件. exe和. crt到一个可达的路径),我使用了c:\windows\system 32:https://winampplugins.co.uk/curl/

那么您需要的唯一代码是:

--one time setup. run inside your database
CREATE FUNCTION sys_eval RETURNS STRING SONAME ‘lib_mysqludf_sys.dll’;

--example call to an URL
select CONVERT(sys_eval(CONCAT(‘curl https://randomuser.me/api?results=1‘)) USING UTF8MB4);
蒋培
2023-03-14

要触发外部操作,您必须使用UDF—这是mysql向“外部世界”传达信息的唯一方法。唯一的替代方案是外部代理不断轮询数据库-这是一个较差的解决方案。

至于UDF的选择,

  • 为了最小化DB上的负载,它可能应该是快速完成的东西(注意UDF是同步运行的)。
  • 所以,除非安装规模足够小,否则它只会通知外部代理事件。这也最大限度地减少了数据库端的错误处理。
    • 否则,如果你不(还)关心,你可以例如只是产卵curl为所有它的价值。

    想到的方法:

    • 生成一个小程序-例如触摸代理观看的一些文件。有一个现有的sys_exec使用system()(包含所有应有的考虑)。
    • IPC(信号是最简单的;与其他,你可以传递额外的信息,但它需要更多的设置)

    正如sys\u exec的源代码所示,编写自定义项并不是那么难,因此您实际上并不局限于现有的功能(这可以解释为什么lib\u mysqludf\u sys如此有限:如果您需要更好的功能,编写特定于任务的函数就足够容易了)。目前的单据是26.4。2增加一个新的用户定义函数-MySQL 5.7参考手册。

 类似资料:
  • 问题内容: 我知道这是非常不推荐的 我知道这是性能,速度等方面的问题,但这是为了集成,他们只通过mysql进行更新(我知道这样做也是很疯狂的,但我无法更改其工作方式,进行大量销售,因此他们不想更改任何东西)。 我只需要发布到一个URL(它可以像http://www.google.com?id=skuid一样简单) 我阅读了这些博客和堆栈,但是它们已有2年以上的历史了,想知道是否可以使用udf替代方

  • 问题内容: 将记录插入到MySQL数据库表中时,有什么方法可以调用PHP页面/函数?我们无法控制记录插入过程。是否有触发机制可以回调PHP脚本? 问题答案: 该触发器在MySQL服务器上执行,而不是在PHP服务器上执行(即使它们都在同一台计算机上)。 因此,我想说这不太可能-至少不是简单的。 不过,请考虑有关触发器的MySQL FAQ中的此项: 23.5.11:触发器可以通过UDF调用外部应用程序

  • 问题内容: 我有一个顾客。 当将新行添加到此客户表时,如果新行的(主键)已经在客户表中,则我想使用其他字段对现有(旧)行进行更新。()。 否则(如果不在表中)插入新行。我知道我可以使用触发器在mssql中做到这一点。有没有一种方法可以在mysql中做到这一点。 问题答案: MySQL没有触发器,但是它具有REPLACE和INSERT … ON DUPLICATE KEY UPDATE (请参阅文档

  • 我试图在插入后创建一个触发器,它将更新另一个表。 这是我尝试的代码: 但我会收到以下错误消息: 1064-您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册,了解使用“@qte AS integer”附近的正确语法;声明@code为整数;从INSERTED中选择@QTE=qteInv;%s“位于第4行

  • 问题内容: 如果我 在表上有,如何抛出错误以阻止对该表进行更新? 问题答案: 这是一种可行的技巧。这不是干净的,但看起来可能可行: 本质上,您只是尝试更新不存在的列。

  • 问题内容: 我正在尝试使用MySQL触发器生成错误消息。下面是我的代码: 但这总是会产生错误。我不知道错误是什么,因为它没有说任何有关错误的信息,而只是“错误”。 有什么建议吗?除此之外,有人说使用存在问题,因为它可能取决于MySQL版本。有什么建议吗? 问题答案: 该子句是信号语法的一部分-它们之间不应存在分号()。此外,它使用运算符,而不是: