Fala pessoal,
Nesse post vamos responder a seguinte pergunta:
“A Trigger executa uma vez para cada linha alterada?”
(A) SIM
(B) NÃO
Antes de continuar a leitura do post, pensa aí na sua resposta OK.
Trigger (ou gatilhos) – O que é? Pra que serve?
Em primeiro lugar, vamos explicar rapidamente o que é uma Trigger.
É um tipo especial de procedimento armazenado executado AUTOMATICAMENTE quando um evento ocorre no servidor de banco de dados. Podem ser de alguns tipos diferentes: DML, DDL ou Logon.
Os gatilhos DML são executados quando um usuário tenta modificar dados por meio de um evento DML (linguagem de manipulação de dados). Os eventos DML são instruções INSERT, UPDATE ou DELETE que são executadas em uma tabela.
Segue abaixo o link da documentação oficial da Microsoft com mais detalhes:
Portanto, podemos utilizar uma trigger que será acionada quando um determinado evento (INSERT, UPDATE, DELETE) acontecer em uma tabela.
“Mas pra que vou utilizar isso Luiz? Qual a utilidade da Trigger?”
Ela pode ser útil para garantir que uma determinada verificação seja feita quando um evento acontecer.
Mas tome bastante CUIDADO!!! Pois as triggers podem afetar seriamente a performance em tabelas que recebem muitas transações!
Outra dica é evitar criar triggers gigantes, ou seja, que possuem muitas validações e executam muito código. Quanto mais complexo ela ficar, mais pode demorar! #ficaadica
Exemplo:
Agora vamos para a parte prática!
OBS: Queria fazer um agradecimento especial ao David Styveen por ceder o script desse caso que foi utilizado para explicar uma dúvida para um dos nossos clientes na Power Tuning. Obrigado man! =)
Vamos criar três tabelas:
- ExTrigger: Iremos fazer um INSERT nessa tabela para acionar a TRIGGER.
- ExTriggerVariavel: Dentro da Trigger, iremos fazer um INSERT nessa tabela usando uma variável.
- ExTriggerBatch: Dentro da Trigger, iremos fazer um INSERT nessa tabela usando um bloco (Batch Mode).
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 |
USE Traces IF (OBJECT_ID ('ExTrigger') IS NOT NULL) DROP TABLE ExTrigger CREATE TABLE ExTrigger ( id INT NOT NULL, coluna VARCHAR(10) ); IF (OBJECT_ID ('ExTriggerVariavel') IS NOT NULL) DROP TABLE ExTriggerVariavel CREATE TABLE ExTriggerVariavel ( id INT NOT NULL, coluna VARCHAR(10) ); IF (OBJECT_ID ('ExTriggerBatch') IS NOT NULL) DROP TABLE ExTriggerBatch CREATE TABLE ExTriggerBatch ( id INT NOT NULL, coluna VARCHAR(10) ); GO |
- Observações:
- O “SELECT * FROM inserted” irá retornar TODAS as linhas que foram inseridas na tabela “ExTrigger”.
- Repare que na “TABELA 1” nós utilizamos uma VARIÁVEL e depois fazemos o insert na tabela “ExTriggerVariavel”, ou seja, iremos inserir apenas uma linha.
- Repare que na “TABELA 2” nós utilizamos um BLOCO para fazer o insert na tabela “ExTriggerBatch”, ou seja, iremos inserir todas as linhas (batch mode).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
GO CREATE TRIGGER trg_ExTrigger ON ExTrigger AFTER INSERT AS -- TABELA 1: USANDO VARIÁVEL (ROW MODE) DECLARE @id int , @coluna VARCHAR(10) SELECT @id = id, @coluna = coluna FROM inserted INSERT INTO ExTriggerVariavel (id, coluna) VALUES (@id, @coluna) -- TABELA 2: INSERINDO EM LOTE (BATCH MODE) INSERT INTO ExTriggerBatch SELECT * FROM inserted GO |
1 2 |
INSERT INTO ExTrigger VALUES(1, 'A'),(2, 'B'),(3, 'C'),(4, 'D'),(5, 'E') |
1 2 3 4 5 |
select * from ExTrigger order by id select * from ExTriggerVariavel order by id select * from ExTriggerBatch order by id |
“Ué Luiz, não entendi! Porque a variável não inseriu todas as linhas também na tabela ExTriggerVariavel???”
Pois é, fizemos esse exemplo para explicitar justamente esse comportamento do SQL Server!
A Trigger é executada APENAS UMA VEZ após o INSERT, ou seja, ela NÃO executa uma vez para cada linha alterada!
Portanto, a RESPOSTA para a pergunta inicial é a letra “(B) NÃO”!!!
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
Pingback: Dicas T-SQL – A Trigger também faz ROLLBACK? – Luiz Lima
Olá Luiz.
Como sabe, a implementação de procedimento de gatilho (“trigger”) no sql server é diferente de outros gerenciadores de bancos de dados, onde alguns processam linha a linha (“for each row”). No seu dia a dia de consultoria em sql server provavelmente deve se deparar com códigos sql de gatilhos que, infelizmente, foram construídos de forma errada.
Um dos primeiros artigos publicados no Porto SQL foi justamente o “Armadilhas na programação de procedimentos de gatilho” no qual constam casos de programação incorreta e sugestões de correção.
Olá José, blz?
Obrigado por complementar as informações! No dia a dia pego bastante problema de performance envolvendo triggers sim =(
Se puder, compartilha o link ai do post do seu Blog também OK?
Abraço,
Luiz Vitor