====== Tracer et suivre les modifications apportées aux données d'une table ======
**Tiré de http://www.postgresonline.com/journal/archives/87-PostgreSQL-8.3-PLPGSQL-Cheatsheet-Overview.html**
===== Objectifs =====
Savoir qui fait quoi et quand sur quelle donnée d'une table, garder l'historique de ces modifications
===== Point de départ =====
* une table "ma_table" avec 4 attributs id_data, attr_1, attr_2 et attr_3
CREATE TABLE ma_table
(
id_data serial NOT NULL PRIMARY KEY,
attr_1 character varying,
attr_2 character varying,
attr_3 character varying
);
===== Mise en œuvre =====
==== création d'une table pour faire ce suivi ====
* elle contiendra les même colonnes que la table à suivre
* plus 3 attributs qui stockeront:
* le nom du rôle qui effectue l'opération
* le type d'opération : insert, update ou delete
* la date et l'heure de l'opération
CREATE TABLE suivi_ma_table
(
operation character(6),
date_operation timestamp without time zone NOT NULL,
utilisateur character varying NOT NULL,
id_data integer,
attr_1 character varying,
attr_2 character varying,
attr_3 character varying
);
==== Création de la fonction trigger qui se chargera de ce suivi ====
CREATE OR REPLACE FUNCTION alimente_suivi_ma_table()
RETURNS trigger AS
$BODY$
BEGIN
--
-- Crée une ligne dans la table suivi qui reflète l'opération effectuées sur la table "ma_table",
-- utilise la variable spéciale TG_OP qui décrit l'opération courante
--
IF (TG_OP = 'DELETE') THEN
-- en cas de suppression on stocke la ligne supprimée
INSERT INTO suivi_ma_table SELECT 'DELETE', now(), user, OLD.*;
RETURN OLD;
ELSIF (TG_OP = 'UPDATE') THEN
-- en cas de mise à jour on stocke la ligne dans son état "après mise à jour"
INSERT INTO suivi_ma_table 'UPDATE', now(), user, NEW.*;
RETURN NEW;
ELSIF (TG_OP = 'INSERT') THEN
-- en cas d'insertion on stocke la ligne insérée
INSERT INTO suivi_ma_table SELECT 'INSERT', now(), user, NEW.*;
RETURN NEW;
END IF;
RETURN NULL;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
==== Création du trigger ====
CREATE TRIGGER suivi_saisie_observation
AFTER INSERT OR UPDATE OR DELETE
ON ma_table
FOR EACH ROW
EXECUTE PROCEDURE alimente_suivi_ma_table();
===== Création d'un flux rss pour ce suivi =====
le rôle de connexion "rss" aura les droit de select sur la table "ma_table"
Ma table - dernières modificationa appoertées
http://www.google.fr
Suivi de modifications apportées à la table ma_tableFrançais';
$result = pg_query($dbcon,$query);
while($row = pg_fetch_array($result))
{
$item.= '
'. utf8_decode($row["nom_complet"]) .'
http://url_a_definir.org'
donnée n°' . utf8_decode($row["id_data"]) . ']]>';
}
$item.='';
echo $item;
?>