[SQL2005]trigger itératif --> trigger ensembliste
Bonjour,
Suite à la discussion sur l'identification relative du forum administration, je me décide à faire quelques tests histoire de pouvoir juger par moi-même.
Seulement, je bloque déjà au niveau du trigger chargé d'incrémenter cette colonne d'identification relative.
J'ai réussi en m'appuyant sur l'un ou l'autre article un créer un trigger qui fonctionne mais qui est itératif. Et je n'aime pas ça.
J'avais réussi à en créer un ensembliste mais qui ne fonctionnait qu'à moitié dans le sens que, si on voulait insérer un ensemble de lignes, il ne fonctionnait que pour des valeurs de GFT_ID différentes.
Sans plus tarder, un peu de code :
Le DDL de la table
Code:
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
| /****** Object: Table [dbo].[T_ACTIVATION_ACT] Script Date: 10/04/2012 15:48:35 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[T_ACTIVATION_ACT](
[GFT_ID] [int] NOT NULL, --clef primaire de la table parente
[ACT_ID] [tinyint] NOT NULL, --colonne d'identification relative
[DOS_ID] [int] NULL,
[ACT_DATE] [datetime] NOT NULL,
[ACT_VALUE] [decimal](6, 2) NOT NULL,
CONSTRAINT [PK_T_ACTIVATION_ACT] PRIMARY KEY CLUSTERED
(
[GFT_ID] ASC,
[ACT_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[T_ACTIVATION_ACT] WITH CHECK ADD CONSTRAINT [FK_T_ACTIVATION_ACT_TJ_GFT_DOS_JGD] FOREIGN KEY([GFT_ID], [DOS_ID])
REFERENCES [dbo].[TJ_GFT_DOS_JGD] ([GFT_ID], [DOS_ID])
GO
ALTER TABLE [dbo].[T_ACTIVATION_ACT] CHECK CONSTRAINT [FK_T_ACTIVATION_ACT_TJ_GFT_DOS_JGD]
GO |
Et le DDL du trigger itératif :
Code:
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
| /****** Object: Trigger [dbo].[TR_RELATIVE_IDENTIFICATION_ACT] Script Date: 10/04/2012 15:48:44 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [dbo].[TR_RELATIVE_IDENTIFICATION_ACT] ON [dbo].[T_ACTIVATION_ACT]
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON;
SELECT
ROW_NUM = ROW_NUMBER() OVER(ORDER BY GFT_ID),
*
INTO
#INS
FROM
INSERTED;
DECLARE @ITER INT;
DECLARE @COUNT INT;
SELECT @ITER=MIN(ROW_NUM) FROM #INS;
SELECT @COUNT=MAX(ROW_NUM) FROM #INS;
WHILE @ITER <= @COUNT
BEGIN
INSERT INTO T_ACTIVATION_ACT(GFT_ID, ACT_ID, DOS_ID, ACT_DATE, ACT_VALUE)
SELECT
INS.GFT_ID,
COALESCE(MAX(ACT.ACT_ID),0)+1,
INS.DOS_ID,
INS.ACT_DATE,
INS.ACT_VALUE
FROM
T_ACTIVATION_ACT ACT
RIGHT OUTER JOIN #INS INS
ON ACT.GFT_ID = INS.GFT_ID
WHERE
INS.ROW_NUM = @ITER
GROUP BY
INS.GFT_ID,
INS.DOS_ID,
INS.ACT_DATE,
INS.ACT_VALUE;
SET @ITER = @ITER+1;
END
END
GO |
J'ai encore du mal avec la logique ensembliste. C'est pourquoi je viens chercher votre aide.
Merci d'avance.