Bonjour,

J'ai un pb avec un tout petit 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
 
create table A (
   C1             int                  not null,
   C2             int                  not null,
   C3             varchar(20)          null,
   constraint PK_A primary key  (C1, C2)
)
GO
 
CREATE TRIGGER TR_a
ON A
FOR INSERT, UPDATE, DELETE
AS
	PRINT '@@TRANCOUNT = ' + CONVERT(VARCHAR, @@TRANCOUNT)
	if exists(select * from deleted)
	BEGIN
		raiserror('no delete',16,1)
		ROLLBACK TRAN
	END
 
	PRINT '@@TRANCOUNT = ' + CONVERT(VARCHAR, @@TRANCOUNT)
	print 'TABLE A'
	SELECT * from A
 
	print 'inserted'
	select * from Inserted
 
	print 'deleted'
	select * from Deleted
GO
 
 
INSERT INTO A
VALUES(1,4,'123')
 
PRINT '@@TRANCOUNT = ' + CONVERT(VARCHAR, @@TRANCOUNT)
 
BEGIN TRAN TRA	-- début de transaction
 
PRINT '@@TRANCOUNT = ' + CONVERT(VARCHAR, @@TRANCOUNT)
DELETE FROM A
PRINT '@@TRANCOUNT = ' + CONVERT(VARCHAR, @@TRANCOUNT)
 
COMMIT TRAN TRA	-- problème
Mon trigger veut empêcher les delete sur ma table.
Le pb est que le ROLLBACK pose un problème pour ma transaction TRA qui essaie d'effacer ma table.

L'instruction de COMMIT TRAN TRA provoque une erreur, car la transaction est déjà rollbackée par le trigger.


Comment est ce que je peux faire:
- soit executer le trigger AVANT l'instruction?
- soit faire un ROLLBACK dans le trigger mais sans impacter sur la transaction TRA?