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 17/08/2006, 17h28   #1
Invité de passage
 
Étudiant
Inscription : août 2006
Messages : 5
Détails du profil
Informations personnelles :
Localisation : Canada

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2006
Messages : 5
Points : 2
Points : 2
Par défaut Question de trigger

Bonjour,
je suis en train de me familliariser avec les nouveautés de MySQL 5 dont les trigger et les stored procedure. J'ai réussi à l'aide de quelques posts sur ce forum à créé une procédure stocké (addService()), je veux maintenant que cette procédure s'exécute lors de l'ajout ou de la suppression dans une certaine table.

J'ai donc réussi à me créer un trigger sur la table en question :
Code :
1
2
3
4
5
6
7
8
9
DELIMITER $$
 
CREATE TRIGGER `tai_services` AFTER INSERT ON `SERVICES`
FOR EACH ROW
BEGIN
  CALL addService();
END$$
 
DELIMITER ;
Je n'ai pas eu d'erreur

Ce que j'aimerais savoir, c'est s'il y a possibilité de voir les triggers qui ont été créé sur les tables... Je sais que j'ai fait un trigger de test que je n'ai pas encore "droppé", mais je sais pas où le voir. J'utilise plusieurs outils : phpMyAdmin, MySQL Administrator, MySQL Query Browser. Est-ce que quelqu'un connait un moyen de retrouver mes triggers ??

Un autre chose, est-ce qu'il y a moyen de voir si l'exécution du trigger s'est bel et bien fait... genre un log file ou quelques chose ??

J'attends de vos réponses, merci!
flaplante est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2006, 18h10   #2
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
Tu peux récupérer la liste des triggers d'une base avec :

Code :
SHOW TRIGGERS [FROM nom_base]
. Il y a peut-être un autre moyen de les voir avec ces outils, mais je ne le connais pas !

Pour l'autre question, aucune idée, désolé.
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2006, 05h05   #3
Invité de passage
 
Étudiant
Inscription : août 2006
Messages : 5
Détails du profil
Informations personnelles :
Localisation : Canada

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2006
Messages : 5
Points : 2
Points : 2
bon... la création de mon trigger a fonctionné, mais lorsque qu'il doit entrer en fonction (lors du INSERT dans la table), j'obtiens l'erreur suivante (dans phpMyAdmin et MySQL Query Browser) :

Citation:
#1336 - Dynamic SQL is not allowed in stored function or trigger
Est-ce qu'il y a quelqu'un qui peut m'expliquer pourquoi j'ai cette erreur et comment la corriger... ?

Merci à l'avance
flaplante est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2006, 08h15   #4
Membre chevronné
 
Avatar de gerald2545
 
Inscription : février 2003
Messages : 643
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 643
Points : 660
Points : 660
tu nous donnes le contenu de ta fonciton AddService STP
gerald2545 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2006, 13h27   #5
Invité de passage
 
Étudiant
Inscription : août 2006
Messages : 5
Détails du profil
Informations personnelles :
Localisation : Canada

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2006
Messages : 5
Points : 2
Points : 2
Salut, alors voici ma procédure qui doit être exécuté par le trigger en question :

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
DELIMITER $$
 
CREATE PROCEDURE `addService`()
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE id VARCHAR(2);
  DECLARE strSet VARCHAR(50);
  DECLARE cur CURSOR FOR SELECT idService FROM services ORDER BY idService;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
 
  OPEN cur;
  REPEAT
    FETCH cur INTO id;
    IF NOT done THEN
      SET strSet = CONCAT_WS(",", strSet,CONCAT("'",id,"'"));
    END IF;
  UNTIL done END REPEAT;
  CLOSE cur;
 
  SET @requete = CONCAT('ALTER TABLE `Test` CHANGE `champSet` `champSet` SET(', strSet, ') NOT NULL');
  PREPARE requete_alter FROM @requete;
  EXECUTE requete_alter;
  DEALLOCATE PREPARE requete_alter;
 
  SELECT message(strSet);
 
END $$
 
DELIMITER ;
Code :
1
2
3
4
5
6
7
8
DELIMITER $$
 
CREATE FUNCTION `message`(msg TEXT) RETURNS text
BEGIN
  RETURN msg;
END $$
 
DELIMITER ;
Je peux exécuter la procédure addService() sans problème et elle fonctionne bien. C'est seulement lors de l'exécution du trigger lors d'un INSERT dans ma table Services que ca cause problème.
flaplante est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2006, 21h22   #6
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
Désolé pour toi, mais c'est une limitation de MySQL.

Citation:
You cannot use dynamic SQL within stored routines (where you construct dynamically statements as strings and then execute them). This restriction is lifted as of MySQL 5.0.13 for stored procedures; it still applies to stored functions and triggers.
On peut donc faire du sql dynamique dans une procédure mais pas dans un trigger ni une fonction. Si le trigger appelle une procédure qui utilise du SQL dynamique, c'est comme si le trigger l'utilisait lui-même...

Ceci dit, quand je t'avais donné les lignes PREPARE, EXECUTE, ... je n'avais pas fait attention au reste. Y a-t-il une raison particulière à ce que utilises un SET au lieu d'une relation 1,n avec des clés étrangères ? Un gain de place ? En tout cas, je doute que ça soit pour un gain de performance.
Biglo 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 16h19.


 
 
 
 
Partenaires

Hébergement Web