Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Utwórz kolumnę „Ostatnia modyfikacja” w SQL Server

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Używanie varchar(MAX) vs TEXT na SQL Server

  2. 3 sposoby zwracania wierszy zawierających znaki alfanumeryczne w SQL Server

  3. Zaktualizuj profil poczty bazy danych (SSMS)

  4. Konwertuj czas dziesiętny na godziny i minuty

  5. Jak TRY_CAST() działa w SQL Server