Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Funkcja kasująca dane
Forum PHP.pl > Forum > Bazy danych > PostgreSQL
czachor
Witam!
Zaczynam działać z postgresem i natrafiłem na pewien problem...

Mam utworzoną tabelę:
  1. CREATE TABLE "users" (
  2. "ip" inet NOT NULL,
  3. "timer" timestamp without time zone NOT NULL
  4. ) WITH OIDS;


Chciałbym, żeby przy wykonywaniu INSERT'ów automatycznie kasowane były wpisy starsze niż 1 dzień... Tu mam problem...

Tworzę do tego procedurę:
  1. CREATE TRIGGER delete_users BEFORE INSERT ON users FOR EACH ROW EXECUTE PROCEDURE del_older();

I funkcja del_older:
Kod
    BEGIN
         DELETE FROM users WHERE timer < '1 day'::interval;
    END;
(Zapytanie SQL jest dobre)

Niestety przy wstawianiu danych do tabeli 'users' otrzymuję błąd:
Cytat
ERROR:  control reached end of trigger procedure without RETURN
CONTEXT:  PL/pgSQL function "del_older"

Próbowałem wstawić return wzorując się na manualu postgresa, jak i stworzyć na jego podstawie prawidłową funkcję, ale nic mi nie wychodzi sad.gif

Będę wdzięczny za pomoc...
Jabol
po pierwsze, po co 'for each row'. Nie znam się na triggerach, ale tutaj masz dokładnie o count() - 1 razy za często wykonywaną operację.
a co do zapytania. Wydaje mi się, że Twoja funkcja powinna coś zwracać (cokolwiek, poczytaj w dokumentacji triggerów co mają zwracać).
czachor
No fakt, 'for each row' raczej niepotrzebne. Dzięki.

Kombinuję z tym returnem, ciężko mi to idzie, póki co udało mi się zrobić to na regułach (rules):
  1. CREATE RULE del_old AS ON INSERT TO users DO DELETE
  2. FROM users WHERE (users.timer < (now() - '1 day'::interval));

Jeżeli ktoś będzie wiedział, jak zrobić sprawę na triggerach, będę wdzięczny.

--UPDATE
I po problemie...
Poprawna funkcja del_older():
Kod
CREATE OR REPLACE FUNCTION del_older() RETURNS trigger AS '
    BEGIN
        DELETE FROM "users" WHERE ("timer" < (NOW() - \'1 day\'::interval));
        RETURN NULL;
   END;
' LANGUAGE plpgsql;
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.