Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Crea una colonna "Ultima modifica" in SQL Server

Alcune tabelle di database includono una colonna "ultima modifica", che memorizza la data e l'ora dell'ultimo aggiornamento della riga. Ogni volta che la riga viene aggiornata, la data viene aggiornata per riflettere la data e l'ora di tale aggiornamento.

In SQL Server puoi utilizzare un trigger per eseguire questo aggiornamento.

Un trigger è un tipo speciale di stored procedure che viene eseguito automaticamente quando si verifica un evento nel server di database.

Puoi usare il CREATE TRIGGER istruzione per creare un trigger quando si utilizza T-SQL. Questa istruzione può essere utilizzata per creare un trigger DML, DDL o di accesso.

Esempio

Il codice seguente crea una tabella, nonché un trigger che aggiorna il ModifiedDate colonna ogni volta che c'è un aggiornamento.

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);

Inserisci una riga

Inseriamo una riga e selezioniamola per vedere il risultato del DEFAULT vincolo:

INSERT INTO Books (BookName) 
VALUES ('Trigger Happy');

SELECT * FROM Books;

Risultato (usando l'output verticale):

-[ RECORD 1 ]-------------------------
BookId       | 1
BookName     | Trigger Happy
CreateDate   | 2020-08-17 23:33:15.230
ModifiedDate | 2020-08-17 23:33:15.230

Viene visualizzato utilizzando l'output verticale per facilitarne la lettura (in modo da non dover scorrere lateralmente per leggere tutte le colonne).

In questo caso, sia il CreatedDate e ModifiedDate le colonne contengono lo stesso valore. Tuttavia, se la riga viene aggiornata, il ModifiedDate Il valore dovrebbe cambiare. Ecco perché abbiamo creato il trigger.

Aggiorna la riga

Ora aggiorniamo la riga e selezioniamo i risultati.

UPDATE Books 
SET BookName = 'Trigger Hippy'
WHERE BookId = 1;

SELECT * FROM Books;

Risultato (usando l'output verticale):

-[ RECORD 1 ]-------------------------
BookId       | 1
BookName     | Trigger Hippy
CreateDate   | 2020-08-17 23:33:15.230
ModifiedDate | 2020-08-18 00:07:39.680

Come previsto, il ModifiedDate la colonna è aggiornata ma il CreateDate la colonna rimane la stessa.

Ulteriore spiegazione del Codice

Di seguito è riportata una spiegazione più dettagliata del codice utilizzato per creare la tabella e il relativo trigger.

Il Tavolo

Il codice seguente crea la tabella:

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
);

Il ModifiedDate la colonna ha un DEFAULT vincolo che imposta il valore predefinito su CURRENT_TIMESTAMP (così come CreateDate colonna).

Ciò significa che quando la riga viene inserita per la prima volta, il CURRENT_TIMESTAMP è inserito in quelle colonne.

Questo va bene per l'inserto iniziale, ma non prevede aggiornamenti successivi. È qui che entra in gioco il grilletto.

Il grilletto

Il codice seguente crea il 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 questo caso, ho chiamato il trigger trg_Books_UpdateModifiedDate .

L'ho creato su dbo.Books database e viene eseguito dopo ogni UPDATE .

Quando viene eseguito, aggiorna il ModifiedDate colonna al CURRENT_TIMESTAMP (ma solo sulla riga che è stata aggiornata, ovviamente).

Sono in grado di determinare quale riga è stata aggiornata controllando il inserted tavolo. Il inserted table è una tabella temporanea residente in memoria creata e gestita da SQL Server.

Il inserted table memorizza le copie delle righe interessate durante INSERT e UPDATE dichiarazioni. Durante una transazione di inserimento o aggiornamento, vengono aggiunte nuove righe a entrambi gli inserted tabella e la tabella trigger. Le righe nel inserted table sono copie delle nuove righe nella tabella trigger.

Oltre al inserted tabella, SQL Server crea e gestisce anche un deleted tavolo. Una transazione di aggiornamento è simile a un'operazione di eliminazione seguita da un'operazione di inserimento; le vecchie righe vengono copiate nel deleted prima la tabella, quindi le nuove righe vengono copiate nella tabella trigger e in inserted tabella.

Un trigger per la colonna "Data di creazione"

Usando un DEFAULT il vincolo è un modo pratico per creare il valore iniziale, ma corri il rischio che qualcuno possa aggiornare direttamente quel valore in un secondo momento.

Se ritieni che questo sia un problema, puoi modificare l'attivatore per includere la colonna "Data di creazione", in modo che reimposti il ​​suo valore originale ogni volta che viene aggiornato la riga.

Puoi ottenere il valore originale da deleted tabella, visto che le vecchie righe vengono copiate prima in questa tabella, prima che avvenga qualsiasi aggiornamento.