Fala pessoal,
Nesse post vamos responder a seguinte pergunta:
“A Trigger também faz ROLLBACK?”
(A) SIM
(B) NÃO
Antes de continuar a leitura do post, pensa aí na sua resposta OK.
Trigger x Rollback
No post anterior também falei um pouco sobre Trigger com uma dica muito bacana. Se você não viu, #ficaadica
https://luizlima.net/dicas-t-sql-a-trigger-executa-uma-vez-para-cada-linha-alterada/
Hoje vou compartilhar mais uma dica que pode ser uma dúvida de muitas pessoas:
“A Trigger também faz ROLLBACK?”
Então vamos para o nosso exemplo! #gogogo
Exemplo:
Vamos criar uma tabela “Produto” e outra tabela de auditoria chamada “LogAlteracao”.
Depois colocar uma trigger de UPDATE na tabela “Produto”, que vai inserir o valor antigo na tabela “LogAlteracao”.
OBS: Repare que na trigger utilizei o “deleted” para pegar o valor antigo. Se eu quisesse utilizar os novos valores, bastaria utilizar o “inserted”.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
USE Traces IF (OBJECT_ID ('Produto') IS NOT NULL) DROP TABLE Produto CREATE TABLE Produto ( id_produto INT identity(1,1) NOT NULL, nome_produto VARCHAR(100) ); IF (OBJECT_ID ('LogAlteracao') IS NOT NULL) DROP TABLE LogAlteracao CREATE TABLE LogAlteracao ( id_log INT identity(1,1) NOT NULL, id_produto INT, dt_alteracao DATETIME, nome_produto VARCHAR(100) ); GO CREATE TRIGGER trg_Produto ON Produto AFTER UPDATE AS INSERT INTO LogAlteracao (dt_alteracao, id_produto, nome_produto) SELECT GETDATE(), id_produto, nome_produto FROM deleted GO |
Agora vamos inserir alguns registros na tabela “Produto”. Repare que a tabela “LogAlteracao” permanece vazia, pois ainda não fizemos nenhum UPDATE.
1 2 3 4 5 |
INSERT INTO Produto VALUES('Iphone 25'),('Samsung Galaxy'),('Nokia Tijolo'),('Motorola V3'),('LG Comprou Travou') SELECT * FROM Produto SELECT * FROM LogAlteracao |
Agora vamos fazer um UPDATE!!!
Repare que ao executar o UPDATE, o SQL Server informou que uma linha foi afetada pelo UPDATE na tabela “Produto” e que mais uma linha foi afetada com o INSERT na tabela “LogAlteracao”, que foi feito pela trigger.
A tabela “LogAlteracao” armazenou o valor antigo “Iphone 25” e a tabela “Produto” ficou com o valor atualizado “Iphone 13”.
1 2 3 4 5 6 7 8 9 10 11 |
update Produto set nome_produto = 'Iphone 13' where nome_produto = 'Iphone 25' /* (1 row affected) (1 row affected) */ SELECT * FROM Produto SELECT * FROM LogAlteracao |
Até aqui tudo beleza. Agora vamos abrir uma transação com o BEGIN TRAN e fazer um novo UPDATE.
Repare que o nome do produto foi alterado na tabela “Produto” e mais uma linha foi inserida na tabela “LogAlteracao”.
1 2 3 4 5 |
BEGIN TRAN update Produto set nome_produto = 'Motorola Moto G' where nome_produto = 'Motorola V3' |
Agora eu te pergunto: se eu fizer um ROLLBACK, ele também irá desfazer o INSERT da trigger na tabela “LogAlteracao”???
1 2 3 4 |
ROLLBACK SELECT * FROM Produto SELECT * FROM LogAlteracao |
Como podemos ver, a TRIGGER faz SIM o ROLLBACK também!!! Pois o ROLLBACK voltou o valor antigo na tabela “Produto” e removeu a última linha da tabela “LogAlteracao”.
Logo, a RESPOSTA é a letra “(A) SIM”!!!
Espero que tenha gostado e que isso também possa ser útil no seu dia a dia. Até o próximo post!
Me siga no LinkedIn e YouTube para ficar por dentro das novidades.
Abraço,
Luiz Vitor França Lima
Consultor SQL Server