octobre
2007
Mon client préféré m’a demandé de rajouter sur des tables de la base des colonnes ExportedDate, UpdatedDate, CreatedDate via un script SQL.
Rajouter des colonnes c’est facile :
ExportedDate datetime NULL,
UpdatedDate datetime NULL,
CreatedDate datetime NULL
GO
Pour remplir automatiquement la colonne CreatedDate, c’est également très simple, il suffit de lui mettre GETDATE() comme valeur par défaut :
DF_Toto_CreatedDate DEFAULT GETDATE() FOR CreatedDate
GO
On aurait aussi pu, tout simplement le mettre à la déclaration de la colonne :
CreatedDate datetime DEFAULT GETDATE()
L’exportation, je ne peux pas la déduire, je la remplirai donc par code, par contre la modification, je peux la déduire.
Comme je ne passe pas systèmatiquement par des procs stocks, je vais utiliser un trigger. Mais, petite contrainte : la modification de ExportedDate ne doit pas affecter UpdatedDate. Je vais pour cela utiliser COLUMNS_UPDATED() :
ON Toto
AFTER UPDATE AS
DECLARE @exported_date_index INT
DECLARE @nb_cols INT
SELECT @exported_date_index = colid - 1
FROM sys.syscolumns
WHERE id=OBJECT_ID('Toto')
AND name='ExportedDate'
SELECT @nb_cols = Count(1)
FROM syscolumns
WHERE id=OBJECT_ID('Toto')
IF (POWER(2, (((@nb_cols - 1) / 8) - (@trf_date_index / 8)) * 8 + (@trf_date_index % 8)) <> COLUMNS_UPDATED())
BEGIN
UPDATE Toto
SET Toto.UpdatedDate = GETDATE()
FROM Inserted
INNER JOIN Controleurs ON Controleurs.KeyCol = Inserted.KeyCol
END
GO
Un grand merci à Sylvain pour son aide.
Bonjour,
Petit déterrage, a quoi correspond @trf_date_index ?