Dicas T-SQL – A Trigger executa uma vez para cada linha alterada?

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:

https://docs.microsoft.com/pt-br/sql/t-sql/statements/create-trigger-transact-sql?view=sql-server-ver15

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).
Agora vamos criar a TRIGGER do tipo AFTER INSERT, ou seja, ela será acionada após o INSERT na tabela “ExTrigger”.

  • 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).
Então vamos executar o INSERT que irá acionar a trigger.
Por fim, vamos conferir o resultado:

“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

3 comentários em “Dicas T-SQL – A Trigger executa uma vez para cada linha alterada?

  1. Pingback: Dicas T-SQL – A Trigger também faz ROLLBACK? – Luiz Lima

  2. José Dız (Porto SQL) Responder

    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.

    • Luiz Lima Autor do postResponder

      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

Deixe uma resposta para Luiz LimaCancelar resposta