Sommige databasetabellen bevatten een kolom 'laatst gewijzigd', waarin de datum en tijd worden opgeslagen waarop de rij voor het laatst is bijgewerkt. Elke keer dat de rij wordt bijgewerkt, wordt de datum bijgewerkt om de datum en tijd van die update weer te geven.
In SQL Server kunt u een trigger gebruiken om deze update uit te voeren.
Een trigger is een speciaal type opgeslagen procedure die automatisch wordt uitgevoerd wanneer een gebeurtenis plaatsvindt in de databaseserver.
U kunt de CREATE TRIGGER
. gebruiken statement om een trigger te maken bij het gebruik van T-SQL. Deze instructie kan worden gebruikt om een DML-, DDL- of aanmeldingstrigger te maken.
Voorbeeld
De volgende code maakt een tabel aan, evenals een trigger die de ModifiedDate
bijwerkt kolom wanneer er een update is.
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);
Voeg een rij in
Laten we een rij invoegen en deze selecteren om het resultaat van de DEFAULT
. te zien beperking:
INSERT INTO Books (BookName)
VALUES ('Trigger Happy');
SELECT * FROM Books;
Resultaat (met verticale uitvoer):
-[ RECORD 1 ]------------------------- BookId | 1 BookName | Trigger Happy CreateDate | 2020-08-17 23:33:15.230 ModifiedDate | 2020-08-17 23:33:15.230
Dit wordt weergegeven met verticale uitvoer om het lezen gemakkelijker te maken (zodat u niet zijwaarts hoeft te scrollen om alle kolommen te lezen).
In dit geval zijn zowel de CreatedDate
en ModifiedDate
kolommen dezelfde waarde bevatten. Als de rij echter wordt bijgewerkt, wordt de ModifiedDate
's waarde zou moeten veranderen. Daarom hebben we de trigger gemaakt.
De rij bijwerken
Laten we nu de rij bijwerken en de resultaten selecteren.
UPDATE Books
SET BookName = 'Trigger Hippy'
WHERE BookId = 1;
SELECT * FROM Books;
Resultaat (met verticale uitvoer):
-[ RECORD 1 ]------------------------- BookId | 1 BookName | Trigger Hippy CreateDate | 2020-08-17 23:33:15.230 ModifiedDate | 2020-08-18 00:07:39.680
Zoals verwacht, de ModifiedDate
kolom is bijgewerkt, maar de CreateDate
kolom blijft hetzelfde.
Verdere uitleg van de code
Hieronder vindt u een meer gedetailleerde uitleg van de code die is gebruikt om de tabel te maken en de bijbehorende trigger.
De Tafel
De volgende code maakt de tabel:
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
);
De ModifiedDate
kolom heeft een DEFAULT
beperking die de standaardwaarde instelt op CURRENT_TIMESTAMP
(net als de CreateDate
kolom).
Dit betekent dat wanneer de rij voor het eerst wordt ingevoegd, de CURRENT_TIMESTAMP
wordt in die kolommen ingevoegd.
Dit is prima voor de eerste invoeging, maar het is niet geschikt voor latere updates. Dat is waar de trigger binnenkomt.
De trekker
De volgende code maakt de 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 dit geval noemde ik de trigger trg_Books_UpdateModifiedDate
.
Ik heb het gemaakt op de dbo.Books
database, en het wordt uitgevoerd na elke UPDATE
.
Wanneer het wordt uitgevoerd, wordt de ModifiedDate
. bijgewerkt kolom naar de CURRENT_TIMESTAMP
(maar alleen op de rij die is bijgewerkt natuurlijk).
Ik kan bepalen welke rij is bijgewerkt door de inserted
. aan te vinken tafel. De inserted
table is een tijdelijke, geheugenresidente tabel die SQL Server maakt en onderhoudt.
De inserted
tabel slaat kopieën op van de betrokken rijen tijdens INSERT
en UPDATE
verklaringen. Tijdens een invoeg- of bijwerktransactie worden nieuwe rijen toegevoegd aan zowel de inserted
tafel en de triggertafel. De rijen in de inserted
tabel zijn kopieën van de nieuwe rijen in de triggertabel.
Naast de inserted
tabel, maakt en onderhoudt SQL Server ook een deleted
tafel. Een update-transactie is vergelijkbaar met een verwijderbewerking gevolgd door een invoegbewerking; de oude rijen worden gekopieerd naar de deleted
tabel eerst, en dan worden de nieuwe rijen gekopieerd naar de triggertabel en naar de inserted
tafel.
Een trigger voor de kolom 'Aanmaakdatum'
Een DEFAULT
gebruiken constraint is een handige manier om de initiële waarde te creëren, maar je loopt wel het risico dat iemand die waarde later direct kan bijwerken.
Als u dit als een probleem beschouwt, kunt u de trigger wijzigen om de kolom 'Aanmaakdatum' op te nemen, zodat deze elke keer dat er een update van de rij is, de oorspronkelijke waarde terugzet.
U kunt de oorspronkelijke waarde ophalen uit de deleted
tabel, aangezien de oude rijen eerst naar deze tabel worden gekopieerd, voordat er updates plaatsvinden.