Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/05/2008, 18h13   #1
Membre régulier
 
Inscription : novembre 2006
Messages : 422
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 422
Points : 76
Points : 76
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.
isoman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2008, 19h38   #2
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 523
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 523
Points : 3 972
Points : 3 972
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 ?
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2008, 19h44   #3
Membre régulier
 
Inscription : novembre 2006
Messages : 422
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 422
Points : 76
Points : 76
Code :
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;
isoman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2008, 09h29   #4
Membre émérite
 
Avatar de Yorglaa
 
Inscription : janvier 2004
Messages : 845
Détails du profil
Informations personnelles :
Âge : 41
Localisation : Suisse

Informations forums :
Inscription : janvier 2004
Messages : 845
Points : 939
Points : 939
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
Yorglaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2008, 09h30   #5
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Déja tu peux simplifier :

Code :
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 :
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 :
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
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2008, 11h49   #6
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 320
Points : 5 839
Points : 5 839
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
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2008, 12h23   #7
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
c'est bien possible qu'il y ait un lock...

session 1
Code :
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 :
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...
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2008, 16h22   #8
Membre régulier
 
Inscription : novembre 2006
Messages : 422
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 422
Points : 76
Points : 76
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 !
isoman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2008, 16h31   #9
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
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...
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2008, 16h43   #10
Membre régulier
 
Inscription : novembre 2006
Messages : 422
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 422
Points : 76
Points : 76
c'est bizarre car je n'utilise qu'une seule session. Je vais essayer pour voir ce que ça donne.
isoman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2008, 09h26   #11
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
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é
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h52.


 
 
 
 
Partenaires

Hébergement Web