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 9i] Triggers sur les updates de tables


Sujet :

Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 90
    Points : 59
    Points
    59
    Par défaut [Oracle 9i] Triggers sur les updates de tables
    Bonjour,

    Voici ma problématique : on me demande d'étudier la possibilité de tracer, à l'aide de triggers, les insertions ou updates effectués dans toutes les tables d'un schéma (environ 300).

    Sachant que le traçage en question consiste à mettre à jour 2 champs (nom et date) appartenant à une des 4 tables "mères" dont héritent la plupart des tables.

    Je me pose donc différentes questions :
    1) Est-il possible de traiter tout ça à l'aide d'un seul trigger, ou bien n'y a-t-il pas d'autre possibilité que de créer un trigger pour chaque table ?

    2) Pour une table donnée, comment spécifier quelle table "mère" doit être mise à jour en s'aidant de la contrainte foreign key entre les 2 tables ?

    3) Dans le cas où une table "mère" est directement mise à jour (cas que je teste pour l'instant), je me heurte à l'erreur ORA-4091 de la table mutante. Comment la contourner ? J'ai lu le tutoriel de Pomalaix, très instructif, et tenté d'appliquer la gestion d'exception, et dans ce cas l'exception est bien levée, l'update de ma ligne est fait, mais pas celui de mes 2 champs de "suivi". Comment faire ?

    Merci de votre aide

    Zestrellita
    Expérience: nom dont les hommes baptisent leurs erreurs. Oscar Wilde

  2. #2
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut Re: [Oracle 9i] Triggers sur les updates de tables
    Citation Envoyé par zestrellita
    1) Est-il possible de traiter tout ça à l'aide d'un seul trigger, ou bien n'y a-t-il pas d'autre possibilité que de créer un trigger pour chaque table ?
    Pas à ma connaissance.

    Citation Envoyé par zestrellita
    2) Pour une table donnée, comment spécifier quelle table "mère" doit être mise à jour en s'aidant de la contrainte foreign key entre les 2 tables ?
    Via les table ALL_CONTRAINTS ou USER_CONSTRAINTS et execute immediate.

    Citation Envoyé par zestrellita
    3) Dans le cas où une table "mère" est directement mise à jour (cas que je teste pour l'instant), je me heurte à l'erreur ORA-4091 de la table mutante. Comment la contourner ? J'ai lu le tutoriel de Pomalaix, très instructif, et tenté d'appliquer la gestion d'exception, et dans ce cas l'exception est bien levée, l'update de ma ligne est fait, mais pas celui de mes 2 champs de "suivi". Comment faire ?
    Pourquoi ne faire un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    :new.date_maj := sysdate;
    :new.nom = 'MATABLE';
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 90
    Points : 59
    Points
    59
    Par défaut Re: [Oracle 9i] Triggers sur les updates de tables
    Merci pour tes réponses très rapides

    Citation Envoyé par plaineR
    Citation Envoyé par zestrellita
    1) Est-il possible de traiter tout ça à l'aide d'un seul trigger, ou bien n'y a-t-il pas d'autre possibilité que de créer un trigger pour chaque table ?
    Pas à ma connaissance.
    C'est ce qui me semblait oui

    Citation Envoyé par plaineR
    Citation Envoyé par zestrellita
    2) Pour une table donnée, comment spécifier quelle table "mère" doit être mise à jour en s'aidant de la contrainte foreign key entre les 2 tables ?
    Via les table ALL_CONTRAINTS ou USER_CONSTRAINTS et execute immediate.
    C'est ce que j'ai tenté d'utiliser, mais ces vues n'indiquent pas le nom de la table référencée par la contrainte, seulement le nom de la table sur laquelle porte la contrainte.
    Ou bien je dois simplement déduire le nom de la table du nom de la clé primaire référencée (R_CONSTRAINT_NAME) ? Mais dans le cas d'un nom de clé primaire non conforme, ça ne marche pas.

    Citation Envoyé par plaineR
    Citation Envoyé par zestrellita
    3) Dans le cas où une table "mère" est directement mise à jour (cas que je teste pour l'instant), je me heurte à l'erreur ORA-4091 de la table mutante. Comment la contourner ? J'ai lu le tutoriel de Pomalaix, très instructif, et tenté d'appliquer la gestion d'exception, et dans ce cas l'exception est bien levée, l'update de ma ligne est fait, mais pas celui de mes 2 champs de "suivi". Comment faire ?
    Pourquoi ne faire un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    :new.date_maj := sysdate;
    :new.nom = 'MATABLE';
    En effet, ça marche très bien, merci J'avais cherché trop compliqué.
    Expérience: nom dont les hommes baptisent leurs erreurs. Oscar Wilde

  4. #4
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut Re: [Oracle 9i] Triggers sur les updates de tables
    Citation Envoyé par zestrellita
    Citation Envoyé par plaineR
    Citation Envoyé par zestrellita
    2) Pour une table donnée, comment spécifier quelle table "mère" doit être mise à jour en s'aidant de la contrainte foreign key entre les 2 tables ?
    Via les table ALL_CONTRAINTS ou USER_CONSTRAINTS et execute immediate.
    C'est ce que j'ai tenté d'utiliser, mais ces vues n'indiquent pas le nom de la table référencée par la contrainte, seulement le nom de la table sur laquelle porte la contrainte.
    Ou bien je dois simplement déduire le nom de la table du nom de la clé primaire référencée (R_CONSTRAINT_NAME) ? Mais dans le cas d'un nom de clé primaire non conforme, ça ne marche pas.
    Si j'ai compris ce que tu voulais faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select table_name 
    from user_constraints 
    where constraint_name in (select r_constraint_name
                              from user_constraints
                              where table_name = 'TABLE_FILLE');
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 90
    Points : 59
    Points
    59
    Par défaut
    Mais oui c'est tout à fait ça !!! J'étais partie dans un truc compliqué avec des fonctions substr et instr pour retirer le préfixe PK_ de la contrainte...

    Merci beaucoup pour ton aide PlaineR !
    Expérience: nom dont les hommes baptisent leurs erreurs. Oscar Wilde

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 90
    Points : 59
    Points
    59
    Par défaut
    Voilà, j'ai réussi à créer mon ensemble de triggers, par contre je me heurte à un nouveau problème.

    En fait, lors de l'update d'une ligne, je dois mettre à jour un champ 'uusr' indiquant le login de la personne qui a fait l'update, ce login étant indiqué par le champ CLIENT_INFO de la vue V$SESSION.
    Mais je ne vois pas du tout comment relier cette vue à la ligne :new définissant la ligne mise à jour ?

    Voici les 2 types de triggers, créés via une requête select sur l'ensemble des tables du schéma :

    Pour une table-fille (mise à jour de la table-mère, préalablement déterminée via la contrainte reliant les 2) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create or replace trigger TEST.trace_TABLEFILLE
    before insert or update on TEST.TABLEFILLE 
    for each row 
    begin 
    update TABLEMERE 
    set uusr = 'LOGIN', udate = sysdate 
    where id=:new.id ;
    end ;
    Pour une table-mère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    create or replace trigger TEST.trace_TABLEMERE
    before insert or update on TEST.TABLEMERE
    for each row 
    begin 
    :new.uusr := 'LOGIN' ; 
    :new.udate := sysdate ;
    end ;
    Expérience: nom dont les hommes baptisent leurs erreurs. Oscar Wilde

  7. #7
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    essayez donc plutôt : ;-)

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 90
    Points : 59
    Points
    59
    Par défaut
    Mais où je vais chercher ce USER ??

    En fait là mon 'LOGIN' représente le code utilisé par chaque utilisateur pour se connecter au schéma TEST, et indiqué dans le champ CLIENT_INFO de la vue V$SESSION.
    Expérience: nom dont les hommes baptisent leurs erreurs. Oscar Wilde

  9. #9
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut

    Essayez donc !!!

    USER est une "fonction" qui vous retourne le nom de l'utilisateur connecté !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    declare 
      QUISUISJE VARCHAR2(30);
    begin
       QUISUISJE := USER;
       DBMS_OUTPUT.PUT_LINE(QUISUISJE);  
    end;
    /
    Si vous tenez à aller dans v$session :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM v$session
      WHERE AudSid = sys_context('USERENV', 'sessionid');

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 90
    Points : 59
    Points
    59
    Par défaut
    Oups, I'm confused Merci, j'essaie de suite mais vous fâchez pas siouplaît
    Expérience: nom dont les hommes baptisent leurs erreurs. Oscar Wilde

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 90
    Points : 59
    Points
    59
    Par défaut
    Alors en effet ça marche, mais cela me donne le nom du schema (user), à savoir TEST, ce qui n'est pas ce que je veux... vous fâchez pas hein...
    Expérience: nom dont les hommes baptisent leurs erreurs. Oscar Wilde

  12. #12
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Et la 2nde partie de ma réponse ? ;-)

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 90
    Points : 59
    Points
    59
    Par défaut
    Yesssss, ça marche !
    Merci beaucoup LeoAnderson, je n'aurais jamais trouvé
    Expérience: nom dont les hommes baptisent leurs erreurs. Oscar Wilde

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

Discussions similaires

  1. Triggers sur on update sans updater
    Par YvesTan dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 13/10/2007, 22h18
  2. Oracle 10g - calcul sur les dates
    Par themateo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 17/08/2007, 10h50
  3. [PLSQL oracle 9i] erreur sur les jobs
    Par Herveg dans le forum Oracle
    Réponses: 9
    Dernier message: 11/12/2006, 14h01
  4. [Oracle 10g] Question sur les sous-requetes
    Par hotkebab99 dans le forum Oracle
    Réponses: 2
    Dernier message: 27/10/2006, 11h25
  5. Récupération des commentaires sur les champs des tables.
    Par mikef32 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 10/08/2006, 00h23

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