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.