sql >> Databasteknik >  >> RDS >> Sqlserver

Skapa en "Senast ändrad" kolumn i SQL Server

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.


  1. Räkna antalet unika värden

  2. Vad är nytt i Access 2016? Är det värt att uppgradera?

  3. Här är tre skäl till varför du kan se toppaktivitet i din SQL-instans

  4. SQL Server 2016:Prestandapåverkan av alltid krypterad