PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

postgres. Przekroczono limit głębokości stosu plpgsql

Ok, jeśli naprawdę chcesz wyzwalacz przy aktualizacji, co możesz zrobić, ustaw ten wyzwalacz jako specyficzny dla kolumny, aby nie był uruchamiany przy aktualizacji all_books , który powoduje twoją rekurencję. Coś takiego -

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

Oczywiście możesz zmienić, które kolumny uruchamiają funkcję, po prostu wybrałem copy_id bo to właśnie liczysz.

JEDNAK

Jeśli aktualizujesz za pomocą count() wynik, możesz po prostu umieścić wyzwalacz na INSERT i DELETE działania. W ten sposób wyzwalacz zostanie uruchomiony, gdy zmieni się liczba, ale sam nie zostanie wyzwolony przez aktualizację. // EDYCJA:Od Twojej sum to tylko liczba wszystkich rekordów w copies , zmieni się tylko po wstawieniu lub zaktualizowaniu rekordu, więc uruchomienie tego wyzwalacza podczas aktualizacji i tak nie miałoby sensu.

EDYCJA:Pomyślałem, że warto dodać link do CREATE Dokumentacja TRIGGERa . Zobacz sekcję o nazwie „zdarzenie”, ponieważ zawiera ona szczegółowe informacje na temat określania kolumn w zdarzeniu.

EDYTUJ W CELU NOWYCH INFORMACJI:

Biorąc pod uwagę to, co brzmi jak musisz osiągnąć, myślę, że musisz przemyśleć swój projekt danych, sugeruję użycie relacji rodzic-dziecko (za każdym razem, gdy buforujesz współdzielone dane w wielu wierszach w tabeli, ponieważ mają one coś wspólnego, że to znak, że możesz potrzebować tabeli nadrzędnej).

Mieć books tabela, w której każdy wiersz zawiera informacje o jednej książce (tytule, autorze itp.), a następnie zawiera copies tabela, w której każdy wiersz zawiera informacje o jednym egzemplarzu książki (numer seryjny, ostatnie wyewidencjonowanie itp.).

W ten sposób uzyskanie liczby kopii jest tak proste, jak SELECT COUNT(*) FROM copies WHERE book_id=[some book id] .

Jeśli naprawdę chcesz gdzieś zapisać licznik, zrób to w books stół.

Utwórz INSERT OR UPDATE wyzwalacz na copies to robi UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=NEW.book_id) WHERE id=NEW.book_id .

Następnie utwórz DELETE wyzwalacz dla kopii, które wykonują UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=OLD.book_id) WHERE id=OLD.book_id

Powodem dwóch wyzwalaczy jest to, że NEW zmienna jest dostępna tylko w INSERT lub UPDATE wyzwalacze i OLD jest dostępny tylko w DELETE wyzwalacze. Możesz zrobić to wszystko jako jeden wyzwalacz, ale wymaga to więcej kodu, niż chciałem tutaj umieścić.

Upewnij się, że wszystkie wyzwalacze są AFTER wyzwalacze, w przeciwnym razie nowo wstawiony/usunięty wiersz nie zostanie uwzględniony w liczniku.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nie można połączyć się z serwerem:postgresql na ubuntu w podsystemie windows dla linux

  2. Jak stworzyć użytkownika za pomocą PSQL

  3. pg_stat_activity - jak zobaczyć bieżącą aktywność wewnątrz uruchomionej procedury składowanej

  4. Tablica jsonb Postgres 9.4 jako tabela

  5. Zniszczenie bazy danych Postgres na Heroku