Re: date de la derniere modif

Lists: pgsql-fr-generale
From: santiago <chetzacoalt(at)free(dot)fr>
To: pgsql-fr-generale(at)postgresql(dot)org
Subject: date de la derniere modif
Date: 2005-07-28 08:03:50
Message-ID: 42E89166.6040006@free.fr
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

salut

je voudrais savoir si postgres conserve la date de derniere modif pour
chaque ligne ?
je cherche, mais j'arrive pas a trouver. je suppose que ca signifie non.
Il y a un moyen simple de rajouter ca ?

merci


From: santiago <chetzacoalt(at)free(dot)fr>
To: pgsql-fr-generale(at)postgresql(dot)org
Cc: Jean-Max Reymond <jmreymond(at)gmail(dot)com>
Subject: Re: date de la derniere modif
Date: 2005-07-28 08:21:24
Message-ID: 42E89584.5080604@free.fr
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

donc ca signifie non :)... tant pis..

je pensais a ca, mais avec en plus qqchose du style un trigger pour
garantir que tout les updates maintiennent bien cette date a jour.
ce qui m'embete, c'est que les triggers doivent etre redefini pour
chaque table non ? ca peut devenir lourd.

bon, ce sera mon premier exo grandeur nature sur les triggers..

merci

Jean-Max Reymond wrote:
> Le 28/07/05, santiago<chetzacoalt(at)free(dot)fr> a écrit :
>
>>salut
>>
>>je voudrais savoir si postgres conserve la date de derniere modif pour
>>chaque ligne ?
>>je cherche, mais j'arrive pas a trouver. je suppose que ca signifie non.
>>Il y a un moyen simple de rajouter ca ?
>
>
> rajoute un champ dans ta table et tu es sur d'être portable quelque
> soit la base de données.
>


From: Stéphane Bunel <stephane(at)stratum-ip(dot)net>
To: chetzacoalt(at)free(dot)fr
Cc: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: date de la derniere modif
Date: 2005-07-28 08:25:43
Message-ID: 42E89687.5020704@stratum-ip.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

santiago wrote:
> salut
>
> je voudrais savoir si postgres conserve la date de derniere modif pour
> chaque ligne ?

Je ne crois pas avoir déjà vu cela.

> je cherche, mais j'arrive pas a trouver. je suppose que ca signifie non.
> Il y a un moyen simple de rajouter ca ?

Oui avec un trigger, par exemple :

1) Vous ajouter à <votre table> un champs de type timestamp, tel que :

m_time timestamptz NOT NULL DEFAULT now(),

2) Ce champ sera modifier par la fonction suivante :

CREATE OR REPLACE FUNCTION tf_update_m_time()
RETURNS "trigger" AS
$BODY$
BEGIN
NEW.m_time := now() ;
RETURN NEW;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

3) Fonction qui sera appelée sur l'évènement de votre choix, par exemple
à chaque UPDATE de <votre table>, tel que :

CREATE TRIGGER t_m_time
BEFORE UPDATE
ON <votre table>
FOR EACH ROW
EXECUTE PROCEDURE tf_update_m_time();

Stéphane BUNEL.

PS: Dans le 2) la notation $BODY$ n'est valable qu'a partir de PG8. Pour
un PG plus "ancien", utilisez des simples quote (').


From: santiago <chetzacoalt(at)free(dot)fr>
To: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: date de la derniere modif
Date: 2005-07-28 08:44:32
Message-ID: 42E89AF0.2060609@free.fr
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

merci, j'aurais meme pas a chercher :)

j'en profite pour ajouter une autre question :
est ce qu'un trigger defini comme ici sur les update d'un table A
peut modifier une table B ?

merci

Stéphane Bunel wrote:
> santiago wrote:
>
>> salut
>>
>> je voudrais savoir si postgres conserve la date de derniere modif pour
>> chaque ligne ?
>
>
> Je ne crois pas avoir déjà vu cela.
>
>> je cherche, mais j'arrive pas a trouver. je suppose que ca signifie non.
>> Il y a un moyen simple de rajouter ca ?
>
>
> Oui avec un trigger, par exemple :
>
> 1) Vous ajouter à <votre table> un champs de type timestamp, tel que :
>
> m_time timestamptz NOT NULL DEFAULT now(),
>
> 2) Ce champ sera modifier par la fonction suivante :
>
> CREATE OR REPLACE FUNCTION tf_update_m_time()
> RETURNS "trigger" AS
> $BODY$
> BEGIN
> NEW.m_time := now() ;
> RETURN NEW;
> END;
> $BODY$
> LANGUAGE 'plpgsql' VOLATILE;
>
> 3) Fonction qui sera appelée sur l'évènement de votre choix, par exemple
> à chaque UPDATE de <votre table>, tel que :
>
> CREATE TRIGGER t_m_time
> BEFORE UPDATE
> ON <votre table>
> FOR EACH ROW
> EXECUTE PROCEDURE tf_update_m_time();
>
> Stéphane BUNEL.
>
> PS: Dans le 2) la notation $BODY$ n'est valable qu'a partir de PG8. Pour
> un PG plus "ancien", utilisez des simples quote (').
>
>


From: Stéphane Bunel <stephane(at)stratum-ip(dot)net>
To: chetzacoalt(at)free(dot)fr
Cc: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: date de la derniere modif
Date: 2005-07-28 09:26:43
Message-ID: 42E8A4D3.3060008@stratum-ip.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-fr-generale

santiago wrote:
> merci, j'aurais meme pas a chercher :)
>
> j'en profite pour ajouter une autre question :
> est ce qu'un trigger defini comme ici sur les update d'un table A
> peut modifier une table B ?

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.

>
> merci
>
>
> Stéphane Bunel wrote:
>
>>santiago wrote:
>>
>>
>>>salut
>>>
>>>je voudrais savoir si postgres conserve la date de derniere modif pour
>>>chaque ligne ?
>>
>>
>>Je ne crois pas avoir déjà vu cela.
>>
>>
>>>je cherche, mais j'arrive pas a trouver. je suppose que ca signifie non.
>>>Il y a un moyen simple de rajouter ca ?
>>
>>
>>Oui avec un trigger, par exemple :
>>
>>1) Vous ajouter à <votre table> un champs de type timestamp, tel que :
>>
>>m_time timestamptz NOT NULL DEFAULT now(),
>>
>>2) Ce champ sera modifier par la fonction suivante :
>>
>>CREATE OR REPLACE FUNCTION tf_update_m_time()
>> RETURNS "trigger" AS
>>$BODY$
>>BEGIN
>> NEW.m_time := now() ;
>> RETURN NEW;
>>END;
>>$BODY$
>> LANGUAGE 'plpgsql' VOLATILE;
>>
>>3) Fonction qui sera appelée sur l'évènement de votre choix, par exemple
>>à chaque UPDATE de <votre table>, tel que :
>>
>>CREATE TRIGGER t_m_time
>> BEFORE UPDATE
>> ON <votre table>
>> FOR EACH ROW
>> EXECUTE PROCEDURE tf_update_m_time();
>>
>>Stéphane BUNEL.
>>
>>PS: Dans le 2) la notation $BODY$ n'est valable qu'a partir de PG8. Pour
>>un PG plus "ancien", utilisez des simples quote (').
>>
>>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 6: explain analyze is your friend


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
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.