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 :

[9i] Où est le programme après un logon


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2009
    Messages : 19
    Par défaut [9i] Où est le programme après un logon
    Bonjour à tous,
    Afin de faire un premier audit des connexions, j'ai écrit un trigger simple qui récupère des informations à propos d'un user qui vient de se connecter.

    J'arrive à récupérer :
    - le nom de l'utilisateur, à travers la variable user,
    - la date de connexion, à travers la variable sysdate,
    - l'adresse IP, à travers
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SYS_CONTEXT('USERENV','IP_ADDRESS')
    .

    Ce que je n'arrive pas à récupérer :
    - Le programme/module avec lequel l'utilisateur se connecte.
    Alors que normalement, cette valeur devrait provenir de la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        SELECT module into prog
        from v$session
        where audsid = USERENV('sessionid');
    Justement, cette requête retourne toujours null. J'ai essayé de voir ce qui se fait à propos de ce sujet, c'est la même requête qui revient toujours dans les forums. Donc je me suis dit que c'est peut être à cause d'une variable du pfile qui est mal positionnée...

    Je vous remercie d'avance pour votre aide,

    Bien cordialement,

    PS : ci-joint, le code du trigger que j'ai écrit.


    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
     
    CREATE OR REPLACE TRIGGER AUDIT_USER_ACCESS
    AFTER LOGON ON DATABASE
    DECLARE
        adresse_ip varchar2(1000);
        prog sys.v_$session.program%TYPE;
    BEGIN
        adresse_ip := SYS_CONTEXT('USERENV','IP_ADDRESS');
     
        SELECT module into prog
        from v$session
        where audsid = USERENV('sessionid');
     
        if (prog is null) then
            prog := 'NULL';
        end if;
     
        if (adresse_ip not in ('A', 'B')
            and upper(prog) not in ('RWRUN60.EXE', 'IFRUN60.EXE')) then
            insert into audit_user_access values (user,
            TO_CHAR(SYSDATE,'DD/MM/YYYY-HH24:MI:SS'),
            adresse_ip, prog);
            commit;
        end if;
     
        EXCEPTION
        WHEN OTHERS THEN NULL;
    END;
    /

  2. #2
    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
    Ca va être dur de récupérer le nom du module dans un trigger after logon.
    Une application cliente se connecte à la base et ensuite elle peut positionner la valeur du module visible dans v$session via un appel au package PL/SQL (ou via OCI) dbms_application_info.set_module.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2009
    Messages : 19
    Par défaut
    Ok. Supposons que ce client n'est pas censé avoir le droit d'executer ce package, je pourrai quand même récupérer quelque chose de v$session (program ou module). Comment faire alors, autrement, pour récupérer le client avec lequel on vient de se connecter ?

  4. #4
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    @mnitu

    Juste pour information, ce n'est possible en OCI que depuis 10gR1

    Le PL a toujours une longueur d'avance...
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  5. #5
    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 HighSek Voir le message
    Ok. Supposons que ce client n'est pas censé avoir le droit d'executer ce package, je pourrai quand même récupérer quelque chose de v$session (program ou module)...
    Non, vous ne pouvez pas. V$SQL
    MODULE VARCHAR2(64) Contains the name of the module that was executing at the time that the SQL statement was first parsed, which is set by calling DBMS_APPLICATION_INFO.SET_MODULE
    Regardez dans la doc (j'ai mis le lien vers 10R2 parce que la 9 est dans les choux) à quoi vous avez accès dans un trigger after logon



    @Vincent.
    Oui, mais après assez que j'ai compris c'est plus performant.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2009
    Messages : 19
    Par défaut
    Merci pour vos réponses. Je suis convaincu sur ce qu'on ne peut pas avoir comme données lorsqu'on écrit un trigger after logon.

    Ok, une fois connecté, lorsque je lance une requête sur v$session, j'ai bien mon module (Sql*Plus, Forms, ...).

    Comment Oracle s'arrange t-il pour récupérer cette information ?

    D'après ce que j'ai compris le package dbms_application_info est grandement responsable de ça, à travers les fonctions set_module et read_module.

    En fait, dans le corps du trigger, j'ai mis à jour le champ module de v$session par un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dbms_application_info.set_module('dummy', 'action')
    .

    Un select de module de v$session juste après la connexion me donne dummy.

    Donc maintenant comment faire pour "setter" cette variable avec le bon programme, on supposant toujours que le client n'exécute pas ce package lors de la connexion.

    Si on ne peut pas faire ça :comment alors faire un audit simple et assez complet (utilisateur, date, module/programme) sur les connexions dans Oracle 9i ?

    Merci,

Discussions similaires

  1. Réponses: 5
    Dernier message: 17/03/2006, 12h36
  2. [SERVICE INTERACTIF] Form non utilisable apres logoff/logon
    Par Spart64 dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 05/03/2006, 13h32
  3. Afficher mon programme après réduction
    Par Coussati dans le forum Langage
    Réponses: 14
    Dernier message: 31/01/2006, 00h25
  4. démarrer un programme après tous les services
    Par chtiot dans le forum Langage
    Réponses: 8
    Dernier message: 05/11/2005, 06h45
  5. Lancer automatiquement un programme après connexion Internet
    Par sunshine dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 27/05/2005, 22h18

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