Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Erstellen Sie eine „Zuletzt geändert“-Spalte in SQL Server

Einige Datenbanktabellen enthalten eine Spalte „Zuletzt geändert“, in der Datum und Uhrzeit der letzten Aktualisierung der Zeile gespeichert werden. Jedes Mal, wenn die Zeile aktualisiert wird, wird das Datum aktualisiert, um das Datum und die Uhrzeit dieser Aktualisierung widerzuspiegeln.

In SQL Server können Sie einen Trigger verwenden, um diese Aktualisierung durchzuführen.

Ein Trigger ist eine spezielle Art von gespeicherter Prozedur, die automatisch ausgeführt wird, wenn ein Ereignis auf dem Datenbankserver auftritt.

Sie können den CREATE TRIGGER verwenden -Anweisung zum Erstellen eines Triggers bei Verwendung von T-SQL. Diese Anweisung kann verwendet werden, um einen DML-, DDL- oder Anmeldetrigger zu erstellen.

Beispiel

Der folgende Code erstellt eine Tabelle sowie einen Trigger, der das ModifiedDate aktualisiert Spalte, wenn es ein Update gibt.

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);

Zeile einfügen

Lassen Sie uns eine Zeile einfügen und auswählen, um das Ergebnis von DEFAULT anzuzeigen Einschränkung:

INSERT INTO Books (BookName) 
VALUES ('Trigger Happy');

SELECT * FROM Books;

Ergebnis (bei vertikaler Ausgabe):

-[ RECORD 1 ]-------------------------
BookId       | 1
BookName     | Trigger Happy
CreateDate   | 2020-08-17 23:33:15.230
ModifiedDate | 2020-08-17 23:33:15.230

Dies wird mit vertikaler Ausgabe angezeigt, um es besser lesbar zu machen (damit Sie nicht seitwärts scrollen müssen, um alle Spalten zu lesen).

In diesem Fall sind sowohl das CreatedDate und ModifiedDate Spalten enthalten denselben Wert. Wenn die Zeile jedoch aktualisiert wird, wird das ModifiedDate Der Wert sollte sich ändern. Deshalb haben wir den Trigger erstellt.

Aktualisiere die Zeile

Jetzt aktualisieren wir die Zeile und wählen die Ergebnisse aus.

UPDATE Books 
SET BookName = 'Trigger Hippy'
WHERE BookId = 1;

SELECT * FROM Books;

Ergebnis (bei vertikaler Ausgabe):

-[ RECORD 1 ]-------------------------
BookId       | 1
BookName     | Trigger Hippy
CreateDate   | 2020-08-17 23:33:15.230
ModifiedDate | 2020-08-18 00:07:39.680

Wie erwartet, das ModifiedDate Spalte aktualisiert, aber das CreateDate Spalte bleibt gleich.

Weitere Erklärung des Kodex

Nachfolgend finden Sie eine detailliertere Erläuterung des Codes, der zum Erstellen der Tabelle und des zugehörigen Triggers verwendet wurde.

Der Tisch

Der folgende Code erstellt die Tabelle:

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
);

Das ModifiedDate Spalte hat einen DEFAULT Einschränkung, die den Standardwert auf CURRENT_TIMESTAMP setzt (ebenso wie CreateDate Spalte).

Das bedeutet, dass beim ersten Einfügen der Zeile der CURRENT_TIMESTAMP wird in diese Spalten eingefügt.

Dies ist für die anfängliche Einfügung in Ordnung, berücksichtigt jedoch keine späteren Aktualisierungen. Hier kommt der Auslöser ins Spiel.

Der Auslöser

Der folgende Code erstellt den Trigger:

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);

In diesem Fall habe ich den Trigger trg_Books_UpdateModifiedDate genannt .

Ich habe es auf dbo.Books erstellt Datenbank und läuft nach jedem UPDATE .

Wenn es ausgeführt wird, aktualisiert es das ModifiedDate Spalte zum CURRENT_TIMESTAMP (aber natürlich nur in der Zeile, die aktualisiert wurde).

Ich kann feststellen, welche Zeile aktualisiert wurde, indem ich den inserted überprüfe Tisch. Der inserted table ist eine temporäre, speicherresidente Tabelle, die von SQL Server erstellt und verwaltet wird.

Der inserted Tabelle speichert Kopien der betroffenen Zeilen während INSERT und UPDATE Aussagen. Während einer Einfüge- oder Aktualisierungstransaktion werden sowohl dem inserted neue Zeilen hinzugefügt Tabelle und die Triggertabelle. Die Zeilen im inserted Tabelle sind Kopien der neuen Zeilen in der Trigger-Tabelle.

Zusätzlich zum inserted Tabelle erstellt und verwaltet SQL Server auch eine deleted Tisch. Eine Aktualisierungstransaktion ähnelt einer Löschoperation, gefolgt von einer Einfügeoperation; die alten Zeilen werden in den deleted kopiert Tabelle zuerst, und dann werden die neuen Zeilen in die Triggertabelle und in den inserted kopiert Tabelle.

Ein Auslöser für die Spalte „Erstellungsdatum“

Verwenden eines DEFAULT Einschränkung ist ein praktischer Weg, um den Anfangswert zu erstellen, aber Sie laufen Gefahr, dass jemand diesen Wert später direkt aktualisiert.

Wenn Sie dies als Problem ansehen, können Sie den Trigger so ändern, dass er die Spalte „Erstellungsdatum“ enthält, sodass sie bei jeder Aktualisierung der Zeile auf ihren ursprünglichen Wert zurückgesetzt wird.

Sie können den ursprünglichen Wert von deleted erhalten Tabelle, da die alten Zeilen zuerst in diese Tabelle kopiert werden, bevor irgendwelche Aktualisierungen stattfinden.