none
Como saber desde mi aplicación si se ha hecho una inserción,modifcacion o eliminacion en una tabla. RRS feed

  • Pregunta

  • Buenas ,

    Como puedo saber si en una tabla se ha hecho una inserccion, es decir ,una aplicacion externa a la mía va hacer insert en mi tabla.

    MI aplicación esta hecha en .NET.

    Yo necesito saber al momento que se haga esa inserción.

    NO se como hacer para saber dicho registro sin tener que utilizar un timer que este constantemente contando los registros.

    NO se si es posible.

    Muchas gracias.

    miércoles, 13 de mayo de 2020 16:31

Respuestas

  • Hay alguna manera de al crear un trigger en mysql que me envié un parámetro a un servicio web asmx.


    No sé si se puede hacer en MySql, pero sí te puedo decir que en SQL Server es tremendamente complicado. A nada que MySql haga las cosas de forma un poco similar a SQL Server, me temo que va a resultar igualmente complicado.

    Te explico lo que se hace en SQL Server, por si acaso MySql permite algo parecido: En SQL Server habría que habilitar la integración con el CLR, constuir un ensamblado usando cualquier lenguaje de .Net, instalar ese ensamblado en la base de datos, y llamarlo desde el trigger. El ensamblado por dentro usará las funciones del Framework para llamar al servicio web. El problema es que de forma predeterminada, y por razones de seguridad, no tendrá permiso para hacerlo. Entonces hay que instalar el ensamblado con permisos de acceso externo, lo cual a su vez tiene considerables requisitos de seguridad sobre el SQL Server para que te lo permita. Una vez superado ese escollo, te encuentras con que al ejecutar el ensamblado con llamadas al servicio web te empieza a dar errores porque no encuentra determinadas referencias necesarias para hacer esas llamadas. Entonces buscas los errores en internet y acabas encontrando posts que te explican cómo solucionarlos, pero es bastante complejo. Y luego está el problema de que el trigger se vuelve muy lento porque no termina de ejecutar hasta que la llamada al servicio web se completa. Y si tratas de hacerla asíncrona, te vuelves a topar de nuevo con los problemas de seguridad porque no te permite crear el hilo desde dentro de ese proceso. Total, un lío enorme. No sé si en MySql hay funcionalidad análoga a esta o tiene restricciones parecidas, pero si quieres ir por esta vía prepárate para sufrir muchísimo.

    jueves, 14 de mayo de 2020 7:52

Todas las respuestas

  • Hola:
    Depende de la base de datos que uses.
    Si usas una que admite triggers (desencadenadores), te creas una tabla como por ejemplo

    LOG
    ====
    id                     entero   
    nombre_tabla   caracter
    fecha               datetime
    movimiento     entero
    etc

    Creas tantos triggers como movimientos (altas, bajas, modificaciones) y tablas quieras controlar.
    Cuando se ejecuta un movimiento en una tabla que tiene creado un trigger, este se dispara y ejecuta su codigo; si le pones que inserte 1 registro en la tabla anterior, despues solo tienes que consultar dicha tabla.

    P.D.
    Para mas informacion consultar create "triggers sql server" en Google

    Un saludo desde Bilbo
    Carlos

    miércoles, 13 de mayo de 2020 16:53
  • Muchas gracias por responder J. Carlos.

    Eso había pensado, la cuestion es saber automaticamente desde mi aplicación que se ha hecho un insert, sin tener que consultar.

    Por eso preguntaba que si era posible por que ese insert le tengo que mandar luego a un webservice.



    miércoles, 13 de mayo de 2020 16:58
  • Si el servidor es un SQL Server, podrías usar la clase SqlClient.SqlDependency e implemetar un manejador para su evento OnChange:

    https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqldependency?view=dotnet-plat-ext-3.1

    • Propuesto como respuesta Sergio Parra miércoles, 13 de mayo de 2020 23:06
    miércoles, 13 de mayo de 2020 17:49
  • Es Mysql Alberto.

    miércoles, 13 de mayo de 2020 17:59
  • No, me temo que con MySql la única solución razonablemente sencilla de implementar es hacer polling.

    Para que el polling sea lo más eficiente posible, existe un truco: en lugar de hacer el polling sobre la tabla real, lo haces sobre una tablita auxiliar que contenga un único registro. En la tabla real pones un trigger que cambie el valor de ese registro. Y en polling simplemente lees ese pequeño valor de la tabla auxiliar, que te dirá si algo ha cambiado en la tabla principal. Esto es mucho más rápido que hacer un select "grande" sobre la tabla principal para tratar de determinar si contiene algún cambio.

    miércoles, 13 de mayo de 2020 18:15
  • Gracias Alberto.

    Hay alguna manera de al crear un trigger en mysql que me envié un parámetro a un servicio web asmx.

    Es decir que el trigger que cree en vez de hacer un insert en una tabla con el dato que quiero que me lo envié a un web service

    Ejemplo de servicio web: 'http://localhost:8080/Web_Service_Online.asmx

    NO se si esto es posible.

    Por mas que busco en Internet no encuentro nada.

    1000 gracias de verdad.


    jueves, 14 de mayo de 2020 7:23
  • Hay alguna manera de al crear un trigger en mysql que me envié un parámetro a un servicio web asmx.


    No sé si se puede hacer en MySql, pero sí te puedo decir que en SQL Server es tremendamente complicado. A nada que MySql haga las cosas de forma un poco similar a SQL Server, me temo que va a resultar igualmente complicado.

    Te explico lo que se hace en SQL Server, por si acaso MySql permite algo parecido: En SQL Server habría que habilitar la integración con el CLR, constuir un ensamblado usando cualquier lenguaje de .Net, instalar ese ensamblado en la base de datos, y llamarlo desde el trigger. El ensamblado por dentro usará las funciones del Framework para llamar al servicio web. El problema es que de forma predeterminada, y por razones de seguridad, no tendrá permiso para hacerlo. Entonces hay que instalar el ensamblado con permisos de acceso externo, lo cual a su vez tiene considerables requisitos de seguridad sobre el SQL Server para que te lo permita. Una vez superado ese escollo, te encuentras con que al ejecutar el ensamblado con llamadas al servicio web te empieza a dar errores porque no encuentra determinadas referencias necesarias para hacer esas llamadas. Entonces buscas los errores en internet y acabas encontrando posts que te explican cómo solucionarlos, pero es bastante complejo. Y luego está el problema de que el trigger se vuelve muy lento porque no termina de ejecutar hasta que la llamada al servicio web se completa. Y si tratas de hacerla asíncrona, te vuelves a topar de nuevo con los problemas de seguridad porque no te permite crear el hilo desde dentro de ese proceso. Total, un lío enorme. No sé si en MySql hay funcionalidad análoga a esta o tiene restricciones parecidas, pero si quieres ir por esta vía prepárate para sufrir muchísimo.

    jueves, 14 de mayo de 2020 7:52
  • Muchas gracias por todo.

    Te lo agradezco.

    jueves, 14 de mayo de 2020 7:59