Triggers no SQL Server: Conceitos, Tipos e Impacto no Desempenho


Introdução
Triggers (gatilhos) no SQL Server são objetos de banco de dados que contém código T-SQL executado automaticamente em resposta a determinados eventos no servidor. Diferentemente de stored procedures, não podemos invocar uma trigger diretamente – ela é disparada de forma indireta, pelo próprio SQL Server, quando ocorre o evento associado. Por exemplo, ao inserir, atualizar ou deletar dados em uma tabela que possua uma trigger, o SQL Server concluirá a operação e então executará o código da trigger automaticamente.
Triggers são frequentemente utilizadas para automatizar tarefas como auditoria de mudanças, reforço de regras de negócio ou manutenção de dados derivados. No entanto, seu uso é cercado de debate devido a potenciais impactos no desempenho da aplicação. Neste post, vamos entender o que são triggers, quais os tipos existentes no SQL Server (com foco nas DML triggers de dados), apresentar um exemplo de trigger de auditoria e discutir principais problemas de desempenho relacionados a triggers – incluindo triggers aninhadas, triggers recursivas e implementações ineficientes com cursor. Por fim, veremos um comparativo de desempenho entre cenários com e sem trigger, e destacaremos recomendações de boas práticas para o uso de triggers.
O que são Triggers no SQL Server?
Uma trigger nada mais é do que um objeto de programação associado a um evento específico no banco de dados. Ela armazena um conjunto de comandos (T-SQL) que podem incluir lógica condicional (IF/ELSE
), loops (WHILE
), cursores, chamadas de funções, etc., semelhante a uma stored procedure. A diferença é que uma trigger é executada automaticamente pelo SQL Server quando um evento ocorre, não sendo chamada manualmente pelo usuário.
Em outras palavras, triggers são “gatilhos” que disparam ações em resposta a eventos. Esses eventos podem ser de diversos tipos, conforme veremos a seguir, mas os mais comuns são mudanças em dados (inserções, atualizações ou deleções em tabelas). Ao ocorrer o evento, o SQL Server aciona a trigger relacionada como parte da mesma transação, executando o código definido. Isso permite, por exemplo, auditar modificações ou impedir certas ações automaticamente, sem depender de lógica na aplicação.
Tipos de Triggers no SQL Server
O SQL Server oferece três categorias principais de triggers:
Triggers DML (Data Manipulation Language): Disparadas por eventos de modificação de dados nas tabelas, ou seja, comandos
INSERT
,UPDATE
ouDELETE
. São triggers definidas em tabelas (ou views) que executam após ou em vez de operações de modificação. As triggers DML são o foco principal deste artigo, pois impactam diretamente o fluxo de transações das aplicações (inserções e atualizações ocorrem com frequência). Exemplo de uso: manter um log de auditoria sempre que uma linha for inserida/alterada em certa tabela.AFTER/FOR triggers: São as triggers DML tradicionais que executam após a operação DML ocorrer. Os termos “AFTER” e “FOR” são sinônimos no contexto de triggers no SQL Server. Você pode criar triggers separadas para cada tipo de operação (uma só para INSERT, outra para UPDATE, etc.) ou uma única trigger que trate múltiplos eventos (por exemplo, INSERT e UPDATE juntos). Em uma trigger AFTER, primeiro a modificação é aplicada na tabela, e depois a trigger é executada automaticamente.
INSTEAD OF triggers: São triggers DML que executam no lugar da operação de modificação. Ou seja, quando uma trigger INSTEAD OF está presente, o SQL Server não executa o comando original (INSERT/UPDATE/DELETE) na tabela; quem realiza a ação desejada deve ser a própria lógica dentro da trigger. Esse tipo de trigger é geralmente usado em views, para viabilizar operações de atualização em views complexas (por exemplo, views que unem várias tabelas) que normalmente não seriam diretamente atualizáveis. Com uma trigger INSTEAD OF, podemos interceptar o comando e direcionar a inserção/atualização para as tabelas corretas dentro da view, conforme a lógica necessária. Em resumo: a trigger INSTEAD OF dispara automaticamente antes do SQL Server tentar executar o comando na tabela/view, e substitui a execução padrão pela lógica definida na trigger.
Triggers DDL (Data Definition Language): Disparadas por eventos de definição/alteração de estrutura no banco de dados, como comandos
CREATE
,ALTER
ouDROP
de objetos (tabelas, procedures, databases, etc.). Essas triggers podem ser definidas no âmbito do banco de dados ou do servidor. São úteis para auditoria de mudanças de schema ou para impor políticas corporativas. Exemplo de uso: registrar em uma tabela de log sempre que uma tabela nova for criada ou impedir a criação de objetos que não sigam um determinado padrão de nomenclatura. Diferentemente das triggers DML, as triggers DDL não afetam diretamente o desempenho das transações de usuário final (já que operações DDL são menos frequentes em ambiente de produção típico).Triggers de Logon: Disparadas sempre que ocorre um evento de login na instância do SQL Server (uma nova sessão sendo estabelecida). Elas são configuradas no nível da instância e podem ser usadas, por exemplo, para controlar ou auditar acessos. Exemplo de uso: rejeitar conexões de usuários que tentem acessar o SQL Server via certas aplicações não autorizadas, ou registrar informações sobre cada conexão estabelecida. Por ser acionada a cada login, deve-se ter parcimônia e eficiência ao usar este tipo de trigger para não degradar o processo de autenticação dos usuários.
Neste post, concentraremos nossa análise nas triggers DML, pois são elas que geralmente trazem impacto direto no desempenho das aplicações transacionais. A seguir, veremos um exemplo prático de trigger DML de auditoria e, em seguida, exploraremos os desafios de performance envolvidos.
Exemplo: Trigger de Auditoria (INSERT/UPDATE)
Uma aplicação comum de triggers DML é a auditoria de dados. Ou seja, manter um registro automático de alterações feitas em uma tabela, gravando quem fez a mudança, quando, e quais dados foram inseridos/alterados. Vamos demonstrar a criação de uma trigger de auditoria simples para operações de INSERT
e UPDATE
em uma tabela de clientes.
Suponha que temos uma tabela Customer
com dados de clientes, e queremos auditar quaisquer inserções ou atualizações feitas nela, armazenando as informações em uma tabela de log (AuditCustomer
). Primeiro, precisamos da tabela de auditoria:
/**************************************
Cria tabela Customer a partir do
Banco AdventureWorksLT
***************************************/
IF object_id('dbo.Customer') is not null
DROP TABLE dbo.Customer
SELECT c.CustomerID as CustomerID,FirstName,MiddleName,Lastname,CompanyName,
dateadd(d,-CustomerID,getdate()) DataCadastro
INTO dbo.Customer
FROM AdventureWorksLT.SalesLT.Customer c
/*******************************
Cria tabela de Auditoria
********************************/
CREATE TABLE dbo.AuditCustomer (
AuditCustomer_ID INT IDENTITY(1,1) PRIMARY KEY,
TipoAtualizacao VARCHAR(20) NOT NULL,
UserLogin VARCHAR(100) NULL,
Host VARCHAR(100) NULL,
CustomerID INT NOT NULL,
FirstName NVARCHAR(50) NOT NULL,
MiddleName NVARCHAR(50) NULL,
LastName NVARCHAR(50) NULL,
CompanyName NVARCHAR(128) NULL,
DataCadastro DATETIME NULL
);
A coluna TipoAtualizacao
indicará se a operação foi um INSERT ou UPDATE. As colunas UserLogin
e Host
poderão gravar o usuário (login) que realizou a alteração e o nome da máquina/host de origem – utilizando funções T-SQL como SYSTEM_USER
e HOST_NAME()
dentro da trigger. As demais colunas armazenam a imagem dos dados do cliente alterado.
Agora, criamos a trigger de auditoria na tabela Customer
:
CREATE OR ALTER TRIGGER trg_Customer_Audit
ON dbo.Customer
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @TipoAtualizacao VARCHAR(20);
IF EXISTS (SELECT 1 FROM deleted)
SET @TipoAtualizacao = 'UPDATE';
ELSE
SET @TipoAtualizacao = 'INSERT';
INSERT INTO dbo.AuditCustomer
(TipoAtualizacao, UserLogin, Host,
CustomerID, FirstName, MiddleName, LastName, CompanyName, DataCadastro)
SELECT
@TipoAtualizacao,
SYSTEM_USER, -- usuário que realizou a operação
HOST_NAME(), -- host de origem da conexão
CustomerID, FirstName, MiddleName, LastName, CompanyName, DataCadastro
FROM inserted;
END;
Como essa trigger funciona? Sempre que um INSERT ou UPDATE for executado em dbo.Customer
, o SQL Server irá acioná-la automaticamente após a operação principal concluir (porque usamos AFTER
). Dentro do código da trigger, usamos as tabelas lógicas inserted
e deleted
, disponibilizadas pelo SQL Server para triggers DML.
Em um
INSERT
, a tabelainserted
contém as novas linhas inseridas, enquantodeleted
estará vazia (nenhuma linha foi removida em um insert).Em um
UPDATE
, a tabelainserted
contém as novas versões dos registros alterados, edeleted
contém as versões antigas (valores antes da atualização).
A trigger acima aproveita esse comportamento: verifica se deleted
tem alguma linha para distinguir se foi UPDATE (nesse caso deleted
não está vazia) ou INSERT. Define a variável @TipoAtualizacao
adequadamente e, então, insere na tabela de auditoria todas as linhas que sofreram mudança, obtendo os valores novos de cada coluna diretamente da pseudo-tabela inserted
. Note que, dessa forma, tratamos múltiplas linhas de uma só vez – se a instrução inserir/atualizar 10 registros de uma vez, a trigger insere os 10 registros de auditoria em um único comando INSERT...SELECT
. Isso é fundamental para eficiência, pois triggers disparam por operação, não por linha, e devem ser escritas para lidar com operações em lote corretamente.
Teste rápido: Após criar a trigger, experimente inserir ou atualizar registros na tabela Customer
. Por exemplo:
-- Inserir um novo cliente (dispara trigger para auditoria de INSERT)
INSERT INTO dbo.Customer (FirstName, MiddleName, LastName, CompanyName, DataCadastro)
VALUES ('Jose', 'M.', 'da Silva', 'XPTO SA', GETDATE());
-- Atualizar um cliente existente (dispara trigger para auditoria de UPDATE)
UPDATE dbo.Customer
SET CompanyName = 'XPTO Ltda.'
WHERE CustomerID = 30119;
Em seguida, consulte a tabela AuditCustomer
e verifique que os eventos foram registrados com sucesso, incluindo o tipo de atualização e os dados inseridos/alterados. Esse padrão de trigger de auditoria é bastante útil para rastrear alterações automaticamente no banco de dados, sem depender de codificação na aplicação.
(Observação: também poderíamos criar triggers semelhantes para capturar deleções, ou usar triggers INSTEAD OF em views, mas nos ateremos ao cenário acima para foco.)
Principais Problemas de Desempenho com Triggers
Triggers proporcionam automatização poderosa, porém trazem considerações importantes de desempenho. Ao executar uma operação DML, todo o código da trigger associada roda sob o mesmo contexto e transação da operação original – ou seja, o usuário que fez um simples INSERT
pode ter que esperar, sem perceber, o tempo de execução da trigger que foi disparada. A seguir, discutimos os principais fatores que podem tornar triggers prejudiciais ao desempenho:
1. Triggers Aninhadas (Encadeadas): Este é um cenário comum em ambientes corporativos complexos: uma trigger em determinada tabela realiza operações que acabam por disparar outras triggers em outras tabelas, formando uma cascata de execuções. Por exemplo: suponha a Tabela A com uma trigger que, após um INSERT, realiza um UPDATE
em Tabela B; porém, Tabela B também tem uma trigger após UPDATE que insere dados em Tabela C. Neste caso, uma única inserção inicial acaba acionando três eventos: a trigger da Tabela A, que por sua vez aciona a trigger da Tabela B, que então aciona a da Tabela C. Do ponto de vista do usuário que fez o INSERT original, a operação pode demorar muito mais que o esperado, pois ele estará, sem saber, aguardando a conclusão de várias triggers em sequência.
O SQL Server permite triggers aninhadas até um limite de 32 níveis de encadeamento. Se uma 33ª trigger tentar disparar na cascata, o SQL Server abortará a transação e lançará um erro, revertendo todas as operações (inclusive a ação inicial). Portanto, é fácil imaginar a dor de cabeça que uma rede de triggers mal planejada pode causar – desde deadlocks e contenção elevada, até falhas completas de transações se o limite for excedido.
Como mitigar? Antes de tudo, evite depender de lógica distribuída em múltiplas triggers encadeadas. Prefira consolidar operações relacionadas em procedimentos controlados, se possível, ao invés de acoplá-las por meio de gatilhos disparando outros gatilhos. Documente bem as triggers existentes e quais tabelas/colunas elas afetam, para que a equipe tenha visibilidade dessas dependências ocultas e não crie, sem querer, um laço de triggers aninhadas. Vale citar que há uma opção de configuração global (sp_configure 'nested triggers'
) que permite desabilitar triggers aninhadas na instância inteira; contudo, essa medida drástica afetaria todos os bancos de dados e todas as triggers do servidor. O ideal é controlar no design da solução mesmo – mantenha um mapa claro se houver necessidade de uma trigger mexer em dados de outra tabela que também tenha trigger, para não ser pego de surpresa.
2. Triggers Recursivas: Recursividade em triggers acontece quando uma trigger acaba disparando ela própria novamente, direta ou indiretamente. A recursividade direta seria uma trigger definida em uma tabela que, ao executar, realiza uma operação na mesma tabela, gatilhando assim a sua própria execução outra vez. Se não houver cuidado, isso pode criar um loop infinito – por sorte, o SQL Server vem com triggers recursivas desabilitadas por padrão exatamente para evitar esse tipo de situação. Ou seja, se uma trigger tentar modificar a tabela em que ela mesma atua, essa segunda execução não ocorre automaticamente (a não ser que a opção de Recursive Triggers do banco esteja habilitada manualmente).
Já a recursividade indireta envolve duas (ou mais) triggers em tabelas diferentes chamando-se mutuamente – por exemplo, a Trigger A na Tabela X faz um UPDATE na Tabela Y; a Trigger B na Tabela Y (disparada pelo UPDATE) faz por sua vez um UPDATE/INSERT na Tabela X. Embora cada não dispare a si própria diretamente, juntas elas formam um ciclo recursivo. Esse cenário normalmente é um acidente de design e pode ser bastante perigoso, pois se a recursão não for interrompida, pode teoricamente se encadear até o limite de 32 níveis também. Assim como em triggers aninhadas, se uma recursão tentar passar do limite, a transação é abortada. Para casos necessários de recursão direta (quando habilitada), pode-se usar funções como TRIGGER_NESTLEVEL()
dentro da trigger para checar em que nível de chamada ela está e decidir se deve prosseguir ou não, servindo como condição de saída do loop recursivo. Contudo, na prática deve-se evitar ao máximo triggers recursivas, mantendo a lógica de negócio de forma que atualizações circulares não sejam necessárias. Na dúvida, deixe a opção de recursividade desabilitada (padrão) e busque outras estratégias para as atualizações interdependentes.
3. Implementações Ineficientes (uso de CURSOR): Talvez o problema de desempenho mais observado em código de trigger é a forma como se tratam múltiplas linhas afetadas por uma operação em lote. Conforme mencionado, triggers DML executam uma vez por instrução SQL, mesmo que esta instrução afete milhares de linhas. Dentro da trigger, o desenvolvedor precisa lidar com as pseudo-tabelas inserted
/deleted
que podem conter várias linhas. Um erro comum é cair na tentação de usar um CURSOR para iterar linha a linha sobre essas tabelas lógicas. De fato, do ponto de vista de lógica procedural, escrever um loop para tratar cada linha individualmente parece mais simples do que pensar em operações em conjunto (set-based). Muitos vêm de experiências em linguagens de programação e reproduzem esse estilo dentro da trigger – abrindo um cursor e fazendo FETCH
de cada registro para processar. Isso deve ser evitado! Cursors em T-SQL já são conhecidos por seu baixo desempenho, e dentro de triggers eles podem ser desastrosos, pois amplificam o custo de cada operação DML em ordens de grandeza.
O recomendado é sempre que possível escrever o código da trigger de forma vetorizada, usando operações em lote (conjuntas). Em vez de um loop WHILE
inserindo registro por registro em uma tabela de log, faça um único INSERT...SELECT
pegando todos os registros de inserted
/deleted
de uma vez (como ilustrado em nossa trigger de auditoria acima). Dessa forma, o trabalho é delegado ao otimizador do SQL Server que tratá as linhas como conjunto, aplicando otimizações de IO e algoritmos eficientes de acordo com o volume de dados. Na prática, uma trigger bem escrita em modo set-based muitas vezes terá impacto quase imperceptível para pequenos volumes e escala linearmente para volumes maiores; já uma trigger com cursor pode ser aceitável para poucas linhas mas degrada drasticamente conforme o volume cresce, tendendo a comportamento quadrático (ou pior) em termos de tempo de execução.
Resumindo: dentro de triggers, evite lógicas complexas desnecessárias e principalmente evite cursores ou loops row-by-row. Use a “álgebra relacional” a seu favor (operações com conjuntos, junções, filtros set-based).
Comparativo de Desempenho – Sem Trigger vs Trigger Otimizada vs Trigger com Cursor
Para evidenciar o impacto que uma trigger pode ter, especialmente dependendo da sua implementação, vejamos um experimento comparativo. Considere a tabela Cliente
com ~20 milhões de registros (simulando um ambiente com dados volumosos). Vamos executar uma mesma operação de atualização em massa nessa tabela sob três cenários:
Sem trigger nenhuma na tabela.
Com uma trigger de auditoria otimizada, implementada de forma set-based (insere em log todas as mudanças de uma vez).
Com uma trigger de auditoria usando cursor, que insere em log registro por registro.
O teste consiste em rodar um UPDATE
que altera uma coluna (por exemplo, formatar o sobrenome dos clientes em maiúsculo/minúsculo) em todas as 20 milhões de linhas da tabela. Abaixo, as implementações das triggers e os resultados de tempo obtidos:
-- Trigger de auditoria otimizada (AFTER UPDATE em modo set-based)
CREATE OR ALTER TRIGGER Cliente_Audit_Update
ON dbo.Cliente
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO Cliente_Log (ClienteID, Sobrenome_Old, Sobrenome_New, DataAlteracao)
SELECT d.ClienteID, d.Sobrenome AS Sobrenome_Old, i.Sobrenome AS Sobrenome_New, GETDATE()
FROM deleted d
JOIN inserted i ON i.ClienteID = d.ClienteID;
END;
No código acima, após qualquer atualização em Cliente
, inserimos todas as alterações na tabela de log Cliente_Log
de uma vez, usando a junção entre deleted
(valores antigos) e inserted
(valores novos) para cada chave atualizada.
Agora, a versão com cursor (não recomendada):
-- Trigger de auditoria usando CURSOR (evitar em produção)
CREATE OR ALTER TRIGGER Cliente_Audit_Update_Cursor
ON dbo.Cliente
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ClienteID int, @Sobrenome_Old nvarchar(150), @Sobrenome_New nvarchar(150);
DECLARE cur CURSOR FOR
SELECT d.ClienteID, d.Sobrenome, i.Sobrenome
FROM deleted d
JOIN inserted i ON i.ClienteID = d.ClienteID;
OPEN cur;
FETCH NEXT FROM cur INTO @ClienteID, @Sobrenome_Old, @Sobrenome_New;
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO Cliente_Log (ClienteID, Sobrenome_Old, Sobrenome_New, DataAlteracao)
VALUES (@ClienteID, @Sobrenome_Old, @Sobrenome_New, GETDATE());
FETCH NEXT FROM cur INTO @ClienteID, @Sobrenome_Old, @Sobrenome_New;
END;
CLOSE cur;
DEALLOCATE cur;
END;
Essa segunda trigger faz essencialmente a mesma tarefa, porém de forma iterativa: para cada linha alterada na tabela Cliente
, realiza individualmente a inserção do log correspondente. Em nosso teste, atualizar 20 milhões de linhas significa que o loop irá iterar 20 milhões de vezes inserindo registro a registro em Cliente_Log
. A diferença de desempenho é gritante.
Resultados obtidos:
Sem trigger: ~1 minuto e 30 segundos para completar a atualização em massa (baseline, 100% do tempo).
Com trigger otimizada (set-based): ~10 minutos e 36 segundos para a mesma atualização. Ou seja, aproximadamente 7 vezes mais lento que sem trigger. A sobrecarga da trigger é alta porque para cada linha alterada estamos também fazendo uma inserção no log, mas graças à operação em lote, o SQL Server lida de forma mais eficiente (inserindo 20 milhões de registros de log em conjunto).
Com trigger usando cursor: ~21 minutos e 26 segundos para completar. Quase o dobro do tempo da trigger otimizada e cerca de 14 vezes mais lento que a atualização sem trigger! Essa enorme degradação ocorre porque o cursor força o SQL Server a um processamento linha-a-linha custoso 20 milhões de vezes dentro da trigger, perdendo completamente os ganhos de otimização em lote.
Em resumo, o teste acima ilustra que triggers sempre introduzem algum custo, mas uma implementação ineficiente pode tornar esse custo completamente proibitivo. Neste exemplo, o uso do cursor tornou a operação 2x mais lenta que uma versão set-based equivalente, e 14x mais lenta que não usar trigger nenhuma.
Vale ressaltar: mesmo a trigger otimizada, que operou em lote, adicionou um atraso significativo (1.5 min saltando para ~10.5 min). Portanto, antes de decidir usar triggers, é preciso avaliar o impacto e se esse overhead é aceitável no contexto das operações do seu sistema.
Conclusão e Boas Práticas
Triggers no SQL Server são uma ferramenta poderosa, permitindo automatizar auditorias e reforçar integridade lógica no nível do banco de dados. Porém, como vimos, seu uso indevido pode causar graves problemas de desempenho e complexidade oculta. Para usufruir de triggers de forma segura, considere as seguintes boas práticas:
Use triggers somente quando necessário: Avalie se a lógica pode ser implementada de outra forma (por exemplo, em procedures chamadas pela aplicação, ou via features nativas como Output Clause em instruções DML, ou ainda utilizando Temporal Tables para auditoria de histórico). Triggers não devem ser a primeira opção para resolver problemas, pois adicionam complexidade implícita no fluxo de transações.
Mantenha a trigger o mais enxuta possível: Implemente apenas o indispensável dentro da trigger. Evite consultas complexas demais, chamadas a procedimentos externos, ou qualquer operação que possa demorar muito. Lembre-se que a trigger roda dentro da transação do evento – quanto mais lenta ela for, mais tempo a transação fica aberta e segurando locks em tabelas, impactando concorrência.
Escreva código set-based e eficiente: Como enfatizado, nem pense em usar cursor dentro de trigger! Utilize operações em conjunto para manipular os dados de
inserted
/deleted
. Garanta que a lógica considere múltiplas linhas (mesmo que ache que só haverá uma linha, codifique pensando no cenário multi-linha para evitar surpresas). Se precisar filtrar ou juntar com outras tabelas, use comandos vetorizados e bem indexados para minimizar o custo.Evite efeitos cascata não controlados: Tente não projetar triggers que atualizam outras tabelas que possuem suas próprias triggers – isso cria dependências difíceis de manter e pode levar a triggers aninhadas problemáticas. Se for inevitável, documente claramente e teste cenários de cascata. Considere limitar o nível de aninhamento permitido (embora a configuração global afete tudo, algumas empresas optam por manter nested triggers desligado para prevenir abusos).
Cuidado com recursividade: Mantenha a configuração padrão que previne recursão direta. Só ative triggers recursivas se realmente precisar e tenha certeza de implementar condições de saída na trigger para não entrar em loop infinito. Recursividade indireta geralmente indica problema de design – revise a modelagem se identificar triggers chamando umas às outras.
Monitore e teste o desempenho: Se você implementar triggers críticas, teste em volume representativo de dados para verificar o impacto. Monitore em produção métricas como duração de transações, uso de CPU e crescimento do Transaction Log. Uma trigger mal otimizada pode se tornar um gargalo sem que seja imediatamente óbvio, já que do ponto de vista da aplicação a query original é que aparenta estar lenta (quando na verdade o tempo é gasto dentro da trigger).
Em conclusão, triggers não são vilãs por si só, mas exigem parcimônia e zelo na implementação. Em muitos cenários de auditoria e logging, elas resolvem elegantemente problemas que de outra forma demandariam mudanças em diversas aplicações. Apenas fique atento aos pontos discutidos: escrever triggers bem comportadas e gerenciáveis, que trabalhem a favor do desempenho e não contra ele. Seguindo essas orientações, você pode aproveitar o melhor das triggers evitando armadilhas comuns.
Fui, mas volto com mais SQL Server em breve!
✍️ Sobre o autor
O Prof. Landry é especialista em Microsoft SQL Server desde 1999, Microsoft Trainer, Professor Universitário e criador do canal SQL Server Expert no YouTube, com conteúdo técnico semanal para DBAs e profissionais de dados.
🚀 Quer aprender mais sobre SQL Server?
👉 Me acompanhe no LinkedIn e inscreva-se no canal para não perder nenhuma dica prática!
Subscribe to my newsletter
Read articles from SQL Server Expert directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

SQL Server Expert
SQL Server Expert
O Prof. Landry Duailibe é especialista em Microsoft SQL Server desde 1999, Microsoft Certified Trainer, professor universitário e criador do canal SQL Server Expert no YouTube, onde compartilha conteúdo técnico semanal para DBAs e profissionais de dados. Já ajudou milhares de alunos a evoluírem suas habilidades com SQL Server e conquistarem melhores oportunidades na área de dados.