Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Créer une colonne "Dernière modification" dans SQL Server

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.