Bonjour,

J'ai un soucis avec une transaction distribuée.

En fait je voudrais bien (et cela j'y arrive) lire des instructions sql dans une table les executer sur un serveur lié et ensuite modifié une valeur dans ma table indiquant que cette instruction a été correctement exécutée. Pour cela je crée une transaction par ligne que je traite dans ma table et je les valide ou les rejette.

En ligne de commande ma requète fonctionne très bien, la ou ça coince, c'est que cette requète est normalement faite pour s'exécuter dans un trigger.
Et la ce qui devient embettant c'est que mon trigger lance lui même un transaction.

Je n'arrive pas a imbriquer mes transactions de manière a ce que la transaction du trigger soit TOUJOURS valable et que les transactions a l'intérieur le soit ou pas lui ne s'en occupe pas.

J'ai essayé de l'écrire comme ceci :
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
declare
@numero bigint,
@site int
 
SET @numero = 0
 
WHILE @numero IS NOT NULL
	BEGIN
 
    SELECT @numero = min(xxx01)
    from xxx
    where xxx01 > @numero
    and xxx05 <> 'FN'
 
    if (@numero is not null)
	BEGIN
		BEGIN TRY
			BEGIN DISTRIBUTED TRANSACTION lineupd	
			declare @execution as nvarchar(max)
			select @site = xxx03 from xxx where xxx01 = @numero
			select @execution = REPLACE(xxx08, ' ' + rtrim(xxx02) + ' ', ' [' + rtrim(xxo03) + '].[' + rtrim(xxo04) + '].[DBO].' + rtrim(xxx02) + ' ') from xxx inner join xxo on xxx03 = xxo01 where xxx01 = @numero
			exec sp_executesql @execution
			update xxx set xxx05 = 'FN' where xxx01 = @numero
			COMMIT TRANSACTION 
		END TRY
		BEGIN CATCH
			if @@TRANCOUNT > 1
				COMMIT TRANSACTION lineupd
			IF @@TRANCOUNT = 1
				ROLLBACK TRANSACTION lineupd
		END CATCH
	END
 
END