Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: TG_OP + column "INSERT" does not exist
Forum PHP.pl > Forum > Bazy danych > PostgreSQL
phpion
Witam,
mam pewien problem z prościutkim triggerem pod PostgreSQL 8.3:
  1. CREATE OR REPLACE FUNCTION categories_products_amount() RETURNS TRIGGER AS '
  2. BEGIN IF (TG_OP = "INSERT" OR TG_OP = "UPDATE") THEN
  3. UPDATE categories SET products=(SELECT COUNT(*) FROM products WHERE category_id=NEW.category_id) WHERE id=NEW.category_id;
  4. END IF;
  5.  
  6. IF (TG_OP = "DELETE" OR TG_OP = "UPDATE") THEN
  7. UPDATE categories SET products=(SELECT COUNT(*) FROM products WHERE category_id=OLD.category_id) WHERE id=OLD.category_id;
  8. END IF;
  9.  
  10. RETURN NULL;
  11. END;
  12. ' LANGUAGE 'plpgsql';
  13.  
  14.  
  15. CREATE TRIGGER categories_products_amount AFTER INSERT OR UPDATE OR DELETE ON products
  16. FOR EACH ROW EXECUTE PROCEDURE categories_products_amount();

Całość tworzy się ładnie, bez żadnego błędu. Problem natomiast powstaje w przypadku wykonywania modyfikacji (I, U, D) na tabeli products. Wówczas otrzymotrzymuję błąd:
Kod
Column "INSERT" does not exits.
IF ($1 = "INSERT" OR $1 = "UPDATE")

W czym problem?
Próbując zmienić "INSERT" itp. na 'INSERT' (jak to jest pokazane w manualu) funkcja w ogóle się nie tworzy - od razu rzuca błędami (oczywiście zmieniam również ' poza ciałem funkcji).
Prosiłbym o pomoc,
pion
Sedziwoj
Na pewno nie "INSERT" a 'INSERT' i to zmień, na pewno da inny komunikat. Więc zmień i go podaj, on coś powie, bo obecny właśnie o tym co napisałem mówi.
phpion
Dzięki za naprowadzenie. W końcu całość działa:
  1. CREATE OR REPLACE FUNCTION categories_products_amount() RETURNS TRIGGER AS $$
  2. BEGIN IF (TG_OP = 'INSERT' OR TG_OP = 'UPDATE') THEN
  3. UPDATE categories SET products=(SELECT COUNT(*) FROM products WHERE category_id=NEW.category_id) WHERE id=NEW.category_id;
  4. END IF;
  5.  
  6. IF (TG_OP = 'DELETE' OR TG_OP = 'UPDATE') THEN
  7. UPDATE categories SET products=(SELECT COUNT(*) FROM products WHERE category_id=OLD.category_id) WHERE id=OLD.category_id;
  8. END IF;
  9.  
  10. RETURN NULL;
  11. END;
  12. $$ LANGUAGE plpgsql;

Mam jednak kilka pytań odnośnie programy pgAdmin III - nie będę zakładał osobnego wątku tylko pozwolę sobie kontynuować w tym:
1. Gdzie ustawia się moment uruchomienia triggera (BEFORE/AFTER INSERT/UPDATE/DELETE) w "kreatorze" triggerów (Funkcje trigger -> Nowa funkcja...). Ja osobiście takowej możliwości nie widzę...
2. Tworząc tabelę "kreatorem" (Tabele -> Nowa tabela...) nie widzę możliwości zamiany kolumn miejscami.
3. Czy gdzieś mogę zobaczyć diagram przedstawiający tabele oraz relacje pomiędzy nimi?

Pozdrawiam,
pion
Sedziwoj
Cytat(phpion @ 3.04.2008, 16:44:31 ) *
1. Gdzie ustawia się moment uruchomienia triggera (BEFORE/AFTER INSERT/UPDATE/DELETE) w "kreatorze" triggerów (Funkcje trigger -> Nowa funkcja...). Ja osobiście takowej możliwości nie widzę...

Ja mam pgAdmin 1.8.2 i mam to na pierwszej zakładce.
Cytat
2. Tworząc tabelę "kreatorem" (Tabele -> Nowa tabela...) nie widzę możliwości zamiany kolumn miejscami.

Bo właściwie nie istnieje takie coś jak kolejność kolumn, tak jak nie ma kolejności krotek, po prostu to są zbiory, że mają jakąś tam fizyczną kolejność to już inna sprawa, nie powinno się o nią dbać ani na niej opierać.
Cytat
3. Czy gdzieś mogę zobaczyć diagram przedstawiający tabele oraz relacje pomiędzy nimi?

Zależności możesz sprawdzić w pgAdminie, a do kreowania diagramów to np. Aqua Data Studio
phpion
Hmmm zaintrygowałeś mnie tą pierwszą zakładką. Metodą prób i błędów doszedłem do tego, że należy zaznaczyć "Ustawione zwrócenia" co spowoduje aktywację pola "Szacunkowo wiersze" i w nim można wpisać momenty odpalania triggera. Wygenerowany dynamicznie kod SQL wskazuje, że to chyba to. Swoją drogą: bardzo intuicyjne nazwy... blinksmiley.gif

To jednak nie to :/ Nie mam więc pojęcia gdzie te dane ustawić...

Jeśli chodzi o kolejność pól: szkoda, wolę mieć porządek smile.gif
Program przez Ciebie podany zapowiada się bardzo obiecująco. Do tej pory używałem DBDesignera no ale różnie to z nim bywało...
Tak czy siak dzięki serdeczne za bardzo konkretną i, co najważniejsze, skuteczną pomoc smile.gif
Sedziwoj
Zdjęcie
Jak widać mam takie opcje wyboru... (chyba że źle rozumiem)
phpion
sciana.gif
Hehe, szukałem w złym miejscu. Nie:
Schematy -> public -> Funkcje trigger -> Nowa funkcja trigger...
tylko:
Schematy -> public -> Tabele -> [tabela] -> Triggery -> Nowy trigger...
Jeju, ale wstyd wstydnis.gif Twój screenshot okazał się bardzo przydatny smile.gif idę teraz zapaść się pod ziemię.
Dzięki!
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.