我知道这是非常不受赞扬的,
我知道这是一个性能、速度等方面的问题,但这是一个集成问题,他们只通过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文件
非常感谢你所做的一切!!
您可以通过触发器中的“sys_exec”命令执行外部脚本。诀窍是以非阻塞的方式编写脚本,所以它会产生异步完成工作的后台进程,主进程会立即完成。
例如像这样的东西:
#!/bin/sh
nohup curl(or wget) http://www.example.com ...other_post_parameters... &
不过,您需要确保不会创建太多的同时进程。这可以在触发器中完成(例如,它可以将最后一次执行时间写入某个表,然后检查是否经过了一定的时间),也可以在shell脚本中完成(它可以创建/删除指示正在运行的进程的某个标志文件)。
下面是一个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);
要触发外部操作,您必须使用UDF—这是mysql
向“外部世界”传达信息的唯一方法。唯一的替代方案是外部代理不断轮询数据库-这是一个较差的解决方案。
至于UDF的选择,
curl
为所有它的价值。想到的方法:
触摸
代理观看的一些文件。有一个现有的sys_exec
使用system()
(包含所有应有的考虑)。 正如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版本。有什么建议吗? 问题答案: 该子句是信号语法的一部分-它们之间不应存在分号()。此外,它使用运算符,而不是: