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 :

[oracle 9i] Un trigger qui fait planter oracle !


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    422
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 422
    Points : 113
    Points
    113
    Par défaut [oracle 9i] Un trigger qui fait planter oracle !
    Salut,
    j'ai essayé de supprimer un trigger dont je n'avais plus besoin mais bizarrement ce n'est pas faisable. A chaque fois que j'essaye de le modifier/désactiver/supprimer la requête se lance mais ça boucle indéfiniment et al fin je suis obligé de quitter (sql+ ou toad)
    Que faire ?
    Merci.

  2. #2
    Invité
    Invité(e)
    Par défaut
    1- quel est ce trigger ? Code...
    2- comment le supprimes tu ?
    3- pourquoi tu parles d'une requête dans la suppression d'un trigger ?

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    422
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 422
    Points : 113
    Points
    113
    Par défaut
    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 TRIG
    AFTER INSERT
    ON JOJO.VILLE_FOURNISSEUR
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
    declare
    nbre_code_postal ville_fournisseur.CODEPOSTAL%type;
    nbre_num_rue ville_fournisseur.NUM_RUE%type;
     
    begin
     
    select count(*) into nbre_code_postal from ville where codepostal=:new.codepostal
    	   and nomville=:new.nomville;
     
    if (nbre_code_postal=0)
    then
    	insert into ville values (:new.codepostal,:new.nomville);
    end if;
     
    select count(*) into nbre_num_rue from adresse where num_rue=:new.num_rue and
    	   adresse=:new.adresse;
    if (nbre_num_rue=0)
    then
    	 insert into adresse values (:new.num_rue,:new.adresse);
    	 insert into ville_adresse values (:new.codepostal,:new.nomville,:new.num_rue,:new.adresse);
    end if;
     
    end;
    /
    j'ai essayé de le supprimer/désactiver/modifier avec toad (via l'interface graphique et ligne de commande) et sql+ (drop trigger trig) mais ça coince toujours lors de l'execution.
    3>je parle de la requête drop trigger trig;

  4. #4
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    Salut,
    nous dire "ça coince" ne nous aide pas beaucoup...
    tu as quel message d'erreur ?
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Déja tu peux simplifier :

    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
    32
    33
    34
    CREATE OR REPLACE TRIGGER TRIG
    AFTER INSERT
    ON JOJO.VILLE_FOURNISSEUR
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
    declare
    nbre_code_postal ville_fournisseur.CODEPOSTAL%type;
    nbre_num_rue ville_fournisseur.NUM_RUE%type;
     
    begin
     
    INSERT INTO ville (
    SELECT :new.codepostal,:new.nomville
    FROM DUAL
    WHERE NOT EXISTS (SELECT 1 FROM ville WHERE codepostal=:new.codepostal
    	   AND nomville=:new.nomville)
    );
     
    SELECT count(*) INTO nbre_num_rue FROM adresse WHERE num_rue=:new.num_rue AND
    	   adresse=:new.adresse;
     
    INSERT INTO adresse (
    SELECT :new.num_rue,:new.adresse
    FROM DUAL
    WHERE NOT EXISTS (SELECT 1 FROM adresse WHERE num_rue=:new.num_rue AND adresse=:new.adresse)
    );
     
     
    IF SQL%ROWCOUNT =1 THEN
    INSERT INTO ville_adresse VALUES (:new.codepostal,:new.nomville,:new.num_rue,:new.adresse);
    end IF;
     
    end;
    /
    L'idéal étant d'avoir un index unique sur VILLE(codepostal,nomville) et ADRESSE(num_rue,adresse) et gérer les 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
    20
    21
    22
    23
    CREATE OR REPLACE TRIGGER TRIG
    AFTER INSERT
    ON JOJO.VILLE_FOURNISSEUR
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
    begin
     
    BEGIN
      INSERT INTO ville VALUES (:new.codepostal,:new.nomville);
    EXCEPTION WHEN DUP_VAL_ON_INDEX THEN null; -- ignore l'erreur de clé unique
    END;
     
    BEGIN
      INSERT INTO adresse VALUES (:new.num_rue,:new.adresse);
    EXCEPTION WHEN DUP_VAL_ON_INDEX THEN null; -- ignore l'erreur de clé unique
    END;
     
    IF SQL%ROWCOUNT =1 THEN
      INSERT INTO ville_adresse VALUES (:new.codepostal,:new.nomville,:new.num_rue,:new.adresse);
    end IF;
     
    end;
    /
    PS : Ca c'est faut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nbre_code_postal ville_fournisseur.CODEPOSTAL%type;
    nbre_num_rue ville_fournisseur.NUM_RUE%type;
    les count sont des NUMBER, si jamais tu changes le type de tes colonnes tu risques d'avoir des soucis

  6. #6
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par isoman Voir le message
    ...
    j'ai essayé de le supprimer/désactiver/modifier avec toad (via l'interface graphique et ligne de commande) et sql+ (drop trigger trig) mais ça coince toujours lors de l'execution.
    Est-ce que par "ça coince toujours lors de l'execution" tu veut dire que la commande n'abouti jamais sans avoir une erreur ? Comme s’il y avait un lock ?

    PS: Mise en forme

  7. #7
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    c'est bien possible qu'il y ait un lock...

    session 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SQL> create table t (x number);
     
    Table created.
     
    SQL> create trigger tr after update on t begin sys.dbms_lock.sleep(2000); end;
      2  /
     
    Trigger created.
     
    SQL> update t set x=0;
    session 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SQL> drop trigger tr;
    drop trigger tr
    *
    ERROR at line 1:
    ORA-01013: user requested cancel of current operation
     
    SQL> select mode_held,LOCK_TYPE,BLOCKING_OTHERS from dba_locks 
    where lock_id1=(select object_id from dba_objects where object_name='T');
     
    MODE_HELD            LOCK_TYPE                  BLOCKING_OTHERS
    -------------------- -------------------------- ------------------
    Row-X (SX)           DML                        Not Blocking

    PS: le titre est un peu léger, ce n'est pas Oracle qui plante, c'est ton Toad qui attend...

  8. #8
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    422
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 422
    Points : 113
    Points
    113
    Par défaut
    ben comme je débute je ne sais pas ce que donne un lock.Mais quand j'essaye de le dropper (via toad ou l'invite de commande) ça tourne indéfiniment et le trigger est toujours la !

  9. #9
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    commence par sélectionner les sessions. Avec la requete que je t'ai donnée cherche s'il y a un lock sur VILLE_FOURNISSEUR et identifie la session...

  10. #10
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    422
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 422
    Points : 113
    Points
    113
    Par défaut
    c'est bizarre car je n'utilise qu'une seule session. Je vais essayer pour voir ce que ça donne.

  11. #11
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    toad démarre toujours des sessions en parallèles, ferme toad et tente avec sqlplus, regarde avec select sid,program,username from v$session where username!='SYS' qui est connecté

Discussions similaires

  1. [Access 2003] Macro qui fait planter Access
    Par nuriel2 dans le forum Access
    Réponses: 5
    Dernier message: 10/05/2006, 14h00
  2. Supprimer une crontab qui fait planter le server
    Par osmoze dans le forum Administration système
    Réponses: 5
    Dernier message: 31/03/2006, 15h42
  3. 56k qui fait planter le PC
    Par Spack dans le forum Périphériques
    Réponses: 4
    Dernier message: 03/10/2005, 19h35
  4. probleme de requette qui fait planter powergres
    Par fehmitn dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 15/09/2004, 18h48
  5. Réponses: 12
    Dernier message: 16/03/2004, 14h21

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