¿Hay una buena manera de ejecutar un activador para cada registro en una tabla de postgres?


22

Tengo un sistema en el que no puedo controlar el diseño de algunas tablas (replicado a través de Slony-I), por lo que tengo una serie de lo que llamamos 'tablas de sombra', donde extraigo información de las tablas replicadas , y guárdelo en la forma procesada que necesito, mientras elimino los registros que quiero ignorar.

En este momento, después de configurar una nueva réplica, ejecuto una actualización y vuelvo a establecer un valor en sí mismo (p. Ej. UPDATE tablename SET field=field) Para forzar la ejecución del disparador, pero algunas de las tablas son millones de registros y crecen, y puede tomar 30 minutos . (Y luego está el vacío, también).

¿Hay alguna forma mejor de activarlo, o alguna forma de escribir una función de manera que funcione con la entrada pasada o NEWdependiendo del contexto de llamada? Soy reacio a mantener dos funciones diferentes, como he visto muchas veces donde una se actualiza y no la otra.


Sabía cómo ejecutar un gatillo ... pregunté si había una buena manera.
Joe

Respuestas:


19

Se puede hacer usando la siguiente plantilla:

CREATE TABLE tablename ( ... );

/* for direct invocation */
CREATE FUNCTION propagate_data(newrow tablename) RETURNS void
LANGUAGE plpgsql
AS $$
BEGIN
    INSERT INTO other_table VALUES (newrow.a, newrow.b, ...);
END:
$$;

/* trigger function wrapper */
CREATE FUNCTION propagate_data_trg() RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
    PERFORM propagate_data(NEW);
END;
$$;

CREATE TRIGGER propagate_data AFTER INSERT ON tablename FOR EACH ROW
    EXECUTE PROCEDURE propagate_data_trg();

Doh ... estaba pensando en eso al revés (tratando de hacer que la función de disparo se pueda llamar mediante un procedimiento, no al revés).
Joe

1
Cuando realmente lo hice, me di cuenta de que 'fila' era una palabra reservada, así que corregí el ejemplo para que otros no pasaran tanto tiempo depurando.
Joe

1
Realmente debería haber seguido hace años. Me llevó bastante tiempo lograr que todo funcionara en mi sistema ... y este método funciona, pero el rendimiento fue terrible. (pasó de 30 minutos a más de un día para completar).
Joe
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.