Niektóre tabele bazy danych zawierają kolumnę „ostatniej modyfikacji”, która przechowuje datę i godzinę ostatniej aktualizacji wiersza. Za każdym razem, gdy wiersz jest aktualizowany, data jest aktualizowana, aby odzwierciedlić datę i godzinę tej aktualizacji.
W SQL Server możesz użyć wyzwalacza, aby wykonać tę aktualizację.
Wyzwalacz to specjalny rodzaj procedury składowanej, która jest uruchamiana automatycznie, gdy na serwerze bazy danych wystąpi zdarzenie.
Możesz użyć CREATE TRIGGER
instrukcja, aby utworzyć wyzwalacz podczas korzystania z T-SQL. Ta instrukcja może być użyta do utworzenia wyzwalacza DML, DDL lub logowania.
Przykład
Poniższy kod tworzy tabelę, a także wyzwalacz, który aktualizuje ModifiedDate
kolumna, gdy pojawi się aktualizacja.
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);
Wstaw wiersz
Wstawmy wiersz i zaznaczmy go, aby zobaczyć wynik DEFAULT
ograniczenie:
INSERT INTO Books (BookName)
VALUES ('Trigger Happy');
SELECT * FROM Books;
Wynik (przy użyciu wyjścia pionowego):
-[ RECORD 1 ]------------------------- BookId | 1 BookName | Trigger Happy CreateDate | 2020-08-17 23:33:15.230 ModifiedDate | 2020-08-17 23:33:15.230
Jest to wyświetlane przy użyciu pionowych danych wyjściowych, aby ułatwić czytanie (abyś nie musiał przewijać na boki, aby przeczytać wszystkie kolumny).
W tym przypadku zarówno CreatedDate
i ModifiedDate
kolumny zawierają tę samą wartość. Jeśli jednak wiersz zostanie zaktualizowany, ModifiedDate
wartość powinna się zmienić. Dlatego stworzyliśmy wyzwalacz.
Zaktualizuj wiersz
Teraz zaktualizujmy wiersz i wybierzmy wyniki.
UPDATE Books
SET BookName = 'Trigger Hippy'
WHERE BookId = 1;
SELECT * FROM Books;
Wynik (przy użyciu wyjścia pionowego):
-[ RECORD 1 ]------------------------- BookId | 1 BookName | Trigger Hippy CreateDate | 2020-08-17 23:33:15.230 ModifiedDate | 2020-08-18 00:07:39.680
Zgodnie z oczekiwaniami ModifiedDate
kolumna jest aktualizowana, ale CreateDate
kolumna pozostaje taka sama.
Dalsze wyjaśnienie Kodeksu
Poniżej znajduje się bardziej szczegółowe wyjaśnienie kodu użytego do utworzenia tabeli i powiązanego z nią wyzwalacza.
Stół
Poniższy kod tworzy 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
);
ModifiedDate
kolumna ma DEFAULT
ograniczenie, które ustawia domyślną wartość na CURRENT_TIMESTAMP
(podobnie jak CreateDate
kolumna).
Oznacza to, że gdy wiersz jest wstawiany po raz pierwszy, CURRENT_TIMESTAMP
wstawia się do tych kolumn.
Jest to w porządku dla początkowej wstawki, ale nie obejmuje żadnych kolejnych aktualizacji. W tym momencie pojawia się wyzwalacz.
Wyzwalacz
Poniższy kod tworzy wyzwalacz:
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);
W tym przypadku wywołałem wyzwalacz trg_Books_UpdateModifiedDate
.
Utworzyłem go na dbo.Books
i uruchamia się po każdej UPDATE
.
Po uruchomieniu aktualizuje ModifiedDate
kolumna do CURRENT_TIMESTAMP
(ale oczywiście tylko w zaktualizowanym wierszu).
Mogę określić, który wiersz został zaktualizowany, sprawdzając inserted
stół. inserted
table to tymczasowa, rezydująca w pamięci tabela, którą tworzy i utrzymuje SQL Server.
inserted
tabela przechowuje kopie dotkniętych wierszy podczas INSERT
i UPDATE
sprawozdania. Podczas transakcji wstawiania lub aktualizacji nowe wiersze są dodawane do obu elementów inserted
stół i stół wyzwalający. Wiersze w inserted
tabela to kopie nowych wierszy w tabeli wyzwalającej.
Oprócz inserted
tabela, SQL Server również tworzy i utrzymuje deleted
stół. Transakcja aktualizacji jest podobna do operacji usuwania, po której następuje operacja wstawiania; stare wiersze są kopiowane do deleted
najpierw tabeli, a następnie nowe wiersze są kopiowane do tabeli wyzwalacza i do inserted
tabela.
Wyzwalacz dla kolumny „Data utworzenia”
Korzystanie z DEFAULT
ograniczenie to wygodny sposób na utworzenie wartości początkowej, ale istnieje ryzyko, że ktoś może później bezpośrednio zaktualizować tę wartość.
Jeśli uznasz to za problem, możesz zmodyfikować regułę, aby zawierała kolumnę „Data utworzenia”, tak aby przywracała jej pierwotną wartość za każdym razem, gdy nastąpi aktualizacja wiersza.
Możesz uzyskać oryginalną wartość z deleted
tabeli, ponieważ stare wiersze są najpierw kopiowane do tej tabeli, zanim nastąpią jakiekolwiek aktualizacje.