Skip site navigation (1) Skip section navigation (2)

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 (view raw or flat)
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

pgsql-fr-generale by date

Next:From: Marc BEYDate: 2005-07-28 15:33:21
Subject: mysql et postgresql
Previous:From: Jean-Christophe ArnuDate: 2005-07-28 09:34:48
Subject: Re: Abeille

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group