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

Administration Oracle Discussion :

creation de trigger


Sujet :

Administration Oracle

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    Par défaut creation de trigger
    bonjour,
    je souhaite écrire un trigger dans une table, dont la clé est (LOGIN, CODE) , concernant un champ donné (FLAG)
    FLAG = 0 ou 1

    si on met à FLAG à 1, tous les autres enregistrements vont avoir FLAG = 0..
    comment je peux écrire ça..??

    j'ai fait ceci mais ça me génère une erreur comme quoi il est déjà en train de bidouiller dans la table..(MyTable en mutation.. le déclencheur ne peut la voir..)
    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
     
    CREATE OR REPLACE TRIGGER TRIG_MyTable
    BEFORE INSERT OR UPDATE
    ON MyTable
    FOR EACH ROW
     
    BEGIN
    	 IF UPDATING THEN
    	    IF :New.FLAG = 1 THEN
    		UPDATE MyTable
    		SET FLAG= 0
    		WHERE Login = :NEW.Login
    		AND Code <> :NEW.Code; 
                     END IF;
    	 END IF;
    END;
    /

  2. #2
    Membre habitué Avatar de VinceTlse
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 163
    Points : 191
    Points
    191
    Par défaut
    Tu ne pourras pas faire de trigger car ta table est en cours de modification (Table Mutating ...).
    Pourquoi ne pas le faire en 2 passes?
    1ere requete qui met a jour le falg pour (LOGIN, CODE)
    2 ieme requete qui met le flag à 0 pour tous les autres couple différent de (LOGIN, CODE)
    Pourquoi faire aujourd'hui ce que l'on peut faire demain ...

  3. #3
    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
    Merci d'utiliser la fonction rechercher vous trouverez toutes les informations nécessaires pour résoudre ce problème, cette question étant maintes fois posée.
    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.

  4. #4
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    Par défaut
    c'est vrai..
    à chaque fois, on me renvoie sur un autre lien, et chacun propose une méthode..

  5. #5
    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
    Eh bien toutes les solutions pour éviter l'erreur ORA-04091 sont là :
    http://sgbd.developpez.com/oracle/ora-04091/
    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.

  6. #6
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    Par défaut
    j'ai déjà vu ce lien..

    d'abord, je cherche à mettre à jour toute ma table excepté l'enregistrement qui a changé..

    ensuite, comme je suis loin d'etre expert en bases de données, j'ignore quelles conséquences a le fait d'ajouter des tables temporaires, ou l'ajout d'un 2ème ou 3ème trigger..(problème de performance)

    par ailleurs, le coup des exceptions n'est pas du tout intéressant pour ce cas là car oracle intercepte des ecceptions qui n'ont pas lieu d'être..

    voila..
    Ce n'est pas faute de pas avoir cherché, et excuser mon manque de compétences dans ce domaine..

  7. #7
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Citation Envoyé par freestyler
    ensuite, comme je suis loin d'etre expert en bases de données, j'ignore quelles conséquences a le fait d'ajouter des tables temporaires, ou l'ajout d'un 2ème ou 3ème trigger..(problème de performance)
    Ca complique l'architecture, les perfs etc.

    Citation Envoyé par freestyler
    par ailleurs, le coup des exceptions n'est pas du tout intéressant pour ce cas là car oracle intercepte des ecceptions qui n'ont pas lieu d'être..
    Comme dit dans le tutoriel, l'exception levée est une information, libre à toi de la considérer ou pas. Mais il faut l'intercepter si tu veux pouvoir faire ce que tu veux.
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  8. #8
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Plutôt que de créer une usine à gaz, tu peux pas créer une sous table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE FLAG
    (
      LOGIN NUMBER PRIMARY KEY,
      CODE  VARCHAR2(10)
    )
    Et dans code tu mets le code du flag = 1 (par trigger sur ta table login)
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  9. #9
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Ou modifier la façon dont les données sont insérées ? Au lieu d'un INSERT ou UPDATE tout bête tu peux imaginer de créer des fonctions spécifiques à ces tables qui, respectivement, insère la nouvelles ligne PUIS update les autres lignes et update la nouvelles valeur PUIS update les autres lignes.
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  10. #10
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    Par défaut
    excusez moi mais je croyais qu'il s'agissait d'un simple problème sous oracle..
    et chacun continue de me balancer une idée et jamais une solution que l'on sait qui fonctionne..

    en fait..
    je me suis renseigné auprès de notre admin
    --> pas moyen d'ajouter une nouvelle table..

    c'est pourtant simple.. si FLAG passe à 1, tous les autres FLAG passent à 0!

  11. #11
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Moi je me pose une question :
    tu modifies une ligne
    |-> trigger se déclenche
    |---> modification de toutes les autres lignes
    |-----> pour chaque ligne le trigger se déclenche.
    |-------> etc.

    non ?
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  12. #12
    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
    Les solutions que l'on te donne fonctionnent, mais tu n'as pas l'air d'être intéressé.

    Je te donne mon avis après tu en fais ce que tu veux : dans ton cas, puisque tu ne peux pas créer de table temporaire, j'opterai pour une des méthodes suivantes :
    - trigger instead of
    - gestion d'exception dans le trigger

    avec une préférence pour cette dernière solution, puisque c'est celle qui est la plus proche de ce que tu as déjà fait (il ne reste qu'à ajouiter un bloc exception ce qui ne me semble pas insurmontable).
    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.

  13. #13
    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
    Citation Envoyé par freestyler
    par ailleurs, le coup des exceptions n'est pas du tout intéressant pour ce cas là car oracle intercepte des ecceptions qui n'ont pas lieu d'être..
    Peux-tu donner un exemple ? Je n'ai jamais vu oracle intecepter une autre exception que celle qu'on lui a demandé d'intercepter.
    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.

  14. #14
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    Par défaut
    Moi je me pose une question :
    tu modifies une ligne
    |-> trigger se déclenche
    |---> modification de toutes les autres lignes
    |-----> pour chaque ligne le trigger se déclenche.
    |-------> etc.
    effectivement..
    sauf que le trigger se déclenche 1 seule fois !
    cela veut dire que je ne peux avoir qu'un seul FLAG à 1 dans toute la table..

    Par contre,
    le trigger instead of ne se fait que sur une vue..
    la gestion des exceptions, je n'arrive pas à la faire marcher finalement.. je suis encore en train d'essayer..

  15. #15
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Euh je croyais qu'un trigger instead of ne pouvait se faire que sur une vue. S'il ne peut pas créer de table, je ne suis pas sur qu'il puisse créer une vue.

    Sinon je vote aussi pour la gestion de l'exception.

    Et le problème que j'ai soulevé au dessus ne risque pas de se produire puisque il a déjà géré un update de toutes les lignes seulement si la ligne mise à jour a le flag=1.

    EDIT:
    vi vi freestyler, j'ai relu ton code et j'ai vu que tu l'avais déjà géré
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  16. #16
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    Par défaut
    bon..
    j'ai écrit ceci..
    mais je ne sais pas quoi faire quand l'exception se produit..
    comme il est écrit, le nouveau champ est bien mis à 1, mais les autres champs ne sont pas remis à 0 (on dirait que le trigger n'existe pas!)

    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 TRIG_MyTable_Active 
    AFTER UPDATE
    on MyTable
    For each row
    DECLARE
        TABLE_MUTANTE EXCEPTION;
        PRAGMA EXCEPTION_INIT(TABLE_MUTANTE, -4091);
    begin
     
    if :New.FLAG= 1 then
     
    		UPDATE MyTable
    		SET FLAG= 0
    		WHERE :New.Login = Login 
    		AND :New.Code <> Code;
     
    END IF;
     
    EXCEPTION
    		 WHEN TABLE_MUTANTE THEN 
                                   DBMS_OUTPUT.PUT_LINE('Table Mutante...');
     
    END;
    /

  17. #17
    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
    Citation Envoyé par freestyler
    le trigger instead of ne se fait que sur une vue..
    Je n'ai pas dit le contraire, mais tu n'as pas dit que tu ne pouvais pas créer de vue.

    Citation Envoyé par nuke_y
    Euh je croyais qu'un trigger instead of ne pouvait se faire que sur une vue. S'il ne peut pas créer de table, je ne suis pas sur qu'il puisse créer une vue.
    Les conséquences de création d'une vue ne sont pas les mêmes, c'est juste une requête que tu stockes en base et pas un doublons de données

    Essaie :
    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
    CREATE OR REPLACE TRIGGER TRIG_MyTable
    BEFORE INSERT OR UPDATE
    ON MyTable
    FOR EACH ROW
    DECLARE
        err_table_mutante exception;
        pragma exception_init(err_table_mutante, -4091);
     
    BEGIN
    	 IF UPDATING THEN
    	    IF :New.FLAG = 1 THEN
                        begin
    		UPDATE MyTable
    		SET FLAG= 0
    		WHERE Login = :NEW.Login
    		AND Code <> :NEW.Code; 
                        exception
                              when err_table_mutante then null;
                        end;
                     END IF;
    	 END IF;
     
    END;
    /
    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.

  18. #18
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    Par défaut
    en gros t'as remplacé mon after par un before..
    Ainsi que le coup du NULL..

    Ca marche toujours pas.. je veux dire rien ne se passe quand FLAG passe à 1 !

  19. #19
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    Par défaut
    Vous me demandez de gérer des exceptions pour ignorer les messages d'erreur et non pas pour pouvoir effectuer des traitements sur la table dans le cas où une exception se produit..

    donc si je comprends bien, il faudra que je passe par la création d'objets supplémentaires!

    qqn peut-il m'aider pour un trigger INSTEAD OF??

  20. #20
    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
    Citation Envoyé par freestyler
    en gros t'as remplacé mon after par un before..
    Ainsi que le coup du NULL..

    Ca marche toujours pas.. je veux dire rien ne se passe quand FLAG passe à 1 !
    Excuse nos 2 messages ont du se croiser.

    Citation Envoyé par freestyler
    Vous me demandez de gérer des exceptions pour ignorer les messages d'erreur et non pas pour pouvoir effectuer des traitements sur la table dans le cas où une exception se produit..

    donc si je comprends bien, il faudra que je passe par la création d'objets supplémentaires!

    qqn peut-il m'aider pour un trigger INSTEAD OF??
    Oui, en fait à bien y réfléchir tu n'as pas le choix... Voici un exemple de ce que tu peux faire :
    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
    SQL> create or replace trigger trg_vue_login instead of update on vue_login for each row
      2  begin
      3    if :new.flag = 1 then
      4       update login set flag = 0
      5       where log != :new.log;
      6       update login set flag = 1
      7       where log = :new.log;
      8    end if;
      9  end;
     10  /
    Trigger created.
     
    SQL> update vue_login set flag = 1 where log = 'a';
    1 row updated.
     
    SQL> select * from login;
    LOG                                 FLAG
    ------------------------------ ---------
    a                                      1
    b                                      0
    c                                      0
     
    SQL> update vue_login set flag = 1 where log = 'b';
    1 row updated.
     
    SQL> select * from login;
    LOG                                 FLAG
    ------------------------------ ---------
    a                                      0
    b                                      1
    c                                      0
    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.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. [oracle][php]creation de trigger
    Par guittonews dans le forum PL/SQL
    Réponses: 6
    Dernier message: 06/12/2007, 11h10
  2. Probleme de creation de trigger
    Par Cartman.inc dans le forum PL/SQL
    Réponses: 1
    Dernier message: 20/06/2007, 11h11
  3. [PHP5.2][MySQL5.0.27] Creation de triggers depuis PHP
    Par frochard dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 05/12/2006, 10h16
  4. [PL/SQL] Creation de triggers dans transaction
    Par globeriding dans le forum Oracle
    Réponses: 15
    Dernier message: 07/02/2006, 11h33
  5. creation de trigger
    Par mitsubi dans le forum SQL
    Réponses: 3
    Dernier message: 12/09/2003, 15h13

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