PostgreSQL
La base de données la plus sophistiquée au monde.

Ouverture de session

Navigation

Contactez-nous

Administration du site :
"equipe chez postgresqlfr point org"

Contact presse :
"fr chez postgresql point org"

Contact association :
"bureau chez postgresqlfr point org"

Questions PostgreSQL :
 IRC :
  serveur irc.freenode.net
  canal #postgresqlfr

Recherche

Accéder aux archives

« Octobre 2008  
Lun Mar Mer Jeu Ven Sam Dim
  2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31  

Syndication

Flux XML

Sondage

Quelle est la version de PostgreSQL la plus répandue sur vos serveurs ?
8.3
10%
8.2
42%
8.1
40%
8.0
2%
7.4
6%
7.3 ou antérieure
0%
Nombre de votes: 48

fonctions en PL/pgsql

Technique - Langages Procéduraux (PL) | fonctions en PL/pgsql

Par jackt81 le 08/03/2006 - 18:02

Bonjour,
je progresse un peu dans mes fonctions "trigger" (je suis en version 8.0.3).
j'ai réalisé une fonction pour me renseigner sur les update ou delete effectués dans une table contenant environ 50 colonnes.
Comment savoir quelle colonne a été modifiée ?
pour le moment (voir fonction), j'utilise 2 variables temporaires que je concatène avant l'insert.

voici la fonction :
CREATE OR REPLACE FUNCTION proc_update_dosbase()
RETURNS "trigger" AS
$BODY$

DECLARE

action_effectuee text; -- UPDATE ou DELETE
valeur_initiale text; -- Valeur avant modification
valeur_modifiee text; -- Valeur après modification
nom_utilisateur text; -- Utilisateur connecté
table_en_cause text; -- Nom de la table
valeur_temp1 text; -- Valeur temporaire
valeur_temp2 text; -- Valeur temporaire
dt_modif date; -- pour récupérer la date courante
hr_modif time; -- pour récupérer l'heure courante

BEGIN

nom_utilisateur := user;
action_effectuee := TG_OP ;
table_en_cause := TG_RELNAME;
SELECT INTO dt_modif current_date;
SELECT INTO hr_modif substr(current_time,1,8);

-- Pour tracer une variable, utiliser la syntaxe ci-dessous.
-- RAISE NOTICE 'calling proc_update_dosbase(%)', variable Ă  tracer;

IF action_effectuee = 'DELETE' THEN
SELECT INTO valeur_temp1 OLD.codedose FROM dosbase ;
SELECT INTO valeur_temp2 OLD.pourcontr FROM dosbase ;
valeur_initiale := valeur_temp1 || '\n' || valeur_temp2;
INSERT INTO audit values
(dt_modif, hr_modif, action_effectuee, valeur_initiale, NULL, nom_utilisateur, table_en_cause);
RETURN OLD;
ELSE
SELECT INTO valeur_temp1 OLD.codedose FROM dosbase ;
SELECT INTO valeur_temp2 OLD.pourcontr FROM dosbase ;
valeur_initiale := valeur_temp1 || '\n' || valeur_temp2;

SELECT INTO valeur_temp1 NEW.codedose FROM dosbase ;
SELECT INTO valeur_temp2 NEW.pourcontr FROM dosbase ;
valeur_modifiee := valeur_temp1 || '\n' || valeur_temp2;

INSERT INTO audit values
(dt_modif, hr_modif, action_effectuee, valeur_initiale, valeur_modifiee, nom_utilisateur, table_en_cause);
RETURN NEW;
END IF;

END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

Si vous avez une solution ...

merci

© PostgreSQLFr, tous droits rĂ©servĂ©s.
Site déclaré à la CNIL sous le numéro 1074678, conformément à la Loi en vigueur.