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 :

Triggers et procédure stockée : ERROR 1336


Sujet :

SQL Procédural MySQL

  1. #1
    Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 30
    Points : 40
    Points
    40
    Par défaut Triggers et procédure stockée : ERROR 1336
    Bonjour,

    j'ai un problème lors de l'utilisation de triggers sur une table.

    J'ai une table t1(id VARCHAR, dpt VARCHAR, nom VARCHAR, adr VARCHAR ) et des tables t1_10, t1_15, t1_20 avec la même structure que t1 mais qui contiennent les données de t1 avec dpt=10, 15, 20 respectivement.
    Lorsque j'insère un nouvel enregistrement dans t1, je voudrais l'insérer aussi dans la table t1_dpt correspondant à l'enregistrement. De même, en cas de modification ou de suppression. J'ai donc créée une procédure stockée qui est appelée par les triggers.

    J'ai donc les triggers et la procédure suivants :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    DELIMITER $$
     
    DROP TRIGGER t1_INS $$
    CREATE TRIGGER ETABUFR_INS AFTER INSERT ON t1 FOR EACH ROW
      CALL  MAJ_t1_dpt(NEW.Dpt, NEW.Id, 'INSERT') $$
     
    DROP TRIGGER t1_DEL $$
    CREATE TRIGGER ETABUFR_DEL BEFORE DELETE ON t1 FOR EACH ROW
      CALL  MAJ_t1_dpt(OLD.Dpt, OLD.Id, 'DELETE') $$
     
    DROP TRIGGER t1_UPD $$
    CREATE TRIGGER ETABUFR_UPD AFTER UPDATE ON t1 FOR EACH ROW
      CALL  MAJ_t1_dpt(NEW.Dpt, NEW.Id, 'UPDATE') $$
     
    DROP PROCEDURE MAJ_t1_dpt $$
    CREATE PROCEDURE MAJ_t1_dept (IN vDept VARCHAR(8), IN id VARCHAR(32), IN typeAction VARCHAR(16))
    BEGIN
      DECLARE NameTable VARCHAR(30) DEFAULT 't1_';
      SET NameTable = CONCAT('t1_', vDept) ;
     
      IF ( typeAction = 'INSERT' ) THEN
    		-- Début De La Requête D'Insertion
    		Set @Stmt := Concat('INSERT INTO ', Nametable ,' Select * From t1 Where Id = \'', id ,'\' ;');
     
    		-- On Prépare Le Stmt Avec @Stmt Qui Contient Notre Requête
    		Prepare Stmt From @Stmt;
    		-- On Exécute Donc La Requête
    		Execute Stmt;
    		-- On Supprime Le Stmt
    		Deallocate Prepare Stmt;
     
    	ELSEIF ( typeAction = 'DELETE' ) THEN
    		-- Début De La Requête De Suppression
    		Set @Stmt := Concat('DELETE FROM ', Nametable ,' Where Id = \'', id ,'\' ;');
     
    		-- On Prépare Le Stmt Avec @Stmt Qui Contient Notre Requête
    		Prepare Stmt From @Stmt;
    		-- On Exécute Donc La Requête
    		Execute Stmt;
    		-- On Supprime Le Stmt
    		Deallocate Prepare Stmt;
     
    	ELSE
    		-- Début De La Requête De Suppression
    		Set @Stmt := Concat('DELETE FROM ', Nametable ,' Where Id = \'', id ,'\' ;');
     
    		-- On Prépare Le Stmt Avec @Stmt Qui Contient Notre Requête
    		Prepare Stmt From @Stmt;
    		-- On Exécute Donc La Requête
    		Execute Stmt;
    		-- On Supprime Le Stmt
    		Deallocate Prepare Stmt;
     
    		-- Début De La Requête D'Insertion
    		Set @Stmt := Concat('INSERT INTO ', Nametable ,' Select * From t1 Where Id = \'', id ,'\' ;');
     
    		-- On Prépare Le Stmt Avec @Stmt Qui Contient Notre Requête
    		Prepare Stmt From @Stmt;
    		-- On Exécute Donc La Requête
    		Execute Stmt;
    		-- On Supprime Le Stmt
    		Deallocate Prepare Stmt;
    	END IF;
     
    END $$
     
    DELIMITER ;
    Quand je crée les triggers et la procédure stockée, j'ai seulement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query OK, 0 rows affected (0.00 sec)
    Mais quand je veux insérer 1 enregistrement dans t1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO t1 VALUES ('975-01','10','test 975', 'adr 975') ;
    j'obtiens l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ERROR 1336 (0A000): Dynamic SQL is not allowed in stored function or trigger
    .

    Ma version de MySql est 5.0.45-community-nt.
    J'ai créé d'autres procédures pour générer les tables t1_dpt et là, il n'y a pas de problème.

    Si vous avez des idées, d'avance merci.

    spg40.

  2. #2
    Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 30
    Points : 40
    Points
    40
    Par défaut Ma solution...
    Bonjour,

    après de nombreuses tentatives infructueuses, j'ai trouvé une solution. Ce n'est peut-être pas la meilleure mais elle fonctionne.

    Le problème était généré par la procédure appelée : en effet, elle contenait du SQL dynamique qui n'est pas supporté par les triggers. A l'exécution, le trigger allait bien dans la procédure, mais dès le "DECLARE" il plantait.

    J'ai donc résolu mon problème en faisant des triggers avec des CASE de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    DELIMITER $$
     
    DROP TRIGGER t1_INS $$
    CREATE TRIGGER t1_INS AFTER INSERT ON t1 FOR EACH ROW
    BEGIN
    	CASE
    		WHEN NEW.Dpt = '10' THEN INSERT INTO t1_10 SELECT * FROM t1 WHERE Id = NEW.Id ;
                    ...
    		WHEN NEW.Dpt = '30' THEN INSERT INTO t1_30 SELECT * FROM t1 WHERE Id = NEW.Id ;
    	END CASE ;
    END $$
     
    DELIMITER ;
    On fait de la même manière pour les 3 triggers.

    Il faut donc que le nom de la table impacté soit "en dur" (on ne peut pas le modifier dynamiquement).

    A+.

    spg40.

  3. #3
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    Bonjour,

    Ce que je trouve très moche c'est t1 t1_10 t1_15 t1_20 avec la même structure.
    Çà me parait mal modélisé, et même si on peut se permettre de dévier un peu du modèle parfait, a un moment ça deviens gênant (ici faut que tu répète pas mal de code).

    Je ne sais pas ou en est ton projet, mais si c'est possible sans tout chambouler je te conseil vraiment de revoir la conception.
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

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

Discussions similaires

  1. Trigger et procédure stockée
    Par emespere dans le forum PL/SQL
    Réponses: 2
    Dernier message: 19/06/2007, 19h15
  2. trigger ou procédure stockée?
    Par iulius dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 29/03/2007, 15h19
  3. [SQL2005][débutant]Trigger ou procédure stockée
    Par DebutantDotNet dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 03/10/2006, 11h15
  4. création triggers et procédure stockées
    Par jhons dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 12/07/2006, 17h54
  5. Triggers et Procédures stockées
    Par agecanonix dans le forum Débuter
    Réponses: 3
    Dernier message: 21/01/2005, 10h16

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