Vous n'êtes pas identifié(e).

#51 PL/pgSQL » Transformer en XML le contenu de OLD.* dans un trigger » 18/05/2010 12:20:54

ced
Réponses : 2

Bonjour,

Je tente de mettre en place un système d'audit des tables d'une base de données, via un système de triggers en PL/pgSQL sous PostgreSQL 8.4.

J'en suis à tenter d'insérer les anciennes données (avant mise à jour ou suppression) dans une table d'audit.
Pour m'en sortir, j'ai choisi une solution qui consiste à transformer en XML tout le contenu de la ligne avant changement, et stocker ça dans un champ de type xml.

Seulement, impossible de trouver comment transformer le contenu du record OLD en XML.

Voici ce que j'essaie :

CREATE OR REPLACE FUNCTION test.audit_delete_offline () RETURNS TRIGGER AS
$body$
BEGIN
 
INSERT INTO audit.data_change (tbl_id, chg_user, chg_datetime, chg_delete, chg_xml_data)
SELECT lt.tbl_id, CURRENT_USER, CURRENT_TIMESTAMP, 1, XMLFOREST(OLD.*)
FROM audit.liste_tables lt
WHERE lt.tbl_schema = TG_TABLE_SCHEMA
AND lt.tbl_name = TG_TABLE_NAME;
RETURN NULL;
 
END;
$body$
LANGUAGE plpgsql;

J'ai stocké dans une table (audit.liste_tables) toutes les tables sur lesquelles l'enregistrement des modifications doit s'enregistrer.

Je crée ensuite mon trigger sur ma table à auditer.

Quand je supprime un enregistrement, j'ai l'erreur suivante :

ERROR: row expansion via "*" is not supported here
LINE 1: ...d, CURRENT_USER, CURRENT_TIMESTAMP, 0, XMLFOREST( $1 .*) FRO...

J'ai tenté plusieurs choses, notamment en essayant d'utiliser la fonction QUERY_TO_XML, mais rien n'y fait... Je ne trouve pas de solution.

D'où ma question : comment est-ce que je peux transformer en XML tout le contenu de la variable OLD dans un trigger ?

Merci d'avance à ceux qui voudront bien m'aider...

ced

Pied de page des forums

Propulsé par FluxBB