C'è un buon modo per eseguire un trigger per ogni record in una tabella postgres?


22

Ho un sistema in cui non riesco a controllare la progettazione di alcune tabelle (replicate tramite Slony-I), e quindi ho una serie di quelli che chiamiamo "tabelle d'ombra", dove estraggo alcune informazioni dalle tabelle replicate e archiviarlo nella forma elaborata di cui ho bisogno, eliminando i record che voglio ignorare.

In questo momento, dopo aver impostato una nuova replica, eseguo un aggiornamento e ripristino un valore su se stesso (ad es. UPDATE tablename SET field=field) Per forzare l'esecuzione del trigger, ma alcune tabelle sono milioni di record e in crescita e possono richiedere 30 minuti . (e poi c'è anche il vaccuum).

Esiste un modo migliore per attivarlo o un modo per scrivere una funzione in modo che funzioni con l'input passato o in NEWbase al contesto di chiamata? Sono riluttante a mantenere due diverse funzioni, come ho visto troppe volte in cui una viene aggiornata e non l'altra.


Sapevo come azionare un grilletto ... Ho chiesto se c'era un buon modo.
Joe,

Risposte:


19

Può essere fatto utilizzando il seguente modello:

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 ... Ci stavo pensando all'indietro (cercando di rendere la funzione trigger richiamabile con una procedura, non viceversa).
Joe

1
Quando l'ho effettivamente fatto, mi sono reso conto che "riga" era una parola riservata, quindi ho corretto l'esempio in modo che gli altri non impiegassero troppo tempo nel debug.
Joe,

1
Avrei dovuto seguirlo anni fa. Mi ci è voluto un po 'di tempo prima che riuscissi a far funzionare tutto nel mio sistema ... e questo metodo funziona, ma le prestazioni sono state terribili. (il completamento è durato da 30 minuti a oltre un giorno).
Joe,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.