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

Oracle Discussion :

Oracle 9: Trigger pour audit trail


Sujet :

Oracle

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Oracle 9: Trigger pour audit trail
    Bonjour,

    J'aimerais créer un trigger qui lors de l'update ou l'insert d'un record dans une table "Info" va insérer une ligne dans une table audit trail pour chaque champ modifié.

    En fait via une application VB6 je vais mettre à jour un record via un update de recordset ADO.

    Ex:
    rst.fields(0).value = "Bonjour"
    rst.fields(1).value = "Salut"
    rst.fields(2).value = "Au revoir"

    rst.update

    Je voudrais au moment de l'update qu'un trigger soit déclenché. Ce trigger passerait en revue tous les champs de la table "Info", vérifierait si il y a eu une modification de valeur du champ et qui dans l'affirmative insérerait une ligne dans une table audittrail pour signaler le changement de valeur.
    Mon problème est que je ne vois pas comment passer tous les champs de la table en revue sans devoir spécifier 1 à 1 et nommément les champs. :

    Il me faudrait une syntaxe du style

    for each field in record
    'test si valeur à changer
    next


    Merci d'avance

    Christophe

  2. #2
    Membre éclairé Avatar de plabrevo
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 547
    Points : 670
    Points
    670
    Par défaut
    La question est interessante, mais je ne vois pas de solution.

    Je pense que la seule solution est de generer les triggers avec un outils pour eviter de coder a la main tous les tests necessaires.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Sur les conseils avisés : d'un collègue j'ai essayé ça mais ça ne fonctionne pas, je reçois le message "PLS-00049: bad bind variable 'OLDREC.M_COLUMNNAME'" sur le IF.

    En fait je récupère via un curseur le noms des champs de la table, je boucle sur le curseur, mets le nom du champ dans une variable et essaie d'accéder au champ en question sur mon record courant via l'utilisation de la variable...

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
     
    CREATE OR REPLACE TRIGGER DEV.AUDITTRAILBONDS
    BEFORE UPDATE ON DEV.BONDS 
    REFERENCING NEW AS NEWREC OLD AS OLDREC
    FOR EACH ROW
     
    DECLARE
    m_SeqAuditTrail NUMBER;
    m_ColumnName VARCHAR(50);
     
    CURSOR p_BondsColumns IS
    	SELECT COLUMN_NAME 
    	FROM ALL_TAB_COLUMNS 
    	WHERE OWNER='DEV' AND TABLE_NAME = 'BONDS';
     
    BEGIN
     
    	FOR CurrentColumn IN p_BondsColumns LOOP
     
    		m_ColumnName := CurrentColumn.COLUMN_NAME;
     
    		IF :OLDREC.m_ColumnName <> :NEWREC.m_ColumnName THEN
    			SELECT SEQ_AUDITTRAIL.NEXTVAL INTO m_SeqAuditTrail FROM DUAL;
     
    			INSERT INTO DEV.AUDITTRAIL (AUDITTRAIL_ID, USER_ID, AUDITTRAIL_TABLE, 
    			   AUDITTRAIL_FIELD, AUDITTRAIL_OLDVALUE, AUDITTRAIL_NEWVALUE, 
    			   AUDITTRAIL_DATETIME, AUDITTRAIL_PK_VALUE, AUDITTRAIL_LASTMODIFICATION, 
    			   AUDITTRAIL_RECSTATUS, AUDITTRAIL_USERMODIF) 
    			VALUES (m_SeqAuditTrail, 0, 'BONDS',
    				    m_ColumnName, :OLDREC.m_ColumnName, :NEWREC.m_ColumnName,
    				    sysdate, 'BONDS_ID = ' || :OLDREC.m_ColumnName, sysdate,
    				    'ACT', 0);							
    		END IF;
     
    	END LOOP;
    END;

  4. #4
    Membre expert
    Avatar de bouyao
    Inscrit en
    Janvier 2005
    Messages
    1 778
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 778
    Points : 3 033
    Points
    3 033
    Par défaut
    Bonjour,

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par bouyao
    Bonjour,
    Voilà c'est fait

  6. #6
    Membre expert
    Avatar de bouyao
    Inscrit en
    Janvier 2005
    Messages
    1 778
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 778
    Points : 3 033
    Points
    3 033
    Par défaut
    Dans 9i, Oracle à introduit une nouvelle Fonctionnalité FGA (Fine-Grained Auditing) qui est disponible dans le package DBMS_FGA

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par bouyao
    Dans 9i, Oracle à introduit une nouvelle Fonctionnalité FGA (Fine-Grained Auditing) qui est disponible dans le package DBMS_FGA
    Je ne suis pas sûr que ça résoud mon problème car

    1° On doit nommé chaque champ sur lequel porte la policy ajoutée.
    2° Si j'ai bien lu ça logge le changement dans une table bien prédéfinie 'FGA_LOG$'

  8. #8
    Membre expert
    Avatar de bouyao
    Inscrit en
    Janvier 2005
    Messages
    1 778
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 778
    Points : 3 033
    Points
    3 033
    Par défaut
    le problème de base avec l'audit habituel : il suit seulement qui a executé quelle commande, pas specialement qui l'a fait. Par exemple, il montre que Jaouad à sélectionner certains enregistrements de la table DVP, mais non pas avec des enregistrements particuliers. Si on veut connaître la valeur modifiée, on peut placer des triggers DML sur les tables et capturer les valeurs dans certains tables qu'on a définit. Comme on ne peut pas définir un trigger dans un SELECT, cette option ne marchera pas.

    Les fonctionnalités FGA sont disponibles dans le package DBMS_FGA. FGA a été introduit dans Oracle 9i ou il est employé seulement pour la commande SELECT. Dans 10g, il s'applique à toutes les commandes DML.

    En utilisant FGA, on peut enregistrer les activités des commandes SELECT, INSERT, UPDATE et DELETE dans le suivi d'audit (non pas dans la table AUD$). Dans ce suivi d'audit, on peut trouver non seulement l'information qui fait quoi, mais beaucoup plus, comme la commande SQL exacte entrer par l'utilisateur, le SCN, la valeur du bind variable (si elle est utilisée) et d'autres choses.


    L'un des meilleurs aspects du FGA, c'est qu'il peut être appliqué d'une manière sélective. Pour des activités spécifiques. Par exemple, on veut accomplir un audit quand quelqu'un sélectionne la colonne SAL, et la valeur de SAL est 1500. Cet enregistrement sélectif réduit la quantité des informations d'audit qui sont générés.


    Une autre caractéristique très utile du FGA qu'il peut être mener pour exécuter automatiquement une procédure définie par l'utilisateur. Cette capacité peut être exploitée dans plusieurs formes.

Discussions similaires

  1. Audit trail ou journal des évènements pour LibreOffice
    Par Corniguedouille dans le forum OpenOffice & LibreOffice
    Réponses: 0
    Dernier message: 08/04/2014, 17h20
  2. Réponses: 4
    Dernier message: 24/01/2011, 17h28
  3. Réponses: 11
    Dernier message: 30/10/2006, 16h59
  4. Réponses: 4
    Dernier message: 21/11/2005, 12h04
  5. oracle 9i linux audit-trail
    Par mela dans le forum Administration
    Réponses: 2
    Dernier message: 04/08/2004, 22h42

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