trigger z update
Piotrek+ - 07-04-2006 00:03
trigger z update
Witam, Chciałbym tak skonfigurować funkcję wyzwalaną, aby przy aktualizowaniu kopiowała wpis w obrębie tego samego wiersza rekordu.
create table klient ( id serial, klient varchar(16), klient_kopia varchar(16) -- kopia powyższego wpisu wyk. p. trig. );
insert into klient (klient) values ('basia'); insert into klient (klient) values ('ela');
CREATE FUNCTION aktualizuj() RETURNS trigger AS ' BEGIN UPDATE klient SET klient_kopia=NEW.klient WHERE id=NEW.id; RETURN NEW; END; ' LANGUAGE 'plpgsql';
CREATE TRIGGER aktualizuj AFTER UPDATE ON klient FOR EACH ROW EXECUTE PROCEDURE
update klient set klient='ania' where id=2;
Po wykonaniu ostatniego polecenia baza "wisi".. Procesor 100% i koniec. Jakieś zapętlenie?
Jakieś sugestie? Pozdrawiam.
Piotrek+ - 07-04-2006 00:03
Użytkownik Piotrek+ napisał: > Chciałbym tak skonfigurować funkcję wyzwalaną, aby przy aktualizowaniu > kopiowała wpis w obrębie tego samego wiersza rekordu. System zarządzania bazą danych to postgres 7.4 :)
Piotrek.
=?iso-8859-2?q?Marcin_St=EApnicki?= - 07-04-2006 00:07
Dnia Fri, 07 Apr 2006 00:56:13 +0200, Piotrek+ napisał(a):
> Chciałbym tak skonfigurować funkcję wyzwalaną, aby przy aktualizowaniu > kopiowała wpis w obrębie tego samego wiersza rekordu. > > create table klient ( > id serial, > klient varchar(16), > klient_kopia varchar(16) -- kopia powyższego wpisu wyk. p. trig. > ); > > insert into klient (klient) values ('basia'); > insert into klient (klient) values ('ela'); > > CREATE FUNCTION aktualizuj() RETURNS trigger AS ' > BEGIN > UPDATE klient SET klient_kopia=NEW.klient WHERE id=NEW.id; > RETURN NEW; > END; > ' LANGUAGE 'plpgsql'; > > CREATE TRIGGER aktualizuj AFTER UPDATE ON klient FOR EACH ROW EXECUTE > PROCEDURE > > update klient set klient='ania' where id=2; > > Po wykonaniu ostatniego polecenia baza "wisi".. Procesor 100% i koniec. > Jakieś zapętlenie?
W funkcji wywoływanej przez trigger na update masz znowu update więc trigger jest znowu wyzwalany i tak dalej...
-- | Where there's a boy to give his heart | http://apcoln.linuxpl.org | There's a woman to tear it apart | http://biznes.linux.pl |---------------------------------------| http://www.juanperon.info | JID: http://www.naszedzieci.org
Piotrek+ - 07-04-2006 00:13
Użytkownik Marcin Stępnicki napisał:
> W funkcji wywoływanej przez trigger na update masz znowu update więc > trigger jest znowu wyzwalany i tak dalej... >
Faktycznie.. Chociaż nie chce mi się wierzyć, aby nie było możliwości obejścia tego problemu. Może jakaś propozycja?
Piotrek.
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 08-04-2006 00:04
Użytkownik Piotrek+ napisał: > Użytkownik Marcin Stępnicki napisał: > >> W funkcji wywoływanej przez trigger na update masz znowu update więc >> trigger jest znowu wyzwalany i tak dalej... >> > > Faktycznie.. Chociaż nie chce mi się wierzyć, aby nie było możliwości > obejścia tego problemu. Może jakaś propozycja?
Po co obchodzić? Lepiej go nie stworzyć problemu.
NEW.klient_kopia = NEW.klient
-- P.M.
Piotrek+ - 09-04-2006 00:19
Użytkownik Paweł Matejski napisał:
> Po co obchodzić? Lepiej go nie stworzyć problemu. > > NEW.klient_kopia = NEW.klient
Nadal nie bardzo rozumiem. Przepraszam, ale to mój pierwszy trigger i pewnie dlatego takie schody :) Po poprawieniu zawart. funkcji na:
UPDATE klient SET NEW.klient_kopia=NEW.klient WHERE id=NEW.id;
Wyświetlany jest błąd:
piotrek=> update klient set klient='ania' where id=2; ERROR: syntax error at or near "$1" at character 20 CONTEXT: PL/pgSQL function "aktualizuj" line 2 at SQL statement
I znowu dołek :/
Brzezi - 09-04-2006 00:19
sob, 08 kwi 2006 o 13:04 GMT, Piotrek+ napisał(a):
> UPDATE klient SET NEW.klient_kopia=NEW.klient WHERE id=NEW.id;
ale chodzi wlasnie o to zeby pozbyc sie wykonywania updatea!!!
masz rekord po zmianie NEW, zostanie on utrwalony w bazie danych, wiec po to wlasnie robisz triggera, zeby w nim zmodyfikowac ten rekord w czasie zmiany, czyli NEW.klient_kopia=NEW.klient, i tyle...
Pozdrawiam Brzezi -- [ E-mail: brzezi@enter.net.pl ][ The future isn't what it used to be. ] [ Ekg: #3781111 ][ (It never was.) ] [ LinuxUser: #249916 ][ ]
Piotrek+ - 09-04-2006 00:19
Użytkownik Brzezi napisał: > sob, 08 kwi 2006 o 13:04 GMT, Piotrek+ napisał(a): > >>UPDATE klient SET NEW.klient_kopia=NEW.klient WHERE id=NEW.id; > > ale chodzi wlasnie o to zeby pozbyc sie wykonywania updatea!!! > > masz rekord po zmianie NEW, zostanie on utrwalony w bazie danych, wiec po > to wlasnie robisz triggera, zeby w nim zmodyfikowac ten rekord w czasie > zmiany, czyli NEW.klient_kopia=NEW.klient, i tyle...
Dodałem BEFORE w triggerze i działa!!
Dziękuję wszystkim!! :)
Pozdrawiam, Piotrek.
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[pgsql] Wykonanie triggera po =?ISO-8859-2?Q?zako=F1czeniu_tra?==?ISO-8859-2?Q?nsakcji?=
=?ISO-8859-2?Q?Mam_do_napisania_triggera_plpgsq?= =?ISO-8859-2?Q?l_mo=BFe_kto=B6_b=EAdzie_w_stanie_pom_?=
[postgresql] INSERT OR UPDATE - jak =?ISO-8859-2?Q?b=EAdzie_na?==?ISO-8859-2?Q?jlepiej=3F?=
[pgsql] Zmienna jako pole NEW w trigger pl/pgSQL.
[MSSQL] Wykonanie DTS za =?ISO-8859-2?Q?pomoc=B1_triggera?=
=?iso-8859-2?q?firebird_i_triggery_-_logowanie_historii_zmian_zawarto=B6ci?=
=?iso-8859-2?q?Jak_wykona=E6_rekompilacj=EA_procedury/triggera?=
Która z baz: [PGSQL] czy [MySQL] będzie lepsza w takim zastosowaniu (masowe UPDATE)
Postgresql - gdzie moge sie nauczyc pisania funkcji i triggerow w
Funkcja replace w triggerach MS SQL Server 2005
zanotowane.pldoc.pisz.plpdf.pisz.plred-hacjenda.opx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|