none
Trigger en Sql Server RRS feed

  • Pregunta

  • Hola a todos.

    Tengo un trigger en sql server que se dispara cuanto se inserta, se actualiza y se elimina.
    Y tambien tengo una aplicación en .NET que me manipula la tabla que tiene el trigger.

    ¿Quiero saber como puedo capturar en mi aplicacion cuando se ejecuto el trigger?

    Muchas gracias por su ayuda

    martes, 20 de octubre de 2009 15:07

Respuestas

  • Lo que usted debe hacer es programar su código para manejar concurrencia pesimista. En este artículo (en inglés) se explican los detalles:

    Pessimistic locking solves ADO.NET concurrency problems
    http://articles.techrepublic.com.com/5100-10878_11-1049842.html

    En pocas palabras, usted debe lockear las filas que lee para modificar. El lock evitará que otra sesión modifique las filas que usted está editando. Los pasos, a alto nivel son:

    1. Crear una transacción txn con IsolationLevel = RepeatableRead.
    2. Configure la propiedad SelectCommand del DataAdapter para que use la transacción txn.
    3. Asigne la transacción txn a las propiedades de los comandos INSERT, UPDATE y DELETE.
    4. Ejecute el método Update del DataAdapter.
    5. Aplique el commit a la transacción txn.


    Gustavo Larriera Sosa [ascii164.blogspot.com] /*Este mensaje se proporciona tal como es, sin garantías de ninguna clase.*/
    martes, 20 de octubre de 2009 16:59
    Moderador

Todas las respuestas

  • Tal vez no pude comprender la pregunta, pero... cuando cualquier INSERT, UPDATE o DELETE termine sin error, el trigger se habrá ejecutado.
    Gustavo Larriera Sosa [ascii164.blogspot.com] /*Este mensaje se proporciona tal como es, sin garantías de ninguna clase.*/
    martes, 20 de octubre de 2009 15:36
    Moderador
  • Hola Gustavo L.

    Lo unico que quiero es que desde el Visual Studio 2008 .NET me diga si el trigger se a ejecutado...
    no importa si saco error o si termino bien.

    solo saber si hubo una ejecucion?

    gracias por su ayuda
    martes, 20 de octubre de 2009 16:00
  • Hola.

    Partiendo de la base de que los triggers no me gustan un pelo, si necesitas tener constancia de la ejecución del trigger, puedes modificar el trigger para que además de hacer aquello que haga te deje un log en otra parte (insertar un registro en una tabla, generar un raiserror de severidad baja, pero capturable por tu aplicación, etc).




    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    martes, 20 de octubre de 2009 16:15
    Moderador
  • Hola.

    Partiendo de la base de que los triggers no me gustan un pelo, si necesitas tener constancia de la ejecución del trigger, puedes modificar el trigger para que además de hacer aquello que haga te deje un log en otra parte (insertar un registro en una tabla, generar un raiserror de severidad baja, pero capturable por tu aplicación, etc).




    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)

    Hola gracias por contestar

    Me gusta mucho esa opcion pero para leer ese registro LOG hago un timer que me lo lea costantemente o hay una mejor forma???

    un saludo
    martes, 20 de octubre de 2009 16:24
  • Hola.

    Al desconocer el fondo del asunto es difícil aconsejarte. Puedes hacer uso de un temporizador en la aplicación, un job en el servidor,...


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    martes, 20 de octubre de 2009 16:32
    Moderador
  • Hola.

    Al desconocer el fondo del asunto es difícil aconsejarte. Puedes hacer uso de un temporizador en la aplicación, un job en el servidor,...


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    Hola.

    mira te explico bien mi problema a ver si existe otra solucion mejor que por la base de datos o con trigger

    es una aplicacion en la cual voy a insertar, eliminar y actualizar productos.
    y lo hago por dataset y todo sale muy bien, me hace todo lo que necesito.

    Cuando dos Usuarios A y B ejecutan el programa y se conectan a la misma base de datos
    les carga sin problemas los productos.

    Pero digamos que el usuario A modifico un producto y el usuario B modifico otro diferente.
    al momento de guardar.

            Me.Validate()
            Me.PRODUCTOSBindingSource.EndEdit()
            Me.TableAdapterManager.UpdateAll(Me.DataSetProductos)

    Me sale error diciendome que el Update tiene 0 modificaciones

    Como es la mejor forma de evitar este error o recargar los datos cuando un
    usuario modifique la tabla Productos.
    Ya que no quiero que se puerda lo que ha modificado porque son muchos campos.

    Gracias por su ayuda


    martes, 20 de octubre de 2009 16:43
  • Lo que usted debe hacer es programar su código para manejar concurrencia pesimista. En este artículo (en inglés) se explican los detalles:

    Pessimistic locking solves ADO.NET concurrency problems
    http://articles.techrepublic.com.com/5100-10878_11-1049842.html

    En pocas palabras, usted debe lockear las filas que lee para modificar. El lock evitará que otra sesión modifique las filas que usted está editando. Los pasos, a alto nivel son:

    1. Crear una transacción txn con IsolationLevel = RepeatableRead.
    2. Configure la propiedad SelectCommand del DataAdapter para que use la transacción txn.
    3. Asigne la transacción txn a las propiedades de los comandos INSERT, UPDATE y DELETE.
    4. Ejecute el método Update del DataAdapter.
    5. Aplique el commit a la transacción txn.


    Gustavo Larriera Sosa [ascii164.blogspot.com] /*Este mensaje se proporciona tal como es, sin garantías de ninguna clase.*/
    martes, 20 de octubre de 2009 16:59
    Moderador
  • Hola.

    No creo que sea buena idea que se actualice toda la tabla de golpe, sino sólo aquellos registros afectados. Si es ese el caso, el problema de concurrencia sólo se daría si dos usuarios quisieran actualizar el mismo registro a la vez. Por lo que comentas, actualizas en bloques de registros y eso para la concurrencia es muy negativo.

    Si fuera esa la única alternativa (actualizar muchos registros de golpe), tendrías que impedir que dos usuarios accedieran simultáneamente a la funcionalidad o, como comentas, antes de grabar volver a actualizar y comparar los datos para que no se sobrescriban datos no deseados.

    Si finalmente optar por esa vía, la forma sería lo que comentas, consultando si desde que trajiste los datos hasta que los vas a grabar hay en el log algo que indique que la tabla ha cambiado.

    De todos modos hay numerosos mecanismos en SQL Server para implementar y facilitar estas operaciones como para hacerlo tal y como describes.



    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    martes, 20 de octubre de 2009 17:01
    Moderador