2016-05-13 58 views
9

So che è altamente sconsigliato,Chiamare un URL da un trigger in MySQL

So che si tratta di un problema con le prestazioni, la velocità, ecc, ma è per un'integrazione, e solo loro stanno facendo i loro aggiornamenti via mysql (So ​​che è pazzesco farlo anche io ma non posso cambiare quello che fanno, e stanno facendo un sacco di vendite in modo da non voler cambiare nulla).

ho solo bisogno di inviare a un URL (che può essere semplice come http://www.google.com?id=skuid)

ho letto questo blog e pile, ma sono 2+ anni, vorrei sapere se ci sono alternative all'utilizzo un 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

Grazie mille per tutto !!

+0

Se avete solo bisogno di POST/qualunque cosa, regarless di metodo, è possibile farlo attraverso alcuni procura asincrono, con il grilletto con un UDF meno dannosa come 'sys_exec()'. –

+0

Devi usare una UDF per questo. Se non è necessario un risultato (o se è possibile aggiungerlo in un secondo momento), è necessario utilizzare un metodo asincrono. Per esempio. nel trigger, basta aggiungere l'url a un tavolo da gioco e lasciare che un evento lo gestisca in un secondo momento (o chiamare direttamente un udf, che ritorna immediatamente, non dopo l'esecuzione) - altrimenti il ​​trigger deve includere gestione degli errori e/o forse aspettare un timeout se la connessione è inattiva, il tutto mentre blocchi i tuoi dati. – Solarflare

+0

Il fatto che il primo collegamento sia del 2012 non fa differenza. Nulla è cambiato negli ultimi 15 anni. Usalo. – e4c5

risposta

12

Per attivare un'azione esterna, è necessario utilizzare una UDF - è l'unico modo per mysql per dire qualcosa al "mondo esterno". The only alternative è un agente esterno che esegue continuamente il polling del DB, che è una soluzione inferiore.

Per quanto riguarda la scelta di un UDF,

  • per ridurre al minimo carico sul DB, probabilmente dovrebbe essere qualcosa che termina rapidamente (si noti che le UDF eseguiti in modo sincrono).
  • Quindi, a meno che l'installazione non sia sufficientemente piccola, notificherà semplicemente un agente esterno dell'evento. Ciò minimizza anche la gestione degli errori sul lato DB.
    • In caso contrario, se non si (ancora) si cura, è possibile ad es. appena generato curl per tutto ciò che vale.

modi che vengono in mente:

  • deporre le uova un piccolo programma - per esempio touch alcuni file che l'agente guarda. C'è uno sys_exec esistente che utilizza system() (con tutte le dovute considerazioni).
  • IPC (il segnale è il più semplice, con gli altri, è possibile passare ulteriori informazioni, ma richiede più configurazione)

quanto sys_exec's source mostra, non è così difficile scrivere una funzione definita dall'utente, in modo da non siete veramente limitato a ciò che è già disponibile (questo potrebbe spiegare perché lib_mysqludf_sys è così limitato: se hai bisogno di qualcosa di meglio, è abbastanza facile scrivere una funzione specifica dell'attività). I documenti attuali sono al numero 26.4.2 Adding a New User-Defined Function - MySQL 5.7 Reference Manual.

+0

Probabilmente sceglierò la tua risposta perché è ampiamente spiegata e utile, la lascerò aperta solo per un altro giorno per vedere se qualcun altro ha un'idea fuori dal comune ma non penso, grazie mille questo aiuterà davvero per giustificare molte decisioni in un futuro molto vicino. – Saikios

+1

Il polling di una tabella degli eventi in sospeso è sottovalutato. Se si desidera attivare eventi asincroni, questo è un modo ragionevole di fare. – Gili

1

È possibile eseguire script esterni tramite il comando "sys_exec" dal trigger. Il trucco è di scrivere quello script in modo non bloccante, quindi genera processi in background che eseguono il lavoro in modo asincrono e il processo principale termina immediatamente.

Per esempio qualcosa di simile:

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

È necessario fare in modo, però, che non si crea troppi processi simultanei. Ciò potrebbe essere fatto nel trigger (ad esempio potrebbe scrivere l'ultimo tempo di esecuzione su qualche tabella, quindi controllare se è trascorso un po 'di tempo), o nello script di shell (può creare/eliminare qualche file di flag che indicherebbe l'esecuzione del processo).

0

Ecco una soluzione per un server MySQL 5.6 a 64 bit (!) Su piattaforma Windows. L'ho provato con Win10 a 64 bit. Avevo bisogno di una versione a 64 bit dll di un plugin che vi dà la funzionalità di eseguire un comando in una shell, uno funzionante ho trovato qui: http://winadmin.blogspot.nl/2011/06/mysql-sysexec-udf-for-64-bit-windows.html

Si potrebbe anche compilarlo da soli su Windows vedere: http://rpbouman.blogspot.nl/2007/09/creating-mysql-udfs-with-microsoft.html

per MySQL 5.1 + devi mettere il plugin/dll in una sottocartella della vostra root di installazione di MySQL per esempio C:\wamp\bin\mysql\mysql5.6.17\lib\plugin Oppure si ottiene un errore:

Can not open shared library dll – errorcode 193

È inoltre è necessario curl.exe che viene chiamato da sys_eval. È necessario scaricare quello corretto qui (!. Assicuratevi di copiare entrambi() file .EXE e .crt ad un percorso raggiungibile dal vostro PATH env var), ho usato c:\windows\system32: https://winampplugins.co.uk/curl/

Poi solo codice necessario è:

--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);