IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

trigger historisation des modifications sur une base de données


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2010
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2010
    Messages : 245
    Par défaut trigger historisation des modifications sur une base de données
    Bonjour,
    Je souhaiterai mettre en place un trigger qui insert des lignes dans une table d'historique dès qu'un utilisateur fait des modifications sur la base.

    J'aimerai pouvoir récupère le nom de la table modifié, l'identifiant de la ligne, l'utilisateur qui a fait cette modification, quel est le type de la modification (update,delete,insert), et la date.
    Pour le moment, je n'ai que la date que je sais comment récupère mais le reste je ne sais pas.

    Est ce possible de récupère ces informations?

    Merci d'avance pour tout informations.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Qu'entends-tu par "l'identifiant de la ligne" ? Car par défaut, une ligne de table n'a pas spécialement d'identifiant unique stable. A moins que les tables soient déclarées WITH OIDS mais cet usage est en voie d'obsolescence.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Pour les autres données, l'utilisateur s'obtient par la fonction current_user, le nom de la table en argument du trigger avec TG_ARGV, et le nom de l'opération avec TG_OP.

  4. #4
    Membre éclairé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2010
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2010
    Messages : 245
    Par défaut
    Bonjour,
    je te remercie de tes réponses.
    "Qu'entends-tu par "l'identifiant de la ligne" ?" enfaite je parle de la clé primaire de l'enregistrement qui a été modifié.

  5. #5
    Membre éclairé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2010
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2010
    Messages : 245
    Par défaut
    De plus, j'aimerai savoir si c'est possible d'utiliser le même trigger et fonction pour 10 tables différentes?

    pour faire le trigger je me vais m'appuyer sur cette exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    CREATE OR REPLACE FUNCTION process_emp_audit() RETURNS TRIGGER AS $emp_audit$
    BEGIN
        --
        -- Ajoute une ligne dans emp_audit pour refléter l'opération réalisée
        -- sur emp,
        -- utilise la variable spéciale TG_OP pour cette opération.
        --
        IF (TG_OP = 'DELETE') THEN
            INSERT INTO emp_audit SELECT 'D', now(), user, OLD.*;
            RETURN OLD;
        ELSIF (TG_OP = 'UPDATE') THEN
            INSERT INTO emp_audit SELECT 'U', now(), user, NEW.*;
            RETURN NEW;
        ELSIF (TG_OP = 'INSERT') THEN
            INSERT INTO emp_audit SELECT 'I', now(), user, NEW.*;
            RETURN NEW;
        END IF;
        RETURN NULL; -- le résultat est ignoré car il s'agit d'un déclencheur AFTER
    END;
    $emp_audit$ language plpgsql;
     
    CREATE TRIGGER emp_audit
        AFTER INSERT OR UPDATE OR DELETE ON emp
        FOR EACH ROW EXECUTE PROCEDURE process_emp_audit();
    et donc ma question est ce possible de mettre sur cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AFTER INSERT OR UPDATE OR DELETE ON emp
    une autre table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AFTER INSERT OR UPDATE OR DELETE ON emp on salarie on ...
    et donc la j'utiliserai TG_ARVG pour connaitre quelle la table en question.

    je sais pas si c'est bien clair.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Non un même trigger ne peut pas être associé à plusieurs tables, mais une même fonction peut être associée à plusieurs triggers.

    La difficulté principale pour étendre l'exemple montré à de multiples tables est qu'il déverse dans une unique table d'audit dont la structure est spécifiquement liée à une seule table.

    Pour pouvoir insérer dans une table d'audit déterminée dynamiquement il faut utiliser du SQL dynamique avec EXECUTE et le code va être un niveau de difficulté au-dessus.

    Pour la clef primaire, il faut voir qu'il n'y a pas d'obligation pour une table d'avoir une clef primaire, et que si elle en a une, une clef primaire peut porter sur de multiples colonnes.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/05/2011, 09h52
  2. Réponses: 1
    Dernier message: 02/02/2011, 15h11
  3. audit des connexions sur une base de données
    Par Invité dans le forum Administration
    Réponses: 16
    Dernier message: 28/04/2010, 18h17
  4. Réponses: 7
    Dernier message: 20/08/2009, 18h00
  5. Détecter les modifications sur une base de données
    Par abdelhamidem dans le forum Débuter
    Réponses: 7
    Dernier message: 09/02/2009, 18h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo