Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> TG_OP + column "INSERT" does not exist
phpion
post
Post #1





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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

Ten post edytował phpion 3.04.2008, 06:11:39
Go to the top of the page
+Quote Post
Sedziwoj
post
Post #2





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
phpion
post
Post #3





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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
Go to the top of the page
+Quote Post
Sedziwoj
post
Post #4





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
phpion
post
Post #5





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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... (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował phpion 3.04.2008, 20:48:59
Go to the top of the page
+Quote Post
Sedziwoj
post
Post #6





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Zdjęcie
Jak widać mam takie opcje wyboru... (chyba że źle rozumiem)
Go to the top of the page
+Quote Post
phpion
post
Post #7





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




(IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/wstydnis.gif) Twój screenshot okazał się bardzo przydatny (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) idę teraz zapaść się pod ziemię.
Dzięki!
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 18.09.2025 - 14:16