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.