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 11/07/2011, 03h15   #1
Membre Expert
 
Inscription : avril 2006
Messages : 1 338
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2006
Messages : 1 338
Points : 1 315
Points : 1 315
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 :
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
boo64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2011, 11h27   #2
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 853
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
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 : 853
Points : 1 332
Points : 1 332
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...
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2011, 12h57   #3
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
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)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2011, 12h58   #4
Membre Expert
 
Inscription : avril 2006
Messages : 1 338
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2006
Messages : 1 338
Points : 1 315
Points : 1 315
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
boo64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2011, 13h01   #5
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
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)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2011, 13h07   #6
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 853
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
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 : 853
Points : 1 332
Points : 1 332
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?
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2011, 14h18   #7
Membre Expert
 
Inscription : avril 2006
Messages : 1 338
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2006
Messages : 1 338
Points : 1 315
Points : 1 315
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
boo64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2011, 16h38   #8
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
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)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2011, 16h40   #9
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 853
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
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 : 853
Points : 1 332
Points : 1 332
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
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2011, 17h00   #10
Membre Expert
 
Inscription : avril 2006
Messages : 1 338
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2006
Messages : 1 338
Points : 1 315
Points : 1 315
@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 :
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
boo64 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 23h42.


 
 
 
 
Partenaires

Hébergement Web