Función y disparador en PostgreSQL para contener cambios.
Quiero implementar una función y un trigger (sin parámetros) que permitan hacer cambios en una tabla B siempre y cuando se hagan en la tabla D. Lo que quiero decir con cambios son inserciones, actualizaciones o eliminaciones.
Por ejemplo, si elimino, actualizo o inserto un registro en la tabla D, necesito que también se haga automáticamente en la tabla B y me devuelva los nuevos valores agregados.
He diseñado esta tabla D de tal manera que tiene una clave primaria compuesta por 3 valores que obtiene de otras tablas (tabla A, tabla C y tabla D).
Por ejemplo, tengo:
TABLA A
x int (clave primaria)
y carácter
z carácter
TABLA C
a int (clave primaria)
b carácter
c carácter
TABLA D
x (clave primaria)
a (clave primaria)
dd (clave primaria)
ddd
dddd
TABLA B
x (clave primaria)
a (clave primaria)
dd (clave primaria)
bbb
bbbb
La estructura debería ser algo similar a lo siguiente. He pensado en implementar varios TG_OP en función de varios IF, pero no puedo conseguir un resultado satisfactorio.
CREAR FUNCIÓN función()
RETORNA TRIGGER LENGUAJE plpgsql COMO $$
COMENZAR
DEVOLVER new;
FIN;
$$;
CREAR TRIGGER trigger
DESPUÉS DE ACTUALIZAR EN tabla D
PARA CADA FILA EJECUTAR PROCEDIMIENTO función();
Gracias a todos.
davy.ai
Para implementar la función y el desencadenador deseados, puede utilizar una combinación de desencadenadores y una instrucción IF en la función de desencadenador.
Primero, cree el desencadenador para que se active después de cualquier actualización, inserción o eliminación en la tabla D:
Luego, cree la función de desencadenador
sync_trigger_function
que modificará la tabla B en consecuencia:En la función de desencadenador, puede verificar el valor de
TG_OP
para determinar el tipo de operación que se está realizando (eliminar, actualizar o insertar). Dependiendo de la operación, puede modificar la tabla B en consecuencia.Por ejemplo, si la función de desencadenador detecta una operación de eliminación, elimina la fila correspondiente de la tabla B en función de los valores de clave principal en
OLD
. Si detecta una operación de actualización, actualiza la columnabbb
en la tabla B en función de los valores de clave principal enNEW
. Si detecta una operación de inserción, inserta una nueva fila en la tabla B con los valores deNEW
.Finalmente, puede probar el desencadenador realizando algunas operaciones en la tabla D:
Después de cada operación, revise la tabla B para ver si se ha modificado en consecuencia.