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 :

Trigger sur modification


Sujet :

PL/SQL Oracle

  1. #1
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 47
    Par défaut Trigger sur modification
    Salut internet,

    Alors voilà je dois créer un trigger lorsqu'un utilisateur va modifier une table,ce trigger doit rajouter 2 champs à la table :
    -la date de modification
    -l'id ou le nom de la personne qui a effectué cette modification

    ça doit donner un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    create or replace trigger Coucou
    before insert
    on tableKKK
       begin
          alter table tableKKK
                 add date_modif date
                 add nom_personne varchar2(50)
     
          insert into tableKKK (date_modif,nom_personne) values(to_char(sysdate,'DD/MM/YYYY HH24:MI:SS'),????)
     
      end
    Alors voilà je ne sais pas comment faire pour récupérer la personne qui a effectué la modification??pouvez vous m'aider?
    Et sinon si vous pouvez me donnez votre avis pour le trigger?

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    quelle drole d'idée. Pourquoi ne pas ajouter les colonnes une fois pour toute et mettre à jour les valeurs sur l'UPDATE ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ALTER TABLE tableKKK
                 ADD (date_modif date,nom_personne varchar2(50));
     
    CREATE OR REPLACE TRIGGER Coucou
    before INSERT
    ON tableKKK
       begin
          SELECT 
          :new.date_modif := SYSDATE;
          :new.nom_personne := '????';
     
    end

    Avec ton code, déjà le code DDL est interdit en PL/SQL, la deuxième ligne insérée provoquera une erreur parce que les colonnes existent dejà, tu inséreras une ligne avec juste le nom et la date ce qui ne permet pas de savoir quelle ligne cette personne a inséré

    Citation Envoyé par dany.bill Voir le message
    Et sinon si vous pouvez me donnez votre avis pour le trigger?
    C'est n'importe quoi Recherche trigger d'audit éventuellement, tu devrais avoir des infos intéressantes

  3. #3
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 47
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C'est n'importe quoi  Recherche trigger d'audit éventuellement, tu devrais avoir des infos intéressantes


    Oui c'est vrai tu a raison,mais bon c'est un premier jet(bien pourri ok..) en fait c'est pour la journalisation des tables.

    Mais tu ne ma pas répondu?Comment connaitre la personne qui a effectué la modif?

  4. #4
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    fallait pas demander ce qu'on en pense

    Regarde dans v$session l'info que tu préfères

  5. #5
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 47
    Par défaut
    Ok merci OraFrance.

    Pour ceux qui aurait les mêmes question,y a aussi "DBA_AUDIT_TRAIL" qui contient pas mal de truc.

    Bon ben je teste tout ça et je reviens.
    Bisou?

  6. #6
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 47
    Par défaut
    Re internetl,

    Alors voila pour faire un test (parce que apparement je ne sais même plus créer de trigger),j'ai crée un table PERSONNE qui ne contient qu'un seul champ 'id'.
    Puis j'ai crée une table Personne_LOG qui contiendra l'id de la personne (de la table Personne),la date de l'insertion et le nom de la personne qui a fait cette insertion.

    Alors en code ça donne ça (je sais c'est pourri ça me fait une erreur):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE OR REPLACE TRIGGER  "Test" AFTER insert ON PERSONNE
    declare nom varchar2(50);
     
    BEGIN
     
      select username from v$session into nom;
      insert into personne_log(personne_modif) values(nom);
     
     
     
    END;
    Apparement la syntaxe n'ai pas bonne...ça fait longtemps que j'ai pas fait de PL/SQL...donc soyez indulgent...
    P.S :ici j'ai testé que sur le nom....vu que ça donne une erreur pas la peine d'aller plus loin

  7. #7
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    INTO doit être avant le FROM

  8. #8
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 47
    Par défaut
    oula la honte ,oui je m'en suis rendu compte en lisant un cours

    ça donne ça maintenant mais ça change pas grand chose j'ai toujours une erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE OR REPLACE TRIGGER  "Test2" AFTER INSERT ON PERSONNE
    declare nom varchar2(50);
     
    BEGIN
     
      SELECT username INTO nom FROM v$session ;
      INSERT INTO personne_log(personne_modif) VALUES(nom);
     
     
     
    END;
    Quand j'insère dans la table personne,il me met une erreur et aucune insertion n'ai effectué ni dans la table personne ni dans la table personne_log

  9. #9
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Citation Envoyé par dany.bill Voir le message
    j'ai toujours une erreur:

    il me met une erreur
    Comme c'est intéressant

    Voila qui pourra te donner des idées : http://www.dba-oracle.com/art_builder_sec_audit.htm

    Et pour ton code, tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE OR REPLACE TRIGGER  "Test2" AFTER INSERT ON PERSONNE
    BEGIN
     
        INSERT INTO personne_log(personne_modif) 
        SELECT username FROM v$session WHERE sys_context('USERENV','SESSIONID') = audsid;
     
    END;
    L'erreur ne te parlerais pas de DECLARE par hasard ?

  10. #10
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 47
    Par défaut
    JE suis conscient de mon ignorance et j'en suis désolé
    L'erreur en question est la suivante :

    error ORA-04098: Déclencheur 'HR.Test2' non valide. Echec de la revalidation
    et quand je vais voir le trigger il ya deux erreurs :

    PL/SQL: ORA-00942: Table ou vue inexistante
    PL/SQL: SQL Statement ignored
    Pourtant les 2 tables personne et personne_log existent...je comprend rien..

    P.S :ces erreurs ,c est pr le bout de code que tu ma donnée...mais c'était les mêmes erreurs avant mon code ,et non y avait pas de problème avec DECLARE

  11. #11
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    le trigger et les 2 tables sont dans le même shéma ?

    PS : l'ignorance en PL/SQL ne vous exempte pas de founir toutes les infos utiles

  12. #12
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 47
    Par défaut
    Citation Envoyé par orafrance Voir le message
    le trigger et les 2 tables sont dans le même shéma ?

    PS : l'ignorance en PL/SQL ne vous exempte pas de founir toutes les infos utiles
    Oui dans le même shéma...vraimnt je comprends pas,je suis sous Oracle Express 11g (version légère et gratos) juste pour faire les tests

  13. #13
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    que donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT owner, object_name,object_type 
    FROM all_objects
    WHERE object_name like 'PERSONNE%' OR upper(object_name) = 'TEST2'

  14. #14
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 47
    Par défaut
    ça donne ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    OWNER	OBJECT_NAME	OBJECT_TYPE
     
    HR	PERSONNE_T1	TRIGGER
    HR	PERSONNE_T2	TRIGGER
    HR	PERSONNE	TABLE
    HR	PERSONNE_LOG	TABLE
    HR	Test2	TRIGGER

Discussions similaires

  1. trigger sur deux tables
    Par Shabata dans le forum Développement
    Réponses: 4
    Dernier message: 04/05/2004, 16h55
  2. triggers sur plusieurs bases de données
    Par Shabata dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/05/2004, 10h02
  3. Trigger sur une colonne ?
    Par hpalpha dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/03/2004, 14h16
  4. Trigger sur select
    Par bilo2000 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 02/02/2004, 13h39
  5. Pb Trigger sur vue
    Par cosminutza dans le forum Développement
    Réponses: 3
    Dernier message: 28/07/2003, 16h37

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