Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
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 23/06/2008, 10h03   #1
Invité de passage
 
Inscription : juin 2008
Messages : 12
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 12
Points : 2
Points : 2
Par défaut Erreur lors de la création d'un trigger

Bonjour à tous !
Alors voila je travaille actuellement sur GLPI et OCS Inventory (pour ceux qui connaissent) basés sur une base MySQL.
Et je voudrais créer un TRIGGER qui a chaque insertion dans une table vérifie le champ et le supprime s'il correspond.
Pour le moment j'ai ca...

Code :
1
2
3
4
5
6
7
8
9
CREATE TRIGGER suppr_printers BEFORE INSERT ON printers
FOR EACH ROWS BEGIN
IF (NEW.name LIKE '%PDF%') THEN
  DELETE FROM printers WHERE name LIKE '%PDF%';
END IF;
IF (NEW.name LIKE '%Fax%') THEN
  DELETE FROM printers WHERE name LIKE '%Fax%';
END IF;
END;
Et MySQL me répond

Code :
1
2
3
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '
CREATE TRIGGER suppr_printers BEFORE INSERT ON printers
FOR EACH ' at line 1
Sur la page principale de PHPMyadmin voici la version du serveur...

Version du serveur: 5.0.27-community-nt

Donc normalement les Triggers sont possibles
max72100 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 05h33   #2
Expert Confirmé
 
Avatar de Alain Defrance
 
Homme Alain DEFRANCE
Project Lead
Inscription : août 2007
Messages : 1 993
Détails du profil
Informations personnelles :
Nom : Homme Alain DEFRANCE
Âge : 24
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Project Lead

Informations forums :
Inscription : août 2007
Messages : 1 993
Points : 2 919
Points : 2 919
Envoyer un message via MSN à Alain Defrance Envoyer un message via Skype™ à Alain Defrance
Bonjour,

A première vue, c'est FOR EACH ROW (sans S)
__________________
http://alaindefrance.wordpress.com - http://www.alain-defrance.com
Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
Project Lead eXo Social
Java Black Belt - Java Black Belt Coach
Alain Defrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 10h06   #3
Invité de passage
 
Inscription : juin 2008
Messages : 12
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 12
Points : 2
Points : 2
Toujours pareil...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Erreur
requête SQL: 
 
CREATE TRIGGER suppr_printers BEFORE INSERT ON printers
FOR EACH
ROW BEGIN IF( NEW.name LIKE '%PDF%' ) 
THEN 
DELETE FROM printers WHERE name LIKE '%PDF%';
 
 
 
MySQL a répondu: 
 
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELETE FROM printers WHERE name LIKE '%PDF%'' at line 4
max72100 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 11h06   #4
Expert Confirmé
 
Avatar de Alain Defrance
 
Homme Alain DEFRANCE
Project Lead
Inscription : août 2007
Messages : 1 993
Détails du profil
Informations personnelles :
Nom : Homme Alain DEFRANCE
Âge : 24
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Project Lead

Informations forums :
Inscription : août 2007
Messages : 1 993
Points : 2 919
Points : 2 919
Envoyer un message via MSN à Alain Defrance Envoyer un message via Skype™ à Alain Defrance
Bonjour,

Première erreur :
Citation:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '
CREATE TRIGGER suppr_printers BEFORE INSERT ON printers
FOR EACH ' at line 1'
Deuxième erreur :
Citation:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELETE FROM printers WHERE name LIKE '%PDF%'' at line 4
C'est donc positif on avance

Je ne sais pas si tu as donné la procédure complète mais il manque les fin de bloques :

Code :
1
2
3
4
5
6
7
CREATE TRIGGER suppr_printers BEFORE INSERT ON printers
FOR EACH ROW
BEGIN
     IF( NEW.name LIKE '%PDF%' ) THEN 
          DELETE FROM printers WHERE name LIKE '%PDF%';
     END IF;
END;

Attention au DELIMITER il est souvent source de problèmes, quel client utilise utilise tu ?
__________________
http://alaindefrance.wordpress.com - http://www.alain-defrance.com
Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
Project Lead eXo Social
Java Black Belt - Java Black Belt Coach
Alain Defrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 11h13   #5
Invité de passage
 
Inscription : juin 2008
Messages : 12
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 12
Points : 2
Points : 2
J'utilise PHPMyAdmin si c'est ce que tu veux savoir...
max72100 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 12h27   #6
Expert Confirmé
 
Avatar de Alain Defrance
 
Homme Alain DEFRANCE
Project Lead
Inscription : août 2007
Messages : 1 993
Détails du profil
Informations personnelles :
Nom : Homme Alain DEFRANCE
Âge : 24
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Project Lead

Informations forums :
Inscription : août 2007
Messages : 1 993
Points : 2 919
Points : 2 919
Envoyer un message via MSN à Alain Defrance Envoyer un message via Skype™ à Alain Defrance
Dans ce cas tente ceci :
Code :
1
2
3
4
5
6
7
8
CREATE TRIGGER suppr_printers BEFORE INSERT ON printers
FOR EACH ROW
BEGIN
     IF( NEW.name LIKE '%PDF%' ) THEN 
          DELETE FROM printers WHERE name LIKE '%PDF%';
     END IF;
END;
//
Et dans la console qui te permet d'exécuter la requête spécifie le délimiteur // en bas de la popup.
__________________
http://alaindefrance.wordpress.com - http://www.alain-defrance.com
Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
Project Lead eXo Social
Java Black Belt - Java Black Belt Coach
Alain Defrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 13h48   #7
Invité de passage
 
Inscription : juin 2008
Messages : 12
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 12
Points : 2
Points : 2
requête executée avec succès donc je vous tiens au courant pour voir si ca fonctionne réellement.
Merci
max72100 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 14h11   #8
Invité de passage
 
Inscription : juin 2008
Messages : 12
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 12
Points : 2
Points : 2
Maintenant quand j'essaye d'ajouter une imprimante dans ma table voici la réponse de MySQL

Code :
1
2
3
MySQL a répondu: 
 
#1442 - Can't update table 'glpi_printers' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
max72100 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 14h18   #9
Expert Confirmé
 
Avatar de Alain Defrance
 
Homme Alain DEFRANCE
Project Lead
Inscription : août 2007
Messages : 1 993
Détails du profil
Informations personnelles :
Nom : Homme Alain DEFRANCE
Âge : 24
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Project Lead

Informations forums :
Inscription : août 2007
Messages : 1 993
Points : 2 919
Points : 2 919
Envoyer un message via MSN à Alain Defrance Envoyer un message via Skype™ à Alain Defrance
Cette erreur proviens du fait que qu'un verrous est posé lors de l'exécution du trigger, il deviens alors impossible de toucher a cette table avant la fin de l'execution du trigger.

Pourrait-tu nous expliquer a quoi va servir ce trigger afin de pouvoir tenter de te proposer une solution équivalent au DELETE
__________________
http://alaindefrance.wordpress.com - http://www.alain-defrance.com
Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
Project Lead eXo Social
Java Black Belt - Java Black Belt Coach
Alain Defrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 14h26   #10
Invité de passage
 
Inscription : juin 2008
Messages : 12
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 12
Points : 2
Points : 2
Je suis actuellement en stage (je fini vendredi midi) et je dois installé glpi et ocs inventory.
je voudrais empeché toutes les imprimantes du type "PDFCreatpor" ou "Fax" ou "Microsoft XPS Document Writer" de s'afficher dans la base

et donc je voulais faire un trigger pour vérifier à chaque insertion si oui ou non il faut l'insérer ou non ...
max72100 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2008, 15h16   #11
Invité de passage
 
Inscription : juin 2008
Messages : 12
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 12
Points : 2
Points : 2
Mon stage se finissant plus tôt que prévu à savoir jeudi soir, et voulant finir mon sujet de stage je voudrais savoir si quelqu'un pouvait m'aider à résoudre mon problème...

je ne vois vraiment pas ce qui cloche...
je ne vois pas pourquoi le trigger bloque, y'a t'il une raison ?

j'aimerai comprendre... aidez moi svp :-(
max72100 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2008, 09h05   #12
Expert Confirmé
 
Avatar de Alain Defrance
 
Homme Alain DEFRANCE
Project Lead
Inscription : août 2007
Messages : 1 993
Détails du profil
Informations personnelles :
Nom : Homme Alain DEFRANCE
Âge : 24
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Project Lead

Informations forums :
Inscription : août 2007
Messages : 1 993
Points : 2 919
Points : 2 919
Envoyer un message via MSN à Alain Defrance Envoyer un message via Skype™ à Alain Defrance
A vrai dire comme je disais, ton problème est un problème de verrous, et puisque la table est en mutation durant l'execution du trigger, c'est impossible d'agir sur cette-ci.

La solution qui résolverais directement ton problème au niveau du SQL procédural est : les exception.

La marche a suivre est la suivante :
1/ déclarer une exception
2/ si il faut annuler l'insertion alors réveiller l'exception
3/ lui associer un code d'erreur qui sera récupérable coté applicatif.

Je sais qu'avec Oracle c'est très facile mais j'avoue n'avoir jamais utilisé d'exception avec MySQL alors je ne saurais trop te conseiller de ce coté la, si ce n'est que de faire des recherche sur les exceptions avec le SQl procédural de MySQL.

Quand un exception est levé, l'éxécution du bloc d'instruction est stopé.
__________________
http://alaindefrance.wordpress.com - http://www.alain-defrance.com
Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
Project Lead eXo Social
Java Black Belt - Java Black Belt Coach
Alain Defrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2008, 14h15   #13
Invité de passage
 
Inscription : juin 2008
Messages : 12
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 12
Points : 2
Points : 2
Je vais essayer de regarder ca...
je vais chercher comment faire...
max72100 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h10.


 
 
 
 
Partenaires

Hébergement Web