Bonjour à toutes et tous,

Tout d'abord je tiens à préciser que ce que je fais n'est certainement pas le plus propre dans l'esprit...D'autant plus que mes compétences en SQL Server sont pour le moins "intermédiaires"...

Néanmoins mon analyse et le fait que je n'ai pas la main sur tout dans la base de données qui est principalement utilisée pour le fonctionnement d'un logiciel (Sage Gestion Commerciale) m'amène a vouloir effectuer un DELETE lorsqu'une erreur est rencontrée et donc dans le Catch.

Plus exactement, afin que l'utilisateur de Gestion Commerciale ait un message à l'écran, je me dois de lancer un RAISERROR. En gros je détecte que l'utilisateur a oublié telle ou telle saisie, donc je lance un RAISERROR pour l'avertir qu'il manque une info. Mais si je ne lance pas à la suite un DELETE de la ligne en cours, lorsque l'utilisateur fera sa correction dans sa facture, la ligne sera présente en double (c'est tellement bien développé...)

Si je met ce fameux DELETE avant le RAISERROR, rien ne se passe : je comprends donc qu'un RAISERROR annule de fait les instructions du Trigger et passe dans le Catch (ce qui en soit me semble parfaitement logique), sauf que si je lance le DELETE dans le Catch, j'obtient le message "La transaction actuelle ne peut pas être validée et ne prend pas en charge les opérations qui écrivent dans le fichier journal. Restaurez la transaction."

Il semble donc que toute action journalisée ne soit pas exploitable dans un bloc Catch : je me retrouve donc dans l'impasse...

Je vous copie le script de mon trigger, bien qu'il soit sans doute abstrait sans avoir tous les tenants et aboutissants :

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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
 
/****** Object:  Trigger [dbo].[APX_TG_UPD_F_DOCLIGNE_IL]    Script Date: 04/15/2013 15:55:25 ******/
SET ANSI_NULLS ON
GO
 
SET QUOTED_IDENTIFIER ON
GO
 
CREATE TRIGGER [dbo].[APX_TG_UPD_F_DOCLIGNE_IL] ON [dbo].[F_DOCLIGNE] FOR UPDATE AS 
BEGIN
 
		SET NOCOUNT ON;
 
BEGIN TRY
 
IF EXISTS(SELECT 'a' FROM INSERTED WHERE AR_Ref IN ('A_MCO','A_PRD','A_PMD'))
BEGIN		
	DECLARE @dopiece varchar(9);
	DECLARE @ligne int;
	DECLARE @ligneEnCours int;
 
	SET @dopiece = (SELECT DO_Piece FROM inserted);
 
	IF EXISTS(SELECT TOP 1 DL_Ligne FROM APX_TG WHERE DO_Piece = @dopiece)
	SELECT DL_Ligne INTO #tmp FROM APX_TG WHERE DO_Piece = @dopiece;
 
 
 
 
	SET @ligneEnCours = (SELECT DL_Ligne FROM INSERTED)
 
IF UPDATE(Profil_Type)
OR UPDATE(Nb_Jours)
OR UPDATE(Prix_de_vente_journalier)
BEGIN
	IF ((SELECT ISNULL(Profil_Type,'NULL') FROM inserted) = 'NULL')
	OR ((SELECT Nb_Jours FROM inserted) = 0)
	OR ((SELECT Prix_de_vente_journalier FROM inserted) = 0)
	BEGIN
 
 
 
 
 
		RAISERROR(82045,11,1);
 
 
	END
	ELSE
	BEGIN
		IF EXISTS(SELECT TOP 1 DL_Ligne FROM APX_TG WHERE DO_Piece = @dopiece)
		BEGIN
 
		DELETE FROM F_DOCLIGNE WHERE DO_Piece = @dopiece AND DL_Ligne IN (SELECT DL_Ligne FROM #tmp) AND DL_Ligne <> @ligneEnCours;
		DELETE FROM APX_TG WHERE DO_Piece = @dopiece;
		END
	END
	END
 
END;
 
END TRY
BEGIN CATCH
		DELETE FROM F_DOCLIGNE WHERE DO_Piece = @dopiece AND DL_Ligne IN (SELECT DL_Ligne FROM APX_TG WHERE DO_Piece = (SELECT DO_Piece FROM inserted));
 
		DELETE FROM APX_TG WHERE DO_Piece = (SELECT DO_Piece FROM inserted) ;
 
 
    DECLARE @ErrorMessage NVARCHAR(4000);
    DECLARE @ErrorSeverity INT;
    DECLARE @ErrorState INT;
 
    SELECT @ErrorMessage = ERROR_MESSAGE(),
           @ErrorSeverity = ERROR_SEVERITY(),
           @ErrorState = ERROR_STATE();
 
    -- Use RAISERROR inside the CATCH block to return 
    -- error information about the original error that 
    -- caused execution to jump to the CATCH block.
    RAISERROR (@ErrorMessage, -- Message text.
               @ErrorSeverity, -- Severity.
               @ErrorState -- State.
               );
END CATCH;
 
 
END;
 
 
 
 
GO
Finalement le souci réside principalement dans le fait que je suis obligé de trouver un moyen d'annuler ce que fait le logiciel sans avoir accès à un ROLLBACK...

Fais-je totalement fausse route ? Avez vous des suggestions ?

Merci beaucoup pour vos réponses !!