【问题标题】:Calling an url from a trigger in mysql从mysql中的触发器调用url
【发布时间】:2016-05-13 16:32:29
【问题描述】:

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

我知道这是性能、速度等方面的问题, 但这是为了集成,他们只通过 mysql 进行更新(我知道这样做也很疯狂,但我无法改变他们的工作,而且他们的销售额很大,所以他们不想改变任何东西)。

我只需要发到一个网址(可以简单到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

Calling a php file by using mysql trigger

非常感谢您所做的一切!

【问题讨论】:

  • 如果您只需要 POST/whatever,无论方法如何,您都可以通过一些异步代理来实现,触发器使用危害较小的 UDF,例如 sys_exec()
  • 您必须为此使用 UDF。如果您不需要结果(或者以后可以添加),则应使用异步方法。例如。在触发器中,只需将 url 添加到待办事项表并让事件稍后处理它(或直接调用 udf,立即返回,而不是在执行后返回) - 否则您的触发器必须包括错误处理和/或可能等待如果连接断开,则超时 - 同时可能会锁定您的数据。
  • 第一个链接来自 2012 年这一事实没有任何区别。在过去的 15 年里,一切都没有改变。使用它。
  • @ivan_pozdeev 我需要发布一个 curl,所以是的,我想用 sys_exec + idtriggered 做一个 udf,但正如我所提到的,我很想知道是否有任何开源的另一种解决方法,还是有人在盒子外面想到了这个? (非常感谢您的回答)
  • @Solarflare 不,我根本不需要结果,而且我认为我什至可以不时地释放一个查询,这是为了同步产品和库存,但我们正在考虑关于添加 +-10% 的库存以避免出现问题

标签: mysql rest triggers


【解决方案1】:

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

至于UDF的选择,

  • 为了最大程度地减少 DB 上的负载,它应该可以快速完成(注意 UDF 同步运行)。
  • 因此,除非安装规模足够小,否则它只会将事件通知外部代理。这也最大限度地减少了 DB 端的错误处理。
    • 否则,如果您(还)不关心,您可以例如只需生成 curl 即可。

想到的方法:

  • 生成一个小程序 - 例如touch 代理监视的某个文件。有一个现有的 sys_exec 使用 system()(有所有应有的考虑)。
  • IPC(信号最简单;与其他人一起,您可以传递其他信息,但需要更多设置)

正如sys_exec's source 所示,编写 UDF 并不难,因此您并不局限于现有的内容(这可以解释为什么 lib_mysqludf_sys 如此有限:如果您需要更好的东西,这就足够了易于编写特定于任务的函数)。当前文档位于26.4.2 Adding a New User-Defined Function - MySQL 5.7 Reference Manual

【讨论】:

  • 我可能会选择你的答案,因为它解释得很好而且很有用,只会再打开一天,看看其他人是否有开箱即用的想法,但我不这么认为,非常感谢,这将真正帮助我证明在一个非常近的未来做出的许多决定。
  • 对未完成事件表的轮询被低估了。如果你想触发异步事件,这是一种合理的做法。
【解决方案2】:

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

例如这样的:

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

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

【讨论】:

    【解决方案3】:

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

    无法打开共享库 dll – 错误代码 193

    您还需要由sys_eval 调用的curl.exe。您需要在此处下载正确的文件(确保将两个(!)文件 .exe 和 .crt 复制到 PATH env.var 中的可访问路径),我使用了 c:\windows\system32https://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);
    

    【讨论】:

      【解决方案4】:

      答案是:

      默认你可以在TSQL中运行shell命令

      但是任何像 Mysql/MSSql... 这样的 sql-server 都有 Router 库用于 sql-client 远程连接或其他一些可以很好扩展的共享类编程: https://dev.mysql.com/doc/dev/mysql-server/latest/classHttpRequest.html#adfc7ae561e6ba03d21890ee1855df72b

      然后你可以使用一些第三方或者自己创建的库来增加sql-engine的能力:

      mysql-shellhttps://github.com/mysql/mysql-shell

      mssql-curlhttps://github.com/jdarwood007/sql-curl

      微软示例https://techcommunity.microsoft.com/t5/sql-server/calling-http-endpoints-in-t-sql-using-curl-extension/ba-p/385878

      【讨论】:

      猜你喜欢
      • 2010-11-30
      • 1970-01-01
      • 2013-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多