NEW z parametrem
Tomsiak - 01-06-2006 00:03
NEW z parametrem
Proboje wykonac w trigerze NEW. z parametrem ktory chcialbym pobrac z zmiennej tablicowej problem w tym że postgres nie chce wykonac odwolania do podstawionej wartosci np. dla wykonania pierwszej iteracji czyli NEW.imie zamiast tego wykonuje NEW.param. Moze istnieje jakas funkcja w postgre? przyklad:
tab=ARRAY ['imie', 'drugie_imie', 'nazwisko'];
FOR i IN 1..3 LOOP param=tab[i]; zmienna='NEW.'||param; EXECUTE ('INSERT INTO historia(id, nowa_wartosc) VALUES (1,'''||zmienna||''');'); END LOOP;
Tomsiak
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 02-06-2006 00:44
Tomsiak wrote: > Proboje wykonac w trigerze NEW. z parametrem ktory chcialbym pobrac z > zmiennej tablicowej problem w tym że postgres nie chce wykonac > odwolania do podstawionej wartosci np. dla wykonania pierwszej iteracji > czyli NEW.imie zamiast tego wykonuje NEW.param. Moze istnieje jakas > funkcja w postgre? > przyklad: > > tab=ARRAY ['imie', 'drugie_imie', 'nazwisko']; > > FOR i IN 1..3 > LOOP > param=tab[i]; > zmienna='NEW.'||param; > EXECUTE ('INSERT INTO historia(id, nowa_wartosc) VALUES > (1,'''||zmienna||''');'); > END LOOP;
Nie da się plpgsql. Ale można to zrobic w plperl.
-- P.M.
tomsiak - 02-06-2006 00:44
Paweł Matejski napisał(a): > Tomsiak wrote: > > Proboje wykonac w trigerze NEW. z parametrem ktory chcialbym pobrac z > > zmiennej tablicowej problem w tym że postgres nie chce wykonac > > odwolania do podstawionej wartosci np. dla wykonania pierwszej iteracji > > czyli NEW.imie zamiast tego wykonuje NEW.param. Moze istnieje jakas > > funkcja w postgre? > > przyklad: > > > > tab=ARRAY ['imie', 'drugie_imie', 'nazwisko']; > > > > FOR i IN 1..3 > > LOOP > > param=tab[i]; > > zmienna='NEW.'||param; > > EXECUTE ('INSERT INTO historia(id, nowa_wartosc) VALUES > > (1,'''||zmienna||''');'); > > END LOOP; > > Nie da się plpgsql. Ale można to zrobic w plperl. > > -- > P.M.
Trudno a czy jest jakis inny sposob na monitorowanie zmian w bazie? W jaki sposob mozna to jeszcze robic?
Pozdrawiam
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 02-06-2006 00:44
Pisz w temacie o jaką baze chodzi!
tomsiak wrote: > Paweł Matejski napisał(a): > >> >>Nie da się plpgsql. Ale można to zrobic w plperl. ^^^^^^^^^ > Trudno a czy jest jakis inny sposob na monitorowanie zmian w bazie? W > jaki sposob mozna to jeszcze robic?
-- P.M.
tomsiak - 02-06-2006 00:44
Paweł Matejski napisał(a): > Pisz w temacie o jaką baze chodzi! > > tomsiak wrote: > > Paweł Matejski napisał(a): > > > >> > >>Nie da się plpgsql. Ale można to zrobic w plperl. > ^^^^^^^^^ > > Trudno a czy jest jakis inny sposob na monitorowanie zmian w bazie? W > > jaki sposob mozna to jeszcze robic? > > -- > P.M.
chce przechowywac historie zmian niektorych kolumn w bazie postgresql ver. 8.0.3, tak jak pisalem chcialem to zrobic za pomoca trigera ktoremu jako paramtr podawalbym nazwy kolumn. Jesli dobrze doczytalem to uzywanie jezyka zewnetrznego np pljava nie jest za bardzo wydajne i lepiej pisac w plpgsql czy to prawda?
Robert Osowiecki - 02-06-2006 00:44
tomsiak napisał(a): > chce przechowywac historie zmian niektorych kolumn w bazie postgresql > ver. 8.0.3, tak jak pisalem chcialem to zrobic za pomoca trigera > ktoremu jako paramtr podawalbym nazwy kolumn. Jesli dobrze doczytalem > to uzywanie jezyka zewnetrznego np pljava nie jest za bardzo wydajne i > lepiej pisac w plpgsql czy to prawda?
W plpgsql tak się nie da. Na twoim miejscu pobawiłbym się w "metaprogramowanie": napisał procedurę, która pobiera nazwę tabeli i listę pól i tworzy dla niej odpowiednie triggery. Nie sprawdzałem pod tym kątem możliwości plperla, ale jeśli w perlu się nie obracasz na codzień, to nie ma co zaczynać od pisania w nim triggerów w psql-u.
R.
Marcin Mańk - 02-06-2006 00:44
"Robert Osowiecki" <robson@rassun.art.pl> wrote in message news:e5mili$lmm$1@opal.futuro.pl... > tomsiak napisał(a): > > chce przechowywac historie zmian niektorych kolumn w bazie postgresql > > ver. 8.0.3, tak jak pisalem chcialem to zrobic za pomoca trigera > > ktoremu jako paramtr podawalbym nazwy kolumn. Jesli dobrze doczytalem > > to uzywanie jezyka zewnetrznego np pljava nie jest za bardzo wydajne i > > lepiej pisac w plpgsql czy to prawda? > > W plpgsql tak się nie da. Na twoim miejscu pobawiłbym się w > "metaprogramowanie": napisał procedurę, która pobiera nazwę tabeli i > listę pól i tworzy dla niej odpowiednie triggery. Nie sprawdzałem pod > tym kątem możliwości plperla, ale jeśli w perlu się nie obracasz na > codzień, to nie ma co zaczynać od pisania w nim triggerów w psql-u. >
W plpgsql da się. http://www.postgresql.org/docs/8.1/s...-EXECUTING-DYN
W połączeniu z tym, że procedurę triggera da się parametryzować:
CREATE TRIGGER _ctele_logtrigger_30 AFTER INSERT OR UPDATE OR DELETE ON machines FOR EACH ROW EXECUTE PROCEDURE _ctele.logtrigger('_ctele', 30, 'kv');
(takie triggery robi slony).
Pozdrawiam Marcin Mańk
Robert Osowiecki - 02-06-2006 00:44
Marcin Mańk napisał(a): > W plpgsql da się. > http://www.postgresql.org/docs/8.1/s...-EXECUTING-DYN > > W połączeniu z tym, że procedurę triggera da się parametryzować: > > CREATE TRIGGER _ctele_logtrigger_30 > AFTER INSERT OR UPDATE OR DELETE > ON machines > FOR EACH ROW > EXECUTE PROCEDURE _ctele.logtrigger('_ctele', 30, 'kv'); > > (takie triggery robi slony).
Fajne, tylko że trigger "dedykowany" będzie działał sprawniej (EXECUTE-y są wolnijesze bo za zapytania muszą być za każdym razem parsowane) - no ale dla rzadko zmieniających się danych, to rzeczywiście jest lepsze rozwiązanie.
R.
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 02-06-2006 00:44
Marcin Mańk wrote: > "Robert Osowiecki" <robson@rassun.art.pl> wrote in message > news:e5mili$lmm$1@opal.futuro.pl... > >>tomsiak napisał(a): >> >>>chce przechowywac historie zmian niektorych kolumn w bazie postgresql >>>ver. 8.0.3, tak jak pisalem chcialem to zrobic za pomoca trigera >>>ktoremu jako paramtr podawalbym nazwy kolumn. Jesli dobrze doczytalem >>>to uzywanie jezyka zewnetrznego np pljava nie jest za bardzo wydajne i >>>lepiej pisac w plpgsql czy to prawda? >> >>W plpgsql tak się nie da. Na twoim miejscu pobawiłbym się w >>"metaprogramowanie": napisał procedurę, która pobiera nazwę tabeli i >>listę pól i tworzy dla niej odpowiednie triggery. Nie sprawdzałem pod >>tym kątem możliwości plperla, ale jeśli w perlu się nie obracasz na >>codzień, to nie ma co zaczynać od pisania w nim triggerów w psql-u. >> > > > W plpgsql da się. > http://www.postgresql.org/docs/8.1/s...-EXECUTING-DYN
A udało Ci sie dynamicznie dobrać do pola NEW? :)
-- P.M.
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 02-06-2006 00:44
tomsiak wrote: > > chce przechowywac historie zmian niektorych kolumn w bazie postgresql > ver. 8.0.3, tak jak pisalem chcialem to zrobic za pomoca trigera > ktoremu jako paramtr podawalbym nazwy kolumn. Jesli dobrze doczytalem > to uzywanie jezyka zewnetrznego np pljava nie jest za bardzo wydajne i > lepiej pisac w plpgsql czy to prawda?
Nie robiłem testów, ale nie sądzę, żebyś miał się czym przejmować. Za to faktycznie możesz mieć pewien problem, jeśli jeszcze nie znasz perla, choć sam kod takiego triggera nie powinien być skomplikowany.
-- P.M.
herakles - 02-06-2006 00:44
Tomsiak wrote:
> Proboje wykonac w trigerze NEW. z parametrem ktory chcialbym pobrac z > zmiennej tablicowej problem w tym że postgres nie chce wykonac > odwolania do podstawionej wartosci np. dla wykonania pierwszej iteracji > czyli NEW.imie zamiast tego wykonuje NEW.param. Moze istnieje jakas > funkcja w postgre? > przyklad: > > tab=ARRAY ['imie', 'drugie_imie', 'nazwisko']; > > FOR i IN 1..3 > LOOP > param=tab[i]; > zmienna='NEW.'||param; > EXECUTE ('INSERT INTO historia(id, nowa_wartosc) VALUES > (1,'''||zmienna||''');'); > END LOOP; > > Tomsiak
po co taka kombinacja
if PG_RELNAME='t' then
if PG_OP='UPDATE' then if new....!=old.... OR ... then insert into zz_hist_t(who,when,op, .....) values(2,now(),PG_OP,NEW...); end if; elsif PG_OP='INSERT' then insert into zz_hist_t(who,when,op, .....) values(2,now(),PG_OP,NEW...); elsif PG_OP='DELETE' insert into zz_hist_t(who,when,op, .....) values(2,now(),PG_OP,OLD...); end if; elsif TG_RELNAME='.....
do tego robisz malutki sofcik który dla każdej z tabeli zbuduje ci jedną funkcje do całego tego syfu, i zalteruje tabelki historyczne o brakujące pola, przy jakimś alterze na bazie, pozatym nie wszystko przecież trzymasz w historii, zazwyczaj jest to ok 10 tabel.
tomsiak - 02-06-2006 00:44
Paweł Matejski napisał(a): > tomsiak wrote: > > > > chce przechowywac historie zmian niektorych kolumn w bazie postgresql > > ver. 8.0.3, tak jak pisalem chcialem to zrobic za pomoca trigera > > ktoremu jako paramtr podawalbym nazwy kolumn. Jesli dobrze doczytalem > > to uzywanie jezyka zewnetrznego np pljava nie jest za bardzo wydajne i > > lepiej pisac w plpgsql czy to prawda? > > Nie robiłem testów, ale nie sądzę, żebyś miał się czym przejmować. > Za to faktycznie możesz mieć pewien problem, jeśli jeszcze nie znasz > perla, choć sam kod takiego triggera nie powinien być skomplikowany. > > -- > P.M.
ostatecznie stworze tablice z zmiennymi do ktorej pozniej bede sie odwolywac, dla kazdej tabelki trzeba bedzie zrobic osobna funkcje trigger ale to nie problem.
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[MySQL] =?ISO-8859-2?Q?Odwr=F3cenie_domy=B6lnego_order_by=2C?==?ISO-8859-2?Q?_ale_bez_parametru=2E?=
=?iso-8859-2?q?[Mysql_5=2E0]_Wywo=B3ywanie_procedury_jako_parametr_funkcji?=
=?iso-8859-2?q?Nazwa_Tabeli_jako_parametr_w_procedurze_sk=B3a dowanej?=
Nazwa tabeli jako parametr do procedury dla SQL2005 Server - jakprzekazac?
Wacom UD 1212-R Digitizer II Ultra Pad jakie ma parametry
Jak stworzyś odnośnik do strony www z wyliczonym wcześniej parametrem.
Funkcja z =?ISO-8859-2?Q?tabel=B1_jako_parametrem_?=
Sql Serv 2000 - String z lista parametrem funkcji ?
ORA-02095: Podany parametr inicjalizacyjny nie moze byc modyfikowany
[mysql] Procedura z przekazywaną nazwą tabeli jako parametr
zanotowane.pldoc.pisz.plpdf.pisz.plmarcelq.xlx.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 |
|