PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

postgres. plpgsql limite di profondità dello stack superato

Ok, se vuoi davvero che il trigger venga aggiornato, cosa potresti fare imposta questo trigger come specifico per la colonna, in modo che non venga attivato su un aggiornamento a all_books , che sta causando la tua ricorsione. Qualcosa del genere -

create trigger total2
after update of copy_id
on totalbooks
for each row
execute procedure total1();

Ovviamente puoi cambiare le colonne che attivano la funzione, ho appena scelto copy_id perché è quello che stai contando.

TUTTAVIA

Se stai aggiornando con un count() risultato, puoi semplicemente attivare il trigger su INSERT e DELETE Azioni. In questo modo il trigger si attiverà quando il conteggio cambia, ma non verrà attivato dall'aggiornamento. // EDIT:Dal tuo sum è solo un conteggio di tutti i record in copies , cambierà solo quando un record viene inserito o aggiornato, quindi eseguire questo trigger all'aggiornamento non avrebbe comunque senso.

EDIT:ho pensato che sarebbe stato utile aggiungere un collegamento a CREATE Documentazione TRIGGER . Vedi la sezione denominata "evento", perché spiega come specificare le colonne nell'evento.

MODIFICA PER NUOVE INFORMAZIONI:

Dato quello che sembra che tu debba realizzare, penso che tu debba ripensare alla progettazione dei tuoi dati, ti suggerisco di utilizzare una relazione genitore-figlio (ogni volta che stai memorizzando nella cache dati condivisi su molte righe in una tabella perché condividono qualcosa in comune, quello è un segno che potresti invece aver bisogno di una tabella padre).

Avere un books tabella in cui ogni riga contiene informazioni su un libro (titolo, autore, ecc.), e quindi avere una copies tabella in cui ogni riga contiene informazioni su una copia di un libro (numero di serie, ultimo estratto, ecc.).

In questo modo, ottenere il conteggio delle copie è semplice come SELECT COUNT(*) FROM copies WHERE book_id=[some book id] .

Se vuoi davvero memorizzare nella cache il conteggio da qualche parte, fallo sui books tavolo.

Crea un INSERT OR UPDATE attiva su copies che fa UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=NEW.book_id) WHERE id=NEW.book_id .

Quindi crea un DELETE trigger su copie che UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=OLD.book_id) WHERE id=OLD.book_id

Il motivo di due trigger è che il NEW la variabile è disponibile solo in INSERT o UPDATE attivatori e OLD è disponibile solo in DELETE trigger. Potresti fare tutto come un trigger, ma ciò richiede più codice di quello che volevo inserire qui.

Assicurati che tutti i tuoi attivatori siano AFTER attivatori, altrimenti una riga appena inserita/eliminata non verrà considerata nel conteggio.