Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Criar uma coluna "Última modificação" no SQL Server


Algumas tabelas de banco de dados incluem uma coluna “última modificação”, que armazena a data e hora em que a linha foi atualizada pela última vez. Cada vez que a linha é atualizada, a data é atualizada para refletir a data e hora dessa atualização.

No SQL Server, você pode usar um gatilho para realizar essa atualização.

Um gatilho é um tipo especial de procedimento armazenado que é executado automaticamente quando ocorre um evento no servidor de banco de dados.

Você pode usar o CREATE TRIGGER instrução para criar um gatilho ao usar T-SQL. Essa instrução pode ser usada para criar um gatilho DML, DDL ou de logon.

Exemplo


O código a seguir cria uma tabela, bem como um gatilho que atualiza o ModifiedDate coluna sempre que houver uma atualização.
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);

Inserir uma linha


Vamos inserir uma linha e selecioná-la para ver o resultado do DEFAULT limitação:
INSERT INTO Books (BookName) 
VALUES ('Trigger Happy');

SELECT * FROM Books;

Resultado (usando saída vertical):
-[ RECORD 1 ]-------------------------
BookId       | 1
BookName     | Trigger Happy
CreateDate   | 2020-08-17 23:33:15.230
ModifiedDate | 2020-08-17 23:33:15.230

Isso é exibido usando a saída vertical para facilitar a leitura (para que você não precise rolar para os lados para ler todas as colunas).

Nesse caso, tanto o CreatedDate e ModifiedDate colunas contêm o mesmo valor. No entanto, se a linha for atualizada, a ModifiedDate o valor de deve mudar. É por isso que criamos o gatilho.

Atualizar a linha


Agora vamos atualizar a linha e selecionar os resultados.
UPDATE Books 
SET BookName = 'Trigger Hippy'
WHERE BookId = 1;

SELECT * FROM Books;

Resultado (usando saída vertical):
-[ RECORD 1 ]-------------------------
BookId       | 1
BookName     | Trigger Hippy
CreateDate   | 2020-08-17 23:33:15.230
ModifiedDate | 2020-08-18 00:07:39.680

Como esperado, o ModifiedDate coluna é atualizada, mas o CreateDate coluna permanece a mesma.

Explicação adicional do Código


Abaixo está uma explicação mais detalhada do código usado para criar a tabela e seu gatilho associado.

A Mesa


O código a seguir cria a tabela:
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
);

A ModifiedDate coluna tem um DEFAULT restrição que define o valor padrão para CURRENT_TIMESTAMP (assim como o CreateDate coluna).

Isso significa que quando a linha é inserida pela primeira vez, o CURRENT_TIMESTAMP é inserido nessas colunas.

Isso é bom para a inserção inicial, mas não atende a atualizações subsequentes. É aí que entra o gatilho.

O gatilho


O código a seguir cria o gatilho:
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);

Nesse caso, chamei o gatilho trg_Books_UpdateModifiedDate .

Eu o criei no dbo.Books banco de dados, e é executado após cada UPDATE .

Quando executado, ele atualiza o ModifiedDate coluna para o CURRENT_TIMESTAMP (mas apenas na linha que foi atualizada, é claro).

Consigo determinar qual linha foi atualizada verificando o inserted tabela. O inserted table é uma tabela temporária residente na memória que o SQL Server cria e mantém.

O inserted tabela armazena cópias das linhas afetadas durante INSERT e UPDATE declarações. Durante uma transação de inserção ou atualização, novas linhas são adicionadas ao inserted tabela e a tabela de gatilho. As linhas no inserted table são cópias das novas linhas na tabela de gatilhos.

Além do inserted tabela, o SQL Server também cria e mantém um deleted tabela. Uma transação de atualização é semelhante a uma operação de exclusão seguida por uma operação de inserção; as linhas antigas são copiadas para o deleted tabela primeiro e, em seguida, as novas linhas são copiadas para a tabela de gatilho e para o inserted tabela.

Um gatilho para a coluna "Data de criação"


Usando um DEFAULT restrição é uma maneira prática de criar o valor inicial, mas você corre o risco de que alguém possa atualizar diretamente esse valor mais tarde.

Se você vir isso como um problema, poderá modificar o gatilho para incluir a coluna "Data de criação", para que ele redefina seu valor original sempre que houver uma atualização na linha.

Você pode obter o valor original do deleted table, visto que as linhas antigas são copiadas para esta tabela primeiro, antes que qualquer atualização ocorra.