Re: PostgreSQL9.1 trigger avec arguments

From: Martine AGUERA <martine(dot)aguera(at)laas(dot)fr>
To: Dimitri Fontaine <dimitri(at)2ndquadrant(dot)fr>
Cc: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: PostgreSQL9.1 trigger avec arguments
Date: 2012-12-06 10:51:03
Message-ID: 50C07897.3000408@laas.fr
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

bonjour
merci pour vos réponses.
pour faire simple j'ai retenu dans un premier temps la proposition de
Francois Figarola où je teste le nom de la table qui a déclenché le
trigger et selon le cas j'utilise les noms des colonnes correspondantes.

Martine

CREATE FUNCTION "public"."fct_calcul_duree"()
RETURNS TRIGGER
LANGUAGE plpgsql
VOLATILE
AS
$$

BEGIN
CASE TG_TABLE_NAME
WHEN 't_projet' THEN
NEW.duree := NEW.date_fin - NEW.date_debut;
WHEN 't_processus' THEN
NEW.duree := NEW.date_cloture - NEW.date_ouverture;
END CASE;

RETURN NEW;
END

$$
;

Le 05/12/2012 22:55, Dimitri Fontaine a écrit :
> Bonsoir,
>
> Martine AGUERA<martine(dot)aguera(at)laas(dot)fr> writes:
>> Je bloque sur le passage d’arguments au niveau des Triggers.
>>
>> J’ai plusieurs tables où je dois calculer la durée entre deux dates, pour
>> cela je souhaiterais créer une fonction trigger unique à toutes les tables
>> en passant en paramètre la date de début et la date de fin.
>
> Les arguments des triggers sont statiques. Ils permettent de paramétrer
> une même fonction que l'on partage entre plusieurs triggers.
>
> Pour extraire dans OLD et NEW une valeur avec un nom de champ dynamique,
> fourni dans une variable de type text (TG_ARGV[0]), il est possible
> d'utiliser EXECUTE et de faire du SQL dynamique. Le mieux à mon avis
> reste d'utiliser l'extension hstore :
>
> http://www.postgresql.org/docs/9.2/static/hstore.html
>
> dim=# create extension hstore;
> CREATE EXTENSION
>
> dim=# create table foo(id serial primary key, date timestamptz default now());
> CREATE TABLE
>
> dim=# insert into foo(date) values(DEFAULT);
> INSERT 0 1
> dim=# insert into foo(date) values(DEFAULT);
> INSERT 0 1
> dim=# insert into foo(date) values(DEFAULT);
> INSERT 0 1
>
> dim=# select hstore(foo) -> 'date' from foo;
> ?column?
> -------------------------------
> 2012-12-05 22:45:22.491295+01
> 2012-12-05 22:45:24.071532+01
> 2012-12-05 22:45:25.057503+01
> (3 rows)
>
> Attention cependant :
>
> dim=# with t(x) as (select hstore(foo) -> 'date' from foo)
> select x, pg_typeof(x) from t;
> x | pg_typeof
> -------------------------------+-----------
> 2012-12-05 22:45:22.491295+01 | text
> 2012-12-05 22:45:24.071532+01 | text
> 2012-12-05 22:45:25.057503+01 | text
> (3 rows)
>
> Donc dans la fonction trigger, hstore(NEW) -> TG_ARGV[0] donnera la
> valeur souhaitée, mais attention, au "format" text. Il faudra donc la
> convertir avant de l'utiliser pour la soustraction :
>
> DECLARE
> hstore hash := hstore(NEW);
> BEGIN
> NEW.duree := (hash -> TG_ARGV[1])::timestamptz
> - (hash -> TG_ARGV[0])::timestamptz;
> END;
>
> Je crois que je vais transformer cela en article plus complet, merci
> pour le sujet :)
>
> Bonne continuation,

In response to

Responses

Browse pgsql-fr-generale by date

  From Date Subject
Next Message Dimitri Fontaine 2012-12-06 11:09:50 Re: PostgreSQL9.1 trigger avec arguments
Previous Message Guillaume Lelarge 2012-12-06 10:11:55 Session PostgreSQL #5 : Appel à conférenciers