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.