PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

postgres. limite de profondeur de pile plpgsql dépassée

Ok, si vous voulez vraiment le déclencheur lors de la mise à jour, ce que vous pouvez faire, c'est définir ce déclencheur comme spécifique à une colonne, afin qu'il ne soit pas déclenché lors d'une mise à jour de all_books , ce qui provoque votre récursivité. Quelque chose comme ça -

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

Bien sûr, vous pouvez changer les colonnes qui déclenchent la fonction, j'ai juste choisi copy_id parce que c'est ce que vous comptez.

CEPENDANT

Si vous mettez à jour avec un count() résultat, vous pouvez simplement mettre le déclencheur sur INSERT et DELETE Actions. De cette façon, le déclencheur se déclenchera lorsque le nombre changera, mais ne sera pas lui-même déclenché par la mise à jour. // EDIT :Depuis votre sum n'est qu'un décompte de tous les enregistrements en copies , il ne changera que lorsqu'un enregistrement est inséré ou mis à jour, donc exécuter ce déclencheur lors de la mise à jour n'aurait aucun sens de toute façon.

EDIT :j'ai pensé qu'il serait utile d'ajouter un lien vers le CREATE Documentation DÉCLENCHEUR . Consultez la section intitulée "événement", car elle détaille comment spécifier des colonnes dans l'événement.

MODIFIER POUR NOUVELLES INFORMATIONS :

Compte tenu de ce que vous semblez devoir accomplir, je pense que vous devez repenser la conception de vos données, je vous suggère d'utiliser une relation parent-enfant (chaque fois que vous mettez en cache des données partagées sur plusieurs lignes d'une table parce qu'elles partagent quelque chose en commun, cela est un signe que vous pourriez avoir besoin d'une table parent à la place).

Avoir un books tableau où chaque ligne contient des informations sur un livre (titre, auteur, etc.), puis contient un copies table où chaque ligne contient des informations sur un exemplaire d'un livre (numéro de série, dernier extrait, etc.).

De cette façon, obtenir le nombre de copies est aussi simple que SELECT COUNT(*) FROM copies WHERE book_id=[some book id] .

Si vous voulez vraiment mettre le décompte en cache quelque part, faites-le sur les books table.

Créer un INSERT OR UPDATE déclencheur sur les copies qui fait UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=NEW.book_id) WHERE id=NEW.book_id .

Créez ensuite un DELETE déclencheur sur les copies qui effectue UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=OLD.book_id) WHERE id=OLD.book_id

La raison de deux déclencheurs est que le NEW la variable n'est disponible que dans INSERT ou UPDATE déclencheurs et OLD n'est disponible que dans DELETE déclencheurs. Vous pouvez tout faire en un seul déclencheur, mais cela nécessite plus de code que je ne voulais en mettre ici.

Assurez-vous que tous vos déclencheurs sont AFTER déclencheurs, sinon une ligne nouvellement insérée/supprimée ne sera pas prise en compte dans le décompte.