2011-05-22 25 views
5

Mi requisito es: Para ejecutar un script de shell cuando se agrega una nueva entrada a una tabla.¿Podemos ejecutar el comando del sistema operativo desde sqlite3

¿Hay alguna manera de agregar un disparador para ejecutar el script de shell al insertar una nueva fila?


Bueno, la situación es la siguiente:

estoy usando el db de un programa diferente. Say Program X crea y completa xyz.db y solo necesito ejecutar un pequeño script cada vez que el programa X inserta una nueva fila en una tabla.

Actualmente mi script de shell se ejecuta infinitamente sobre un bucle y comprueba si hay nuevas filas y lo procesa, ya que las inserciones no son muy frecuentes, ejecutar un script continuamente no es una buena opción.

Mi pregunta es similar a can we execute unix command from oracle10g procedure pero tengo que hacer lo mismo en sqlite3

+1

Si esto es realmente un requisito, su arquitectura está rota y debe corregirse. Mezclar lógica y persistencia dentro de los límites normales de SQL (activadores, procesos almacenados, etc.) es suficientemente malo, ¿pero esto? * estremecimiento * –

+1

¿por qué no puedes hacer esto desde cualquier lenguaje de programación que estés usando para controlar sqlite? P.ej. si una inserción es exitosa, tenga Python o lo que sea que ejecute la secuencia de comandos. –

+0

Ver la respuesta actualizada a continuación – zode64

Respuesta

3

Para empezar estoy totalmente de acuerdo con los comentarios, esto suena como una arquitectura pobre. Si la operación del script del shell no es independiente del programa que interactúa con la base de datos, entonces esta llamada debe incorporarse en el código llamando a algún tipo de comando del sistema, en el controlador utilizado por el programa o como parte del código principal.

En Java podría hacerse con ProcessBuilder clase, system(<command>) método en ruby ​​y os.system(<command>) en python.

En Oracle es posible escribir desencadenantes en java que puede usar para realizar una llamada al sistema, pero esta funcionalidad no existe en sqlite.

Si es completamente necesario sugeriría escribir un envoltorio alrededor de su controlador sqlite db y realizar la llamada al sistema allí.

Tal vez podría ampliar lo que realmente necesita hacer y que podría dar enfoques alternativos

Actualización:

Se puede crear una función de devolución de llamada en C/C++ utilizando la interfaz de C/C++ sqlite (ver Las devoluciones de llamada de notificación de datos modificados en http://www.sqlite.org/capi3ref.html) que se puede llamar en su disparador

CREATE TRIGGER <trigger name> 
    INSERT ON <table_name> 
    BEGIN 
     SELECT callback_function() 
    END; 

a continuación, puede utilizar este callback_function para invocar el script de shell, suena relativamente complejo, pero muy interesante.

1

Yo sólo quiero estar seguro de que está haciendo la pregunta correcta ...

Como usted dice

verificación si hay nuevas filas y procesarla, ... (infrecuente) ... ejecutar un script continuamente no es una buena opción.

por lo que actualmente tienen algo así como

while true ; do 
    $scriptPath/sqlCheckForNewValues.sh 
    sleep ${sleepSecs:-60} 
done 

?

(Si usted no tiene un sueño, entonces acordado, esto no es óptima, y ​​nota de que el valor del sueño puede ser sintonizada en los tiempos de verificación para superar las expectativas de los usuarios (por lo que tal vez 300 segundos es suficiente.)

Aunque estoy de acuerdo en principio con las objeciones sobre esta arquitectura, sólo usted sabe las verdaderas prioridades (que va a necesitar más información de antecedentes sobre lo que estamos tratando de lograr).

de lo que se ha descrito, se Dedicará mucho tiempo a descifrar y codificar una solución a este problema, cuando probablemente no ocupe más del .001% del tiempo total de procesamiento de su sistema.

¿Es agradable tener esto, o puede realmente cuantificar que vale la pena el gasto a tiempo? ¿No tienes otras características que esta vez sería mejor gastar en?

IHTH

+0

Agradecería un comentario sobre por qué se votó negativamente. Gracias. – shellter

Cuestiones relacionadas