sql >> Database >  >> RDS >> Sqlserver

Maak een kolom "Laatst gewijzigd" in SQL Server

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.


  1. SQL BESTELLEN DOOR

  2. Hoe SUBDATE() werkt in MariaDB

  3. Unieke beperking op kolom maken voor reeds bestaande tabel - SQL Server / TSQL-zelfstudie, deel 97

  4. Prestaties en prijzen van PostgreSQL DigitalOcean vergelijken - ScaleGrid versus door DigitalOcean beheerde databases