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

SQL Procédural MySQL Discussion :

Question de trigger


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 5
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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!

  2. #2
    Membre émérite
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Par défaut
    Tu peux récupérer la liste des triggers d'une base avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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é.

  3. #3
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Par défaut
    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) :

    #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

  4. #4
    Membre émérite
    Avatar de gerald2545
    Profil pro
    Inscrit en
    Février 2003
    Messages
    744
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 744
    Par défaut
    tu nous donnes le contenu de ta fonciton AddService STP

  5. #5
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

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

    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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  6. #6
    Membre émérite
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Par défaut
    Désolé pour toi, mais c'est une limitation de MySQL.

    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Question / Aide Trigger
    Par Rycles dans le forum Développement
    Réponses: 2
    Dernier message: 18/02/2009, 16h48
  2. Question sur TRIGGER (Voire Procédure)
    Par LinuxUser dans le forum PL/SQL
    Réponses: 13
    Dernier message: 09/01/2008, 14h11
  3. questions, curseur trigger and co
    Par trogloman dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 24/09/2007, 14h49
  4. Question urgente sur les triggers
    Par devdev dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/11/2004, 10h38
  5. question general sur triggers (liaison avec VB)
    Par DaxTaz dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/07/2004, 15h57

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