Je rencontre quelques difficultés à mettre au point les triggers sur mes tables.

Je rentre dans le vif du sujet avec la déclaration d'une table (qui servira d'exemple)

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
USE [INNO]
GO
/****** Object:  Table [EVOLUTION].[TL_APPRECIATION_APRL]    Script Date: 11/14/2011 10:56:36 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [EVOLUTION].[TL_APPRECIATION_APRL](
	[APRL_APPRECIATION] [int] NOT NULL,
	[APRL_LANGUE] [smallint] NOT NULL,
	[APRL_VERSION] [int] NOT NULL CONSTRAINT [DF_TL_APPRECIATION_APRL_APRL_VERSION]  DEFAULT ((0)),
	[APRL_LIB] [varchar](255) COLLATE Latin1_General_CI_AS NOT NULL,
	[APRL_UPDATE] [datetime] NULL,
	[APRL_USERNAME] [varchar](50) COLLATE Latin1_General_CI_AS NOT NULL,
	[APRL_DEL] [bit] NOT NULL CONSTRAINT [DF_TL_APPRECIATION_APRL_APRL_DEL]  DEFAULT ((0)),
 CONSTRAINT [PK_TL_APPRECIATION_APRL] PRIMARY KEY CLUSTERED 
(
	[APRL_APPRECIATION] ASC,
	[APRL_LANGUE] ASC,
	[APRL_VERSION] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
 
GO
SET ANSI_PADDING OFF
GO
USE [INNO]
GO
ALTER TABLE [EVOLUTION].[TL_APPRECIATION_APRL]  WITH CHECK ADD  CONSTRAINT [FK_TL_APPRECIATION_APRL_langue] FOREIGN KEY([APRL_LANGUE])
REFERENCES [dbo].[langue] ([langue])
GO
ALTER TABLE [EVOLUTION].[TL_APPRECIATION_APRL]  WITH CHECK ADD  CONSTRAINT [FK_TL_APPRECIATION_APRL_T_APPRECIATION_APR] FOREIGN KEY([APRL_APPRECIATION])
REFERENCES [EVOLUTION].[T_APPRECIATION_APR] ([APR_ID])
GO
ALTER TABLE [EVOLUTION].[TL_APPRECIATION_APRL]  WITH CHECK ADD  CONSTRAINT [FK_TL_APPRECIATION_APRL_Users] FOREIGN KEY([APRL_USERNAME])
REFERENCES [UserManagement].[Users] ([username])
Voilà donc la table sur laquelle je veux faire mes triggers.

Et voici les triggers que j'ai créé :

Celui-ci sert à mettre la date et l'heure dans la colonne APRL_UPDATE et calcul aussi le bon numéro de version pour le record.
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
USE [INNO]
GO
/****** Object:  Trigger [TRG_TIMESTAMP_APRL]    Script Date: 11/14/2011 11:02:23 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
 
 
 
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE TRIGGER [TRG_TIMESTAMP_APRL]
   ON  [EVOLUTION].[TL_APPRECIATION_APRL]
   AFTER INSERT
AS 
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
 
    -- Insert statements for trigger here
	DECLARE @DATETIME AS DATETIME;
	DECLARE @APR AS INT;
	DECLARE @LNG AS INT;
	DECLARE @VERSION AS INT;
 
	SET @DATETIME = GETDATE();
	SET @APR = (SELECT APRL_APPRECIATION FROM INSERTED);
	SET @LNG = (SELECT APRL_LANGUE FROM INSERTED);
	SET @VERSION = (SELECT ISNULL(MAX(APRL_VERSION),0) FROM EVOLUTION.TL_APPRECIATION_APRL WHERE APRL_APPRECIATION = @APR AND APRL_LANGUE = @LNG)+1;
 
	UPDATE EVOLUTION.TL_APPRECIATION_APRL SET APRL_UPDATE = @DATETIME, APRL_VERSION = @VERSION WHERE APRL_APPRECIATION = @APR AND APRL_LANGUE = @LNG;
END

Ce trigger vérifie si on modifie le champ APRL_LIB. Si oui, on remplace l'update par un insert car c'est une nouvelle version (le champ APRL_LIB ne peut jamais être modifié). Si non, on fait l'update normalement.
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
USE [INNO]
GO
/****** Object:  Trigger [TRG_UPDATE_APRL]    Script Date: 11/14/2011 11:03:04 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE TRIGGER [TRG_UPDATE_APRL]
   ON  [EVOLUTION].[TL_APPRECIATION_APRL]
   INSTEAD OF UPDATE
AS 
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
 
    -- Insert statements for trigger here
	DECLARE @USERNAME	AS VARCHAR(50);
	DECLARE @DEL		AS BIT;
	DECLARE @APR		AS INT;
	DECLARE	@LANGUE		AS INT;
	DECLARE @VERSION	AS INT;
	DECLARE @LIB		AS VARCHAR(255);
 
	SET @USERNAME	= (SELECT APRL_USERNAME FROM INSERTED);
	SET @DEL		= (SELECT APRL_DEL FROM INSERTED);
	SET @APR		= (SELECT APRL_APPRECIATION FROM INSERTED);
	SET @LANGUE		= (SELECT APRL_LANGUE FROM INSERTED);
	SET @VERSION	= (SELECT APRL_VERSION FROM INSERTED);
	SET @LIB		= (SELECT APRL_LIB FROM INSERTED);
 
	IF NOT UPDATE(APRL_LIB)
	BEGIN
		UPDATE	EVOLUTION.TL_APPRECIATION_APRL 
			SET APRL_USERNAME = @USERNAME, APRL_DEL = @DEL
		WHERE	APRL_APPRECIATION = @APR
			AND	APRL_LANGUE = @LANGUE
			AND APRL_VERSION = @VERSION;
	END
	ELSE
	BEGIN
		SET @VERSION = @VERSION + 1;
		INSERT INTO EVOLUTION.TL_APPRECIATION_APRL (APRL_APPRECIATION, APRL_LANGUE, APRL_VERSION, APRL_LIB, APRL_USERNAME, APRL_DEL)
		VALUES(@APR, @LANGUE, @VERSION, @LIB, @USERNAME, @DEL);
	END
END
Tout se passe très bien à l'insertion mais à l'update, j'obtiens un message d'erreur qui me dit qu'il ne peut pas faire l'insertion pour cause de duplicate key.

Même si je comprends bien de quelle erreur il s'agit, je ne vois pas où se trouve ma faute.

Quelqu'un pourrait-il y jeter un regard plus avisé que le mien ?

Merci d'avance.

Griftou.