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] Erreur 1442


Sujet :

SQL Procédural MySQL

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Points : 1 460
    Points
    1 460
    Par défaut [Triggers] Erreur 1442
    Salut à tous!

    Dimanche 3h du mat, et chui là à me prendre la tête sur les triggers, va vraiment falloir que j'me trouve une fille, enfin bref...

    Donc voila mon problème :
    - J'ai 2 tables utilisateurs (une pour mon forum, l'autre pour le reste du système) que je voudrais synchroniser pour que certaines infos (id, nom, mail, pass) soient toujours identiques dans les 2 tables.

    Par là, j'entends que si une modif est faite sur la table utilisateurs A, elle est reportée sur la table utilisateurs B, et vice-versa.

    Pour ça, j'ai créé deux triggers "before update" sur les 2 tables, mais je me prends une erreur 1442 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    1442 - Can't update table 'mybb_users' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
    Je pense que c'est parce que ça fait un genre de boucle :
    J'update la table A, le trigger de A update la table B dont le trigger update la table A.........

    Pour résumer, donc, je veux que le trigger de B ne se déclenche pas si l'update de B vient du trigger de A .

    Savez vous s'il y a une astuce ou à défaut, un moyen conceptuel de contourner le problème?

    Merci!
    Stay in Bed .. Save Energy

  2. #2
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    salut,

    y a pas une phase de trop dans ta "boucle"?

    si tu mets à jour (update, delete, insert, c'est des triggers différents pour chaque action) A et que les triggers mettent à jour B pourquoi tu refais des triggers pour mettre à jour A...

    en gros, si A et B ont des trucs en commun, A est, par exemple, ta référence pour mettre à jour B ou inversement...
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  3. #3
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Demandez-vous pourquoi vous avez besoin de dupliquer vos données utilisateurs!
    Est-ce qu'une jointure entre les 2 tables ne suffiraient pas à vous retourner l'intégralité de vos données, à moindre frais ?
    Revoyez peut-être votre modèle de données.

    bon courage
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Points : 1 460
    Points
    1 460
    Par défaut
    Salut,
    Ben non, c'est que la modif peut venir de A ou de B...

    Table Forum => Si l'utilisateur met à jour son login, la modif doit être reportée dans la table "système".

    Table système => Si quelqu'un met à jour le login, la modif doit être reportée dans la table forum...

    Mais ça me fait penser : Si on fait un update sur des valeurs et qu'aucune n'est différente ca déclenche quand même le trigger? Parce qu'en console ca dirait "0 rows updated" ...

    Bon ce que je vais faire, c'est comparer les valeurs avant d'effectuer l'update. Comme ça si les valeurs sont identiques, les triggers ne font rien et plus de problème...

    Un peu bourrin, je laisse le thread ouvert voir si quelqu'un n'a pas une solution au final, plus intelligente pour synchroniser ces 2 tables...
    Stay in Bed .. Save Energy

  5. #5
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Cela veut dire qu'un utilisateur peut avoir 2 logins differents ? (1 pour le forum et 1 pour le system)
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  6. #6
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    un trigger se déclenche sur un événement donc oui...

    perso je suis comme yanika... je me demande pourquoi dupliquer ces données avec toutes les lourdeurs et tous les risques de loupé que ça peut engendrer...

    ça ne serait pas plus simple d'unifier tout ça en n'utilisant que l'identification du forum pour le forum et le site?
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Points : 1 460
    Points
    1 460
    Par défaut
    Ben sans synchro oui , un utilisateur pourrait avoir 2 logins, et c'est bien pour ça qu'il me faut des triggers pour reporter les modifs...

    Une table serait évidement plus simple mais ça n'est pas possible :
    J'utilise les modules mysql d'authentification pour plusieurs services : sites web, proftpd etc. (concrètement pour apache, il s'agit de paramétrer l’authentification dans la définition du serveur virtuel)

    L'idée c'est donc bien d'avoir une table utilisateurs pour tout un panel d'applis.

    Seulement, les modules auth-mysql sont limités en fonctionnalités, et si on peut préciser le type de cryptage du password parmi 3 ou 4 possibilités, le md5(md5($passaword).$clé) utilisé par myBB (mon forum) pour stocker les mdp n'est pas gérable hors d'un environnement web...

    Et il y a d'autres problèmes du même genre... Donc ne voulant pas aller modifier le php de myBB, j'ai dû me résoudre à faire 2 tables utilisateurs synchronisées, pensant que ça serait au final moins la galère à mettre en place que les modifs à faire sur MyBB et les autres services nécessaires au merge des 2 tables...
    Stay in Bed .. Save Energy

  8. #8
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Je ne connais pas la structure de votre applicatif, mais je ne comprends pas tres bien ou est l'impossibilité de n'utiliser qu'une 1 table utilisateurs dans votre cas (a moins que chaque appli possede sa base propre). De plus, une table par appli, ca veut dire modification de votre architecture a chaque nouvelle appli, de nouveaux triggers, de nouvelles insertions d'indexes, ...
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  9. #9
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    l'idée peut etre d'utiliser l'un ou l'autre des système (peu importe)... je te proposais de généraliser l'identification en te basant sur celle du forum pour justement pas la changer. tu as une table de liaison qui relie tes différents système d'identification et qui te permet d'appelé les fonction d'identification de chaque application en leur appliquant de manière transparente leur identifiant et mot de passe.

    c'est, en résumé, le principe de l'openID..

    sinon ne passe pas par des triggers mais par des procédures stockées... car je sais pas si tu risques pas de faire des déclenchement de triggers circulaires entre le 2 tables et donc ça peut nuire aux performances. En plus tua s plein de limitations sur les triggers mysql, presque pas sur les procédures.

    enfin à toi de voir... y a pas une seule façon de faire les choses
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Points : 1 460
    Points
    1 460
    Par défaut
    @Yanika_bzh : c'est que justement, ca n'est pas vraiment de l'applicatif... Il s'agit de gérer l'authentifiation à plusieurs services présents sur un serveur via une table mysql... Si c'était que des sites web, en PHP, ca ne poserait pas de pb ...

    Sinon je regardait un peu OpenID, c'est l'artillerie lourde, ca m'étonnerai que ca existe en module d'authentification apache ou proftpd.

    Enfin du coup j'ai réussit a me débrouiller avec les triggers. Il "suffit" de vérifier que les anciennes valeurs des champs à updater sont biens differentes des nouvelles, avant de faire la requete update.

    Après Test ca marche bien, mais faut avouer que ca complique le trigger. Un exemple sur une de mes tables :
    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
     
    DROP TRIGGER IF EXISTS `trig_updateuser`//
    CREATE TRIGGER `trig_updateuser` BEFORE UPDATE ON `utilisateurs`
     FOR EACH ROW BEGIN
     
    #Avant de faire l'update, il faut controler que les nouvelles valeurs sont differentes des anciennes, sinon ca va faire
    #Une boucle d'update avec l'autre trigger de la table forum... 
    SET @old_uid = 0;
    SET @old_username = '';
    SET @old_email = '';
    SET @old_password = '';
    SET @old_usergroupe = 0;
    SET @new_usergroupe = 0;
     
    SELECT forum.uid,forum.username, forum.email, forum.password, forum.usergroup FROM `forum`.mybb_users forum WHERE forum.uid=old.usr_id LIMIT 1 INTO @old_uid, @old_username, @old_email, @old_password, @old_usergroupe;
     
    #Si on a un enregistrement de retourné, on gère les groupes
    IF @old_uid > 0 THEN
     
    	#Si l'utilisateur n'avait pas les droits sur le forum (grp 5) et qu'il les a après modif, il faudra le placer dans le grp 2 (enregistrés).
    	#Si il n'a plus les droits, mais qu'il n'est pas dans le grp 5 (en attente activation), on le met dans le 5!
    	#Sinon, on le laisse dans le groupe ou il est actuellement (si c'est un admin, ou que les droits n'ont pas été modifiés...)
    	IF new.app_forum=1 AND new.usr_actif=1 AND @old_usergroupe=5 THEN
    		SET @new_usergroupe=2;
    	ELSEIF (new.app_forum=0 OR new.usr_actif=0) AND @old_usergroupe<>5 THEN
    		SET @new_usergroupe=5;
    	ELSE
    		SET @new_usergroupe=@old_usergroupe;
    	END IF;
     
    	#Si des valeurs sont à modifier, on lance l'update, sinon on fait rien.
    	IF @old_uid <> new.usr_id OR @old_username <> new.usr_pseudo OR @old_email <> new.usr_email OR @old_usergroupe <> @new_usergroupe OR @old_password <> MD5(CONCAT(MD5('kMxnPfk6'),new.usr_passwd)) THEN
    		UPDATE `forum`.mybb_users forum SET 
    		forum.uid = new.usr_id,
    		forum.username = new.usr_pseudo,
    		forum.email = new.usr_email,
    		forum.password = MD5(CONCAT(MD5('kMxnPfk6'),new.usr_passwd)),
    		forum.usergroup = @new_usergroupe
    		WHERE uid=old.usr_id;
    	END IF;
    END IF;
    END
    //
    Voila c'est vraiment de la gestion "Maison"... Jvais sécuriser ca avec une ou deux requete de controle de cohérence... Merci d'avoir regardé!
    Stay in Bed .. Save Energy

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

Discussions similaires

  1. [TRIGGER] erreur 1442 : le trigger se déclenche mais n'agit pas.
    Par elvan49 dans le forum SQL Procédural
    Réponses: 11
    Dernier message: 14/12/2007, 11h47
  2. [Trigger] Erreur 1136 lors d'une insertion
    Par tyrant dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 24/05/2006, 21h41
  3. TRIGGER Erreur PLS-00357
    Par fuhraih dans le forum Oracle
    Réponses: 6
    Dernier message: 19/04/2006, 10h20
  4. [10g] Trigger erreur de compilation
    Par flasomm dans le forum Oracle
    Réponses: 2
    Dernier message: 03/01/2006, 03h07
  5. [Debug] [Trigger] erreur d'exe pas très précise
    Par viena dans le forum Langage SQL
    Réponses: 4
    Dernier message: 19/08/2005, 11h36

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