[PostgreSQL] Problem z funkcją przed update |
[PostgreSQL] Problem z funkcją przed update |
21.06.2014, 11:38:36
Post
#1
|
|
Grupa: Zarejestrowani Postów: 4 Pomógł: 0 Dołączył: 8.06.2014 Ostrzeżenie: (0%) |
Cześć wszystkim,
Mam problem z funkcją, która sprawdza kwotę kary pieniężnej za przetrzymaną książkę i wpisuje ją do odpowiedniej kolumny. Problem jest taki, że próbowałem na różne sposoby zmienić tą funkcję, a problem wyskakuje wciąż ten sam. Ostatnia aktualizacja błędu wraz z kodem funkcji poniżej: KOD FUNKCJI:
KOD BŁĘDU: ERROR: stack depth limit exceeded HINT: Increase the configuration parameter "max_stack_depth". CONTEXT: SQL statement "SELECT 1 FROM ONLY "public"."books" x WHERE "isbn" = $1 FOR SHARE OF x" SQL statement "UPDATE borrowed_books SET amount_of_fine = $1 * (SELECT value FROM rules WHERE rules_id = 1) WHERE borrowed_books.book_borrowing_id = $2 " Z góry dziękuję za pomoc. |
|
|
21.06.2014, 11:51:20
Post
#2
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) |
Czy mi się wydaje czy w tym triggerze odpalasz zawsze zapytanie UPDATE na tej samej tabeli co skutkuje zapętleniem całości? Zamiast wykonywać zapytania UPDATE po prostu zmień wartość rekordu z NEW:
|
|
|
21.06.2014, 12:46:54
Post
#3
|
|
Grupa: Zarejestrowani Postów: 4 Pomógł: 0 Dołączył: 8.06.2014 Ostrzeżenie: (0%) |
Czyli jeśli w triggerze występuje Update to znowu "załącza się" ten sam trigger i tak w kółko? A więc tak działa rekurencja w PSQL Ok, w takim razie funkcja jest trochę odchudzona, lecz w tym problem że nie chce się zapisać kwota kary do tabeli (Nie wiem jak, ale sposób NEW.amount_of_fine = ... nie działa). Może mi ktoś wytłumaczyć jak to zrobić? Próbowałem rzutować, kombinować ze zmiennymi roznica_dat i (SELECT value ...) ale raczej nie tutaj jest problem.
FUNKCJA PO ODCHUDZENIU:
EDIT: Jeśli to potrzebne to kolumna amount_of_fine jest typu real, i select też wyrzuca typ real. Wpadłem jeszcze na pomysł, aby po prostu usunąć ten wiersz w którym zachodzi update i wstawić go na nowo, ale sądzę iż ktoś zna lepszy sposób na to. EDIT2: Ok, problem tkwił w ustawieniu triggera, który musi być before update zamiast after update (wtedy zadziałało, choć byłoby miło jakby ktoś mi wytłumaczył dlaczego). Dziękuję za pomoc Crozin . Ten post edytował KcR 21.06.2014, 13:03:00 |
|
|
21.06.2014, 12:57:25
Post
#4
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) |
= to operator porównania, := to operator przypisania.
|
|
|
Wersja Lo-Fi | Aktualny czas: 19.04.2024 - 10:48 |