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 :
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
))
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
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
 
 
END
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
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
A 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.

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.