Pour satisfaire le suivi des modifications et de créations des lignes, nous rajoutons deux colonnes sur la table Client :
- CreationDate : Date de création de la ligne
- LastEditDate : Date de modification de la ligne
Le champ CreationDate porte une contrainte de création de ligne :
ALTER TABLE [dbo].[Client] ADD CONSTRAINT [DF_Client_CreationDate] DEFAULT (getutcdate()) FOR [CreationDate]
De même pour le champ LastEditDate :
ALTER TABLE [dbo].[Client] ADD CONSTRAINT [DF_Client_LastEditDate] DEFAULT (getutcdate()) FOR [LastEditDate]
Parallèlement à cela, nous devons être en mesure de récupérer les lignes effacées. Pour cela, nous créons un table "tombeau" où "reposent" les identifiants des lignes effacées :
CREATE TABLE [dbo].[Client_Tombstone]
(
[ClientId] [uniqueidentifier] NOT NULL,
[DeletionDate] [datetime] NULL
) ON [PRIMARY]
Il existe également des triggers sur cette table :
Trigger de suppression : A chaque ligne supprimée, une ligne est créée dans la table Tombstone :
CREATE TRIGGER [Client_DeletionTrigger]
ON [Client]
AFTER DELETE
AS
SET NOCOUNT ON
UPDATE [Client_Tombstone]
SET [DeletionDate] = GETUTCDATE()
FROM deleted
WHERE deleted.[ClientId] = [Client_Tombstone].[ClientId]
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO [Client_Tombstone]
([ClientId], DeletionDate)
SELECT [ClientId], GETUTCDATE()
FROM deleted
END
Trigger de mise à jour : A chaque mise à jour de ligne, la colonne LastEditDate est mise à jour :
CREATE TRIGGER [Client_UpdateTrigger]
ON [Client]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON
UPDATE [Client]
SET [LastEditDate] = GETUTCDATE()
FROM inserted
WHERE inserted.[ClientId] = [Client].[ClientId]
END;
Trigger d'insertion : A chaque insertion, la colonne CreatedDate est mise à jour :
CREATE TRIGGER [Client_InsertTrigger]
ON [Client]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON
UPDATE [Client]
SET [CreationDate] = GETUTCDATE()
FROM inserted
WHERE inserted.[ClientId] = [Client].[ClientId]
END;