Courage ! Allons-y avec un trigger BEFORE.
(1) Je crée la table, en simplifiant le type pour la colonne dm, histoire de ne pas m’embrouiller avec la syntaxe des dates avec SQL Server :
CREATE TABLE matable (
cle int not null
, num int not null
, dm char(10) not null
, ordre int not null
, libelle varchar(10)
, PRIMARY KEY (cle, num, dm, ordre)
) ;
(2) Le trigger. Je déclare une variable de type table (@theInserted) pour mieux tracer le comportement de SQL Server.
go
CREATE TRIGGER montrigger on matable
instead of insert
AS
begin
declare @maxOrdre int ;
declare @theInserted table
(
rowNum int
, cle int
, num int
, dm char(10)
, ordre int
, libelle varchar(10)
) ;
/* @theInserted = inserted enrichie du row_number */
insert into @theInserted (rowNum, cle, num , dm, ordre, libelle)
select row_number() over(order by cle), cle, num, dm, ordre, libelle
from inserted
;
select '' as '@theInserted', * from @theInserted ;
/* Numéro d'ordre le plus élevé dans matable
pour le triplet cle, num, dm */
set @maxOrdre =
(select isNull(max(a.ordre),0)
from matable as a
join inserted as i on i.cle = a.cle and i.num = a.num and i.dm = a.dm)
;
/* mise à jour de matable */
insert into matable
select cle, num, dm, @maxOrdre + rowNum as ordre, libelle
from @theInserted
end
go
Partager