Trigger

Buenos días,
mi pregunta es la siguiente. He hecho un procedimiento para la modificación de datos entre dos bases de datos diferentes, es decir, que si yo modifico en una se actualice en la otra. Pues bien, necesito saber cómo marcarlo para que si yo ejecuto ese procedimiento no salte el disparador, osea, detecte que la modificación proviene de ese procedimiento. Se que hay que declarar una variable en el procedimiento, que lo marque, lo que no se si hay que declararlo en la cabecera como parámetro de salida, y en el trigger cómo "invocar" a esa variable, porque si la declaro, me actualiza su valor
Gracias de antemano.
Un saludo

2 respuestas

Respuesta
1
Lo que se puede hacer es declarar una variable dentro de la especificación de un paquete para que la variable sea pública y sea visible desde el trigger con valor por defecto true. Cuando comienzao la ejecución del procedimiento pongo esa variable a false por ejemplo y cuando finalizo a true.
En el trigger puedo preguntar por esa variable pública si es true ejecuto el contenido del trigger y si es false no hago nada.
¿No se si esto responde a tu pregunta?
Respuesta
1
Se puede implementar con una variable global o una tabla centinela, el trigger tendría que verificar si hay algo en esa variable que por defecto seria nula, a menos que el procedimiento sea llamado, el cual pone un valor... y con esto la acción del trigger se condiciona.
Buenos días, más o menos esa era mi idea, pero lo que no se es dónde ni como declarar la variable como global. Luego claro, el trigger tiene que ver ese valor para que condicione su ejecución.
La opción más sencilla seria usar una tabla con la que guardaríamos un "centinela".
CREATE TABLE centinel (is_run as char(1))
en el procedure al iniciar ... o antes de insertar
INSERT INTO centinel (is_run) VALUES ('Y'); COMMIT;
Y despues de insertar o antes de salir
DELETE FROM centinel; COMMIT;
En el trigger debe haber una consulta a centinel y una evaluación del resultado para proceder con la replicación.
SELECT count(*) INTO hay_procedure FROM centinel;
IF hay_procedure=0 THEN
      --Replica
La pregunta que surge ¿Qué tanta carga de transacciones tienes? ... Hay un evento de concurrencia que este esquema tendría problemas en resolver: un insert a la tabla a replicar y ejecutar el procedure al mismo tiempo. Para evitar este evento, se tendría que serializar las transacciones o bloquear la tabla completa, etc.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas