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.
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:
Le code n'est pas au taquet, mais c'est juste des tests pour le moment.
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 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;
Est il vraiment préférable d'utiliser un seul curseur que je pourrait faire a partir d'un select genre:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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![]()
Partager