Microsoft SQL Server - Triggers

Conceitos

As triggers são fundamentais para manutenção da integridade das informações do servidor, especialmente para implementar regras de negócio complexas diretamente no servidor sql que não possam ser 'burladas' nunca.

Por exemplo, ao inserir uma venda podemos criar uma 'constraint' ( regra ou limitação ) que o produto deve existir na tabela de produtos. Para uma regra simples as constraints funcionam bem. Contudo há situações complexas como, por exemplo, a venda só pode ser feita se houver produto no estoque. Aí a constraint pura deverá se tornar mais complexa e, dependendo da regra de negócio, a constraint não será suficientemente capaz de atender.

As triggers são muito úteis para criar 'eventos' quando um dado é inserido, eliminado, alterado numa tabela. É sempre resposta a alteração ou do dado ou da estrutura da tabela.

Note que as triggers irão executar uma tarefa complementar a atual ou mesmo cancelar a tarefa atual por encontrar uma regra que impossibilita a tarefa. O mais importante, de maneira automática sem que ninguém sequer saiba que ela foi executada

Note que, por outro lado, uma trigger pode dificultar e muito a depuração de um processo porque ninguém sabe se a trigger foi executada com sucesso ou se deu erro nela. Eu já peguei situações em empresas que uma analista perdia 2 dias para depurar um erro numa tarefa até descobrir que uma trigger que ela nem sabia que existia deu erro e melou o processo dela que não conseguia tratar o erro da trigger. Sem um log de processos isso se torna um inferno.

Criação de um Trigger

Abaixo estou criando uma trigger que envia um email quando alguém altera o estoque da empresa. Note que ele usa o SQL Mail para enviar o email e não é muito legal porque não informa qual alteração foi feita. Normalmente não fazemos esse tipo de trigger mas sim uma transaction tipo débito / crédito.

    CREATE TRIGGER estoque_alteracao
    ON stock
    AFTER INSERT, UPDATE
    AS BEGIN
        EXEC msdb.dbo.sp_send_dbmail
            @profile_name = ‘E-mail do Estoque’,
            @recipients = ‘supervisor@estoque.com.br’,
            @body = ‘Alguém alterou o inventório.’,
            @subject = ‘Notificação de alteração’ ;
    END