Vissa databastabeller innehåller en kolumn "senast ändrad", som lagrar datum och tid då raden senast uppdaterades. Varje gång raden uppdateras uppdateras datumet för att återspegla datumet och tiden för den uppdateringen.
I SQL Server kan du använda en trigger för att utföra den här uppdateringen.
En trigger är en speciell typ av lagrad procedur som körs automatiskt när en händelse inträffar i databasservern.
Du kan använda CREATE TRIGGER
för att skapa en trigger när du använder T-SQL. Denna sats kan användas för att skapa en DML-, DDL- eller inloggningsutlösare.
Exempel
Följande kod skapar en tabell, såväl som en trigger som uppdaterar ModifiedDate
kolumn när det finns en uppdatering.
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);
Infoga en rad
Låt oss infoga en rad och markera den för att se resultatet av DEFAULT
begränsning:
INSERT INTO Books (BookName)
VALUES ('Trigger Happy');
SELECT * FROM Books;
Resultat (med vertikal utdata):
-[ RECORD 1 ]------------------------- BookId | 1 BookName | Trigger Happy CreateDate | 2020-08-17 23:33:15.230 ModifiedDate | 2020-08-17 23:33:15.230
Detta visas med vertikal utdata för att göra det lättare att läsa (så att du inte behöver rulla i sidled för att läsa alla kolumner).
I det här fallet, både CreatedDate
och ModifiedDate
kolumner innehåller samma värde. Men om raden uppdateras visas ModifiedDate
värdet bör ändras. Det är därför vi skapade utlösaren.
Uppdatera raden
Låt oss nu uppdatera raden och välja resultaten.
UPDATE Books
SET BookName = 'Trigger Hippy'
WHERE BookId = 1;
SELECT * FROM Books;
Resultat (med vertikal utdata):
-[ RECORD 1 ]------------------------- BookId | 1 BookName | Trigger Hippy CreateDate | 2020-08-17 23:33:15.230 ModifiedDate | 2020-08-18 00:07:39.680
Som förväntat, ModifiedDate
kolumnen uppdateras men CreateDate
kolumnen förblir densamma.
Ytterligare förklaring av koden
Nedan finns en mer detaljerad förklaring av koden som används för att skapa tabellen och dess tillhörande utlösare.
Tabell
Följande kod skapar tabellen:
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
);
ModifiedDate
kolumnen har en DEFAULT
begränsning som anger standardvärdet till CURRENT_TIMESTAMP
(liksom CreateDate
kolumn).
Detta betyder att när raden infogas första gången visas CURRENT_TIMESTAMP
infogas i dessa kolumner.
Det här är bra för den första infogningen, men det tillgodoser inte några efterföljande uppdateringar. Det är där triggern kommer in.
Utlösaren
Följande kod skapar utlösaren:
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);
I det här fallet kallade jag utlösaren trg_Books_UpdateModifiedDate
.
Jag skapade den på dbo.Books
databas, och den körs efter varje UPDATE
.
När den körs uppdaterar den ModifiedDate
kolumnen till CURRENT_TIMESTAMP
(men bara på raden som uppdaterades förstås).
Jag kan avgöra vilken rad som uppdaterades genom att kontrollera inserted
tabell. Den inserted
table är en temporär, minnesresident tabell som SQL Server skapar och underhåller.
Den inserted
Tabell lagrar kopior av de berörda raderna under INSERT
och UPDATE
uttalanden. Under en infogning eller uppdateringstransaktion läggs nya rader till i båda de inserted
tabellen och triggerbordet. Raderna i inserted
tabellen är kopior av de nya raderna i triggertabellen.
Förutom den inserted
tabell, skapar och underhåller SQL Server också en deleted
tabell. En uppdateringstransaktion liknar en raderingsoperation följt av en infogningsoperation; de gamla raderna kopieras till den deleted
tabellen först, och sedan kopieras de nya raderna till triggertabellen och till den inserted
bord.
En utlösare för kolumnen Skapat datum
Använder en DEFAULT
begränsning är ett praktiskt sätt att skapa det initiala värdet, men du riskerar att någon direkt kan uppdatera det värdet senare.
Om du ser detta som ett problem kan du ändra utlösaren så att den inkluderar kolumnen "Datum skapat", så att den återställer det till sitt ursprungliga värde när som helst det sker en uppdatering av raden.
Du kan få det ursprungliga värdet från den deleted
tabell, eftersom de gamla raderna kopieras till den här tabellen först, innan några uppdateringar äger rum.