questions, curseur trigger and co
Bonjour a tous
Merci d'avance pour vos réponses, si c'est mon premier post ici, j'ai déjà passé des heures de lecture sur ce forum et solutionné bien des problèmes.:king:
Je développe actuellement une web-app pour laquelle je me sert pas mal des procédures stockée et trigger vue que ma base est "méta-modelisée" et que je souhaite ensuite pouvoirs interfacer facilement avec différentes applications.
note : mysql version 5.0.1
J'aimerais bien avoir l'avis de "ceux qui savent" pour valider ce que j'ai cru lire dans différentes discutions/articles:
1-Les curseurs
Apparemment, à maudire , pourtant bien pratique, j'ai un trigger qui me rajoute tous les droits à tous les admins sur tout nouvel acteur créé il récupère les droits, les admins, créé un droit, puis une relation acteur/droit/objet.
Mon premier jet est avec 2 curseur:
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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| for each row BEGIN
/* But : inserer les droits pour admin sur le nouvel acteur
admin peut Droit/Suppression/Ecriture/Lecture
*/
/* Variable recevant les IdType du curseur */
declare r_IdTypeDroit bigint(20);
/* qui recoit le droit */
declare r_qui bigint(20);
/* qui key droit cree */
declare r_droit bigint(20);
/* Id type acteur pour insertion dans la relation acteur droit/objet */
declare Id_TypeActeur bigint default 0;
/* Handler de fin de curseur */
declare fin int default 0;
/* 1- quels droits ajouter */
declare c_droit cursor for
select IdType
from table_des_types
where upper(Type_application)='DROIT';
/* 2-A qui les ajouter*/
declare c_qui cursor for
select a.IdActeur
from acteur a
, table_des_types t
where upper(t.Type_Libelle)='ADMINISTRATEUR'
and t.IdType=a.FK_IdType;
/* handler de fin d'appel */
declare continue handler for SQLSTATE '02000' set fin=1;
/* Initialisation Id_TypeActeur */
select `IdType`
into Id_TypeActeur
from `table_des_types`
where upper(`Type_Libelle`)='ACTEUR';
if Id_TypeActeur<>0 then /* Pas de type ACTEUR, rien a faire */
open c_droit;
fetch c_droit into r_IdTypeDroit;
/* On parcours les droits a ajouter */
while not fin do
open c_qui;
fetch c_qui into r_qui;
while not fin do
insert droit (`FK_IdType_Droit`,`FK_IdActeur_Createur`,`Droit_Date_Effectif`,`Droit_Date_Expiration`)
values (r_IdTypeDroit, r_qui, now(), null);
SET r_droit=LAST_INSERT_ID();
insert rel_acteur_droit_objet(`FK_IdActeur`,`FK_IdDroit`,`Id_Objet`,`FK_IdType`)
values (NEW.`IdActeur`, r_droit, r_qui, Id_TypeActeur);
fetch c_qui into r_qui;
end while;
close c_qui;
set fin=0;
fetch c_droit into r_IdTypeDroit;
end while;
close c_droit;
end if;
END; |
Le code n'est pas au taquet, mais c'est juste des tests pour le moment.
Est il vraiment préférable d'utiliser un seul curseur que je pourrait faire a partir d'un select genre:
Code:
1 2 3 4 5 6 7
| SELECT a.`IdActeur` , ta.`IdType`,td.`IdType` /*idActeur, Id type d'acteur, Id type de droit*/
FROM `acteur` a
, `table_des_types` ta /* type de l'acteur pour selection admin*/
, `table_des_types` td /* type des droits */
WHERE a.`FK_IdType`=ta.`IdType`
AND upper(ta.`Type_Libelle`)='ADMINISTRATEUR'
AND upper(td.`type_application`)='DROIT'; |
2-Les triggers
La encore ça ne semble pas préconisé, pourquoi ? pour la non gestion d'erreur de traitement ? faut il préférer a chaque fois que possible d'intégrer les actions a effectuer dans les procédures 'qui les déclenches' ?
Si l'utilisation des triggers est jouable, étant donné qu'on ne peut mettre qu'un trigger par action, je pensait diviser les différentes opérations indépendantes en différentes procédure/fonction à appeler dans le trigger. c'est une logique plutôt objet, est ce que ça tient la route avec mysql ?
C'est donc mes deux grandes interrogations existentielles du moment, merci d'avance pour vos avis éclairés...
M'enfin répondez pas trop vite, ou vous aurez plein d'autres questions :D