Bonjour,
J'ai une procédure stockée qui modifie des données dans une table. Quand ces données sont modifiées, un trigger se déclenche et appelle plusieurs procédures stockées selon les modifications faites et à faire.
Ma table :Ma proc stock :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 CREATE TABLE [dbo].[LANGUE_CATEGORIE]( [categorie_id] [int] NOT NULL, [la_id] [int] NOT NULL, [local_libelle] [varchar](50) NOT NULL, [local_ordinal] [int] NOT NULL, [arborescence_etendue] [varchar](8000) NULL, [chemin_de_fer] [varchar](1000) NULL, [filtre_taille] [bit] NULL, CONSTRAINT [PK_LANGUE_CATEGORIE] PRIMARY KEY CLUSTERED ( [categorie_id] ASC, [la_id] ASC ))Mon trigger :
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
69
70
71
72
73
74 ALTER PROCEDURE [dbo].[ps_extra_categorie_ordonne] @vpId int, @laId int, @listeCategorie varchar(2000) AS BEGIN SET NOCOUNT ON; declare @sousChaine varchar(2000) declare @marqueur varchar(5) declare @chaine varchar(2000) set @chaine = @listeCategorie --'1|2|3|4' set @sousChaine = '' declare @start int,@newstart int,@compteur int,@categorieId int,@max int set @max = 0 set @start = 0 set @newstart = 1 set @marqueur = '|' set @compteur = 1 BEGIN TRANSACTION BEGIN TRY while @newstart > 0 AND @max < 1000 begin set @max = @max + 1 set @newstart = CHARINDEX('|',@chaine,@start) if @newstart = 0 set @souschaine = @chaine else set @sousChaine = SUBSTRING(@chaine,@start,@newstart-@start) set @chaine = SUBSTRING(@chaine,@newstart+1,len(@chaine) - @newstart) if Isnumeric(@sousChaine)=1 begin set @categorieId = CAST(@souschaine as int) /* INTER update CATEGORIE set categorie_ordinal = @compteur,CATEGORIE_DATE_MODIFICATION = getdate() where categorie_id=@categorieId and vp_id=@vpId */ if @laId = 0 update LANGUE_CATEGORIE set LOCAL_ORDINAL = @compteur where categorie_id=@categorieId /*and la_id=@laId*/ else update LANGUE_CATEGORIE set LOCAL_ORDINAL = @compteur where categorie_id=@categorieId and la_id=@laId update CATEGORIE set CATEGORIE_DATE_MODIFICATION = getdate() where categorie_id=@categorieId and vp_id=@vpId set @compteur = @compteur + 1 end end COMMIT TRANSACTION select 1,'VP ordonnancée avec succès' RETURN END TRY BEGIN CATCH ROLLBACK TRANSACTION SELECT 0,'Une erreur est survenue pendant l''ordonnancement :<br/>' + ERROR_MESSAGE() RETURN END CATCH ENDA quoi ça sert? La proc stock modifie le champ 'local_ordinal' de la catégorie, soit l'ordre d'affichage de la catégorie, pour chaque catégorie. Le trigger se déclenche alors pour modifier le chemin de fer et l'arborescence de chaque catégorie, pour des raisons que j'ignore ces 2 champs contiennent le code html qui sera affiché ensuite. Le champ La_id contient l'id de la langue de la catégorie. L'ordre des catégories peut différer selon la langue.
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 ALTER TRIGGER [dbo].[tr_langue_categorie_arborescence] ON [dbo].[LANGUE_CATEGORIE] AFTER INSERT,DELETE,UPDATE AS BEGIN SET NOCOUNT ON; declare @catId int, @vpId int, @laId int SELECT @catId = categorie_id, @laId = la_id from inserted insert into asophtest SELECT categorie_id, la_id from inserted --mon test pour comprendre les lignes impactées if @catID is not null and @laID is not null begin SELECT @vpId = vp_id from categorie where categorie_id = @catId if @vpId is not null exec ps_extra_vp_set_all_categorie_arbo @vpId,@laId end else begin SELECT @catId = categorie_id,@laId = la_id from deleted if @catID is not null and @laID is not null begin SELECT @vpId = vp_id from categorie where categorie_id = @catId if @vpId is not null begin if exists(select 1 from ass_langue_vp where vp_id=@vpID and la_id=0) exec ps_extra_vp_set_all_categorie_arbo @vpId,0 if exists(select 1 from ass_langue_vp where vp_id=@vpID and la_id=1) exec ps_extra_vp_set_all_categorie_arbo @vpId,1 if exists(select 1 from ass_langue_vp where vp_id=@vpID and la_id=2) exec ps_extra_vp_set_all_categorie_arbo @vpId,2 if exists(select 1 from ass_langue_vp where vp_id=@vpID and la_id=3) exec ps_extra_vp_set_all_categorie_arbo @vpId,3 if exists(select 1 from ass_langue_vp where vp_id=@vpID and la_id=4) exec ps_extra_vp_set_all_categorie_arbo @vpId,4 end end end END
Le souci est le suivant : quand la_id =0, soit en français, on modifie l'ordre des catégories, c'est enregistré pour toutes les langues. Le trigger se déclenche, modifie bien l'arborescence des catégories avec la_id=0, mais pas avec les autres langues. C'est-à-dire que le trigger se déclenche pour (catégorie1/la_id=0), (categorie2/la_id=0), etc, mais pas pour (catégorie1/la_id=1), (categorie2/la_id=1)...
Je ne comprends pas pourquoi et je ne sais pas quoi faire pour arranger ça.
N'hésitez pas à me demander des précisions.
Merci d'avance pour votre aide.
P.S.: Je tiens à préciser qu'étant la dernière arrivée, il est hors de question de mener une révolution sur la BDD. Oui il y a des défauts, mais j'ai les mains liées.
Partager