Re: PostgreSQL9.1 trigger avec arguments

From: Dimitri Fontaine <dimitri(at)2ndQuadrant(dot)fr>
To: Martine AGUERA <martine(dot)aguera(at)laas(dot)fr>
Cc: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: PostgreSQL9.1 trigger avec arguments
Date: 2012-12-05 21:55:26
Message-ID: m2r4n4dv01.fsf@2ndQuadrant.fr
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

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,
--
Dimitri Fontaine
http://2ndQuadrant.fr PostgreSQL : Expertise, Formation et Support

In response to

Responses

Browse pgsql-fr-generale by date

  From Date Subject
Next Message Norbert Saint Georges 2012-12-05 22:13:53 Re: PostgreSQL9.1 trigger avec arguments
Previous Message Cédric Villemain 2012-12-05 18:26:32 Re: a la recherche d'exemple de contrainte d'exclusion