Re: date de la derniere modif

From: santiago <chetzacoalt(at)free(dot)fr>
To: Stéphane Bunel <stephane(at)stratum-ip(dot)net>, pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: date de la derniere modif
Date: 2005-07-28 10:22:36
Message-ID: 42E8B1EC.6060508@free.fr
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

pardon d'inister, mais je n'ai pas completement compris ta reponse
j'ai tente de mettre le me trigger dans les 2, mais sans succes.
il faut dire que j'utilisais un update dans le trigger, lui meme
declanche pas un update... je suppose que j'ai une boucle infini.

donc ta solution qui modifie NEW avant l'update pour y ajouter now()
m'a bien aider.

par contre, j'ai l'impression que j'ai besoin d'un update quand je
touche a une autre table. pour plus de clartee sur mon propos, voici un
exemple avec deux tables r et p, qui supposement parle des memes objets,
references par la valeure de l'attribut a (j'ai pas mis les cles... )

si je modifie un objet dans p, je suppose qu'il existe dans r, et je ne
maintiens la date de derniere modif que la, donc le trigger sur p a
besoin d'un update vers r ? ou bien je me suis trompe qq part ?

(ps : la colone b pourrait ici etre retiree de la table p... )

une autre question qui me viens a l'esprit :
est ce que je ne devrait pas plutot mettre
OLD.d=now();
au lieu de
NEW.d=now();
de facon a permettre des modifications volontaires de d,
car malgre le before, la requete suivant est override par le trigger (et
d se retourve avec now() et non la valeur a recopier) :
update r set d= (select d from r where a='aa') where a='a';

Table "public.r"
Column | Type | Modifiers
--------+--------------------------+------------------------
a | character varying |
b | character varying |
d | timestamp with time zone | not null default now()

Column | Type | Modifiers
--------+-------------------+-----------
a | character varying |
b | character varying |
c | integer |

create function f_x_to_r() returns opaque as '
begin
update r
set d=now()
where r.a=NEW.a;
return NULL;
end;
' language 'plpgsql';

create trigger p_trig
after update
on p
for each row
execute procedure f_x_to_r();

create function f_self_r() returns opaque as '
begin
NEW.d:=now();
return NEW;
end;
' language 'plpgsql';

create trigger r_trig
before update
on r
for each row
execute procedure f_self_r();

select * from r;
select * from p;
update p set c=3 where a='a';
select * from r;
select * from p;
update r set b='k' where a='a';
select * from r;
select * from p;

> Bonjour,
>
> Il suffit de mettre le même trigger sur la table B si celle-ci a aussi
> un champ m_time. Sachez qu'il est possible de faire pratiquement tout ce
> que l'on veut dans une fonction. Elle peut-être écrite en d'autre
> langage que plsql. Moi même j'utilise plutôt Python dès que la fonction
> à écrire est un peut plus complexe. D'autre préférerons perl, C, ...
>
> Stéphane BUNEL.

In response to

Browse pgsql-fr-generale by date

  From Date Subject
Next Message Marc BEY 2005-07-28 15:33:21 mysql et postgresql
Previous Message Jean-Christophe Arnu 2005-07-28 09:34:48 Re: Abeille