2016-05-13 73 views
9

我知道這是非常不推薦的,調用從觸發的網址在MySQL

我知道它是與性能,速度快等優點, 一個問題,但它是一個整合,他們只在做通過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

Calling a php file by using mysql trigger

非常感謝您的一切!

+0

如果你只是需要POST /任何方法,你可以通過一些異步代理來做到這一點,觸發器使用像'sys_exec()'這樣的不太有害的UDF。 –

+0

你必須爲此使用UDF。如果你不需要結果(或者如果你可以稍後添加它),你應該使用異步方法。例如。在觸發器中,只需將url添加到待辦事項表並讓事件稍後處理(或直接調用udf,即立即返回,而不是在執行後返回) - 否則觸發器必須包含錯誤處理和/或可能等待如果連接關閉,則超時 - 所有可能的情況下都會鎖定您的數據。 – Solarflare

+0

事實上,第一個鏈接是從2012年沒有任何區別。過去15年沒有任何變化。用它。 – e4c5

回答

12

要觸發外部動作,您必須使用UDF - 這是mysql向「外部世界」講述某些內容的唯一方式。 The only alternative是一個不斷調查數據庫的外部代理 - 這是一個劣質的解決方案。

至於UDF的選擇,

  • ,儘量減少對數據庫的負載,這也許應該是東西快速完成(注意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

+0

我可能會選擇你的答案,因爲它有很大的解釋和有用的,將只剩下一天,看看別人是否有一個開箱即用的想法,但我不這麼認爲,非常感謝這真的會有幫助我在很近的將來爲很多決定辯護。 – Saikios

+1

投票未決事件表被低估。如果你想觸發異步事件,這是一個合理的方法。 – Gili

1

您可以通過觸發器中的「sys_exec」命令執行外部腳本。訣竅是以非阻塞方式編寫該腳本,因此它產生了異步執行工作的後臺進程,並且主進程立即完成。

例如是這樣的:

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

你需要確保雖然,你不要創建太多的併發進程。這可以在觸發器中完成(例如,它可以將最後一次執行時間寫入某個表,然後檢查是否已經過了一段時間),或者在shell腳本中(它可以創建/刪除某個標誌文件,該文件可以指示正在運行的過程)。

0

以下是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 否則你會得到一個錯誤:

Can not open shared library dll – errorcode 193

也需要curl.exe,由sys_eval調用。你需要在這裏下載正確的(!一定要同時複製().exe的文件和.CRT從您的PATH的環境變量可達路徑),我用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);