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
Partager