Certaines tables de base de données incluent une colonne "dernière modification", qui stocke la date et l'heure de la dernière mise à jour de la ligne. Chaque fois que la ligne est mise à jour, la date est mise à jour pour refléter la date et l'heure de cette mise à jour.
Dans SQL Server, vous pouvez utiliser un déclencheur pour effectuer cette mise à jour.
Un déclencheur est un type spécial de procédure stockée qui s'exécute automatiquement lorsqu'un événement se produit dans le serveur de base de données.
Vous pouvez utiliser le CREATE TRIGGER
pour créer un déclencheur lors de l'utilisation de T-SQL. Cette instruction peut être utilisée pour créer un déclencheur DML, DDL ou de connexion.
Exemple
Le code suivant crée une table, ainsi qu'un déclencheur qui met à jour le ModifiedDate
chaque fois qu'il y a une mise à jour.
CREATE TABLE dbo.Books (
BookId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
BookName nvarchar(1000) NOT NULL,
CreateDate datetime DEFAULT CURRENT_TIMESTAMP,
ModifiedDate datetime DEFAULT CURRENT_TIMESTAMP
);
CREATE TRIGGER trg_Books_UpdateModifiedDate
ON dbo.Books
AFTER UPDATE
AS
UPDATE dbo.Books
SET ModifiedDate = CURRENT_TIMESTAMP
WHERE BookId IN (SELECT DISTINCT BookId FROM inserted);
Insérer une ligne
Insérons une ligne et sélectionnons-la pour voir le résultat du DEFAULT
contrainte :
INSERT INTO Books (BookName)
VALUES ('Trigger Happy');
SELECT * FROM Books;
Résultat (en utilisant la sortie verticale) :
-[ RECORD 1 ]------------------------- BookId | 1 BookName | Trigger Happy CreateDate | 2020-08-17 23:33:15.230 ModifiedDate | 2020-08-17 23:33:15.230
Ceci est affiché en utilisant une sortie verticale afin de faciliter la lecture (pour que vous n'ayez pas à faire défiler latéralement pour lire toutes les colonnes).
Dans ce cas, la CreatedDate
et ModifiedDate
colonnes contiennent la même valeur. Cependant, si la ligne est mise à jour, le ModifiedDate
La valeur de doit changer. C'est pourquoi nous avons créé le déclencheur.
Mettre à jour la ligne
Maintenant, mettons à jour la ligne et sélectionnons les résultats.
UPDATE Books
SET BookName = 'Trigger Hippy'
WHERE BookId = 1;
SELECT * FROM Books;
Résultat (en utilisant la sortie verticale) :
-[ RECORD 1 ]------------------------- BookId | 1 BookName | Trigger Hippy CreateDate | 2020-08-17 23:33:15.230 ModifiedDate | 2020-08-18 00:07:39.680
Comme prévu, le ModifiedDate
la colonne est mise à jour mais la CreateDate
la colonne reste la même.
Plus d'explications sur le code
Vous trouverez ci-dessous une explication plus détaillée du code utilisé pour créer la table et son déclencheur associé.
Le tableau
Le code suivant crée la table :
CREATE TABLE dbo.Books (
BookId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
BookName nvarchar(1000) NOT NULL,
CreateDate datetime DEFAULT CURRENT_TIMESTAMP,
ModifiedDate datetime DEFAULT CURRENT_TIMESTAMP
);
La ModifiedDate
la colonne a un DEFAULT
contrainte qui fixe la valeur par défaut à CURRENT_TIMESTAMP
(tout comme le CreateDate
colonne).
Cela signifie que lorsque la ligne est insérée pour la première fois, le CURRENT_TIMESTAMP
est inséré dans ces colonnes.
C'est bien pour l'insertion initiale, mais cela ne tient pas compte des mises à jour ultérieures. C'est là qu'intervient le déclencheur.
Le déclencheur
Le code suivant crée le déclencheur :
CREATE TRIGGER trg_Books_UpdateModifiedDate
ON dbo.Books
AFTER UPDATE
AS
UPDATE dbo.Books
SET ModifiedDate = CURRENT_TIMESTAMP
WHERE BookId IN (SELECT DISTINCT BookId FROM inserted);
Dans ce cas, j'ai appelé le déclencheur trg_Books_UpdateModifiedDate
.
Je l'ai créé sur dbo.Books
base de données, et il s'exécute après chaque UPDATE
.
Lorsqu'il s'exécute, il met à jour le ModifiedDate
colonne au CURRENT_TIMESTAMP
(mais uniquement sur la ligne qui a été mise à jour, bien sûr).
Je suis en mesure de déterminer quelle ligne a été mise à jour en vérifiant le inserted
table. Le inserted
table est une table temporaire résidente en mémoire que SQL Server crée et gère.
Le inserted
table stocke des copies des lignes affectées pendant INSERT
et UPDATE
déclarations. Lors d'une transaction d'insertion ou de mise à jour, de nouvelles lignes sont ajoutées à la fois au inserted
table et la table de déclenchement. Les lignes dans le inserted
table sont des copies des nouvelles lignes de la table de déclenchement.
En plus du inserted
table, SQL Server crée et gère également une table deleted
table. Une transaction de mise à jour est similaire à une opération de suppression suivie d'une opération d'insertion; les anciennes lignes sont copiées dans le deleted
table d'abord, puis les nouvelles lignes sont copiées dans la table de déclenchement et dans le inserted
tableau.
Un déclencheur pour la colonne "Date de création"
Utiliser un DEFAULT
La contrainte est un moyen pratique de créer la valeur initiale, mais vous courez le risque que quelqu'un puisse directement mettre à jour cette valeur ultérieurement.
Si vous voyez cela comme un problème, vous pouvez modifier le déclencheur pour inclure la colonne "Date de création", afin qu'il la réinitialise à sa valeur d'origine chaque fois qu'il y a une mise à jour de la ligne.
Vous pouvez obtenir la valeur d'origine à partir du deleted
table, car les anciennes lignes sont d'abord copiées dans cette table, avant toute mise à jour.