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

PL/SQL Oracle Discussion :

Savoir qui a déclenché le trigger


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de yodaime
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2006
    Messages : 282
    Par défaut Savoir qui a déclenché le trigger
    Bonjour,

    Je vous expose ce que j'aimerais faire.

    Je voudrais créer un trigger de delete qui des qu'une ligne est deleter de ma table, insere dans une autre table la ligne deleter, l'heure ainsi que la personne/programme qui a fait le delete.

    Mon problème est donc de savoir si il y a un moyen de connaitre la personne/programme qui a declenché le trigger.

    Est possible ? (Je sais qu'on peu le faire avec Sybase)

    J'espère avoir été clair.

    Merci d'avance de vos réponses

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Probablement avec SYS_CONTEXT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select sys_context('USERENV', 'OS_USER')
      from dual;

  3. #3
    Membre expérimenté Avatar de yodaime
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2006
    Messages : 282
    Par défaut
    Effectivement, c'est exactement ça !

    Merci beaucoup

  4. #4
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Juste une petit remarque: ça marche bien en client-serveur mais ça pourrait être non concluant en trois tiers.

  5. #5
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Par défaut
    Bonjour

    1. ajouter les champs suivants dans votre table audit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
             USR_INS             VARCHAR2(48)
    	USR_UPD            VARCHAR2(48)
    	DAT_UPD            DATE
    	DAT_INS            DATE
    	PGM_UPD            VARCHAR2(100)
    	PGM_INS            VARCHAR2(100)
    2. ajouter un trigger(before update/delete) sur votre table cible

    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 TRIGGER audit_trig
     BEFORE DELETE
     ON table_cible
     REFERENCING OLD AS OLD NEW AS NEW
     FOR EACH ROW
    DECLARE
       lv_module       VARCHAR2(48);
       lv_action       VARCHAR2(48);
       ld_current_date DATE         := SYSDATE;
       lv_current_user VARCHAR2(48) := USER;
    BEGIN
       dbms_application_info.read_module(lv_module, lv_action);
       :NEW.usr_upd := lv_current_user;
       :NEW.dat_upd := ld_current_date;
       :NEW.pgm_upd := lv_module;
     
      insert into table_audit values (x,y,z,...,:NEW.usr_upd, :NEW.dat_upd ,:NEW.pgm_upd );
     
    EXCEPTION
      WHEN OTHERS THEN
        RAISE
    END audit_trig;
    /
    Bien à vous

    Mohamed Houri

  6. #6
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par Mohamed.Houri Voir le message
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    EXCEPTION
      WHEN OTHERS THEN
        RAISE
    ...
    Pas beau

  7. #7
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Pas beau
    Quand cela n'est pas bon, il faut nous éclairer pourque l'on puisse se corriger
    n'est ce pas?

    Pas beau : ne nous apporte rien, ni à moi ni à ceux qui veulent savoir pourquoi.

    Quant à la gestion des exceptions, Tom Kyte aurait aimer que le when others exception disparraisse du kernel PL/SQL à cause du nombre impressionant de personnes qui codent comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    WHEN OTHERS THEN
     NULL;
    C'est pourquoi je préfère ceci
    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
     
    CREATE OR REPLACE TRIGGER xxx_TRG
     BEFORE UPDATE
     ON xxx_tab
     REFERENCING OLD AS OLD NEW AS NEW
     FOR EACH ROW
    DECLARE
       lv_module VARCHAR2(48);
       lv_action VARCHAR2(48);
       ld_current_date DATE := SYSDATE;
       lv_current_user VARCHAR2(48) := USER;
    BEGIN
       dbms_application_info.read_module(lv_module, lv_action);
       :NEW.usr_upd := lv_current_user;
       :NEW.dat_upd := ld_current_date;
       :NEW.pgm_upd := lv_module;
    EXCEPTION
      WHEN OTHERS THEN
        RAISE_APPLICATION_ERROR('-20000','xxx_trg');
    END xxx_trg;
    /
    Ou carrément ceci (sans gestion des exceptions)

    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
     
     
    CREATE OR REPLACE TRIGGER xxx_TRG
     BEFORE UPDATE
     ON xxx_tab
     REFERENCING OLD AS OLD NEW AS NEW
     FOR EACH ROW
    DECLARE
       lv_module VARCHAR2(48);
       lv_action VARCHAR2(48);
       ld_current_date DATE := SYSDATE;
       lv_current_user VARCHAR2(48) := USER;
    BEGIN
       dbms_application_info.read_module(lv_module, lv_action);
       :NEW.usr_upd := lv_current_user;
       :NEW.dat_upd := ld_current_date;
       :NEW.pgm_upd := lv_module;
    END xxx_trg;
    /
    Bien à vous

    Mohamed Houri

  8. #8
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par Mohamed.Houri Voir le message
    Quand cela n'est pas bon, il faut nous éclairer pourque l'on puisse se corriger
    n'est ce pas?
    ...
    AskTom
    why do people do this?????

    EXCEPTION
    WHEN OTHERS THEN
    RAISE;
    END;


    what is the point, other than to make the code infinitely harder to debug. You know what you did by coding that?
    ...
    So, the error is

    EXCEPTION
    WHEN OTHERS THEN
    RAISE;
    END;

    remove them all, don't code that again, and then you'll find out where to look in your code.

  9. #9
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par Mohamed.Houri Voir le message
    ...
    C'est pourquoi je préfère ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...EXCEPTION
      WHEN OTHERS THEN
        RAISE_APPLICATION_ERROR('-20000','xxx_trg');
    END xxx_trg;
    /
    ...

    Why do people do this?

  10. #10
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Oui mais contrairement à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    WHEN OTHERS THEN
      NULL;
    Ceci n'est pas un bug

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    WHEN OTHERS THEN
      RAISE;
    Savez vous que Tom Kyte a demandé pour la release 11g de supprimer le WHEN OTHERS THEN?

    Mais le kernel PL/SQL ne l'a pas suivi. Il a juste ajouté un Warning lorsque ceci est codé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    WHEN OTHERS THEN
      NULL;
    Je vais arreter là. Le bug est dans l'exception qui n'est pas suivi d'un RAISE et non l'inverse

    Bien à vous

    Mohamed Houri

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

Discussions similaires

  1. récupérer la ligne qui a déclenché un trigger
    Par Peanut dans le forum Développement
    Réponses: 2
    Dernier message: 17/05/2011, 12h01
  2. Récupération requête qui a déclenché le trigger
    Par jacky666 dans le forum PL/SQL
    Réponses: 3
    Dernier message: 06/03/2009, 17h20
  3. Qui déclenche un trigger?
    Par p3kk4 dans le forum PL/SQL
    Réponses: 2
    Dernier message: 05/10/2007, 09h44
  4. Réponses: 9
    Dernier message: 16/10/2006, 13h47
  5. Réponses: 2
    Dernier message: 14/06/2006, 15h04

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