问题 从mysql中的触发器调用url


我知道这是非常不受推荐的,

我知道这是性能,速度等问题, 但这是为了集成,他们只是通过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文件

非常感谢一切!


7137
2018-05-13 16:32


起源

如果你只需要POST / what,无论方法如何,你都可以通过一些异步代理来做到这一点,触发器使用一个不那么有害的UDF就像 sys_exec()。 - ivan_pozdeev
您必须为此使用UDF。如果您不需要结果(或者您可以在以后添加它),则应使用异步方法。例如。在触发器中,只需将url添加到todo-table并让事件稍后处理(或直接调用udf,立即返回,而不是在执行后) - 否则你的触发器必须包含错误处理和/或等待一个如果连接断开,则超时 - 同时可能会锁定您的数据。 - Solarflare
第一个链接来自2012年的事实没有任何区别。在过去的15年里,一切都没有改变。用它。 - e4c5
@ivan_pozdeev我需要发一个卷曲,所以是的,我想做一个带有sys_exec + idtriggered的udf,但正如我所提到的,很想知道是否有其他解决方法任何开源,或者某些人想到这个外面盒子可能吗? (非常感谢您的回答) - Saikios
@Solarflare不,我根本不需要结果,我想我甚至可以每次松开一个查询然后,这是同步产品和股票,但我们正在考虑增加一个+ -10%的股票避免问题 - Saikios


答案:


要触发外部操作,您必须使用UDF - 这是唯一的方法 mysql 告诉“外面的世界”。 唯一的选择 是一个不断轮询DB的外部代理 - 这是一个劣等的解决方案。

至于UDF的选择,

  • 为了最大限度地减少数据库上的负载,它应该是快速完成的事情(注意UDF同步运行)。
  • 因此,除非安装规模足够小,否则只会通知外部代理事件。这也最大限度地减少了DB端的错误处理。
    • 否则,如果你还没有照顾,你可以只是产卵 curl 尽管它值得。

想到的方式:

  • 产生一个小程序 - 例如 touch 代理人观看的一些文件。有一个存在的 sys_exec 用的 system() (考虑到所有因素)。
  • IPC(信号是最简单的;与其他人一样,您可以传递其他信息,但需要更多设置)

作为 sys_exec来源 显示,编写UDF并不是那么难,所以你并不仅限于已有的东西(这可以解释为什么 lib_mysqludf_sys 是如此有限:如果你需要更好的东西,那么编写一个特定于任务的功能就足够了。目前的文档是在 26.4.2添加新的用户定义函数 - MySQL 5.7参考手册


14
2018-05-16 15:53



我可能会选择你的答案,因为它有很大的解释和有用,只会让它开放一天,看看是否其他人有一个开箱即用的想法,但我不这么认为,非常感谢这对我有帮助在非常接近的未来证明很多决定。 - Saikios
轮询突出事件表被低估了。如果要触发异步事件,这是一种合理的方法。 - Gili


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

例如这样的事情:

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

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


1
2018-05-21 23:58





这是Windows平台上MySQL服务器5.6 64位(!)的解决方案。我在Win10 64bit下测试了它。 我需要一个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+,您必须将插件/ dll放在MySQL安装根目录的子目录中 C:\wamp\bin\mysql\mysql5.6.17\lib\plugin 否则你会收到一个错误:

无法打开共享库DLL - 错误代码193

你还需要 curl.exe 被称为 sys_eval。你需要在这里下载正确的(确保将(!)文件.exe和.crt复制到PATH环境中的可到达路径),我用过 c:\windows\system32 : 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);

0
2018-06-01 14:49