Escolar Documentos
Profissional Documentos
Cultura Documentos
www.devmedia.com.br
[versão para impressão]
Link original: http://www.devmedia.com.br/articles/viewcomp.asp?comp=28194
Receba notificações :)
real.
Muitas vezes, quando desenvolvemos aplicações com acesso a bancos de dados,
utilizamos estes apenas como depósito de informações, sem explorar
completamente os recursos que eles nos oferecem.
Alguns SGBDs (Sistemas Gerenciadores de Bancos de Dados) dispõem de diversas
funcionalidades que, se utilizadas corretamente, podem trazer diversos benefícios,
tais como:
Maior facilidade na manutenção do sistema depois de implantando em
ambiente de produção;
Ganho de desempenho, quando o banco de dados encontrase em um
servidor com boa capacidade de hardware;
Possibilidade de maior atuação de um DBA (Administrador de Banco de
Dados) no desenvolvimento e manutenção do sistema;
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=28194 1/7
26/04/2017 Triggers no SQL Server: teoria e prática aplicada em uma situação real
Os triggers são um ótimo exemplo desse tipo de funcionalidade que nem sempre é
aproveitado pelos desenvolvedores, muitas vezes por não conhecerem ou
entenderem o funcionamento dessas estruturas ou por dificuldade com a
programação no banco de dados (no caso do SQL Server, utilizando a chamada T
SQL).
Um gatilho está intimamente relacionado a uma tabela, sempre que uma dessas
ações é efetuada sobre essa tabela, é possível disparálo para executar alguma
tarefa.
Neste artigo veremos como trabalhar com triggers no SQL Server, através de um
Receba notificações :)
exemplo que simula uma situação real, para facilitar o entendimento.
A sintaxe para criação de um trigger é a seguinte:
Listagem 1: Sintaxe de criação de trigger no SQL Server
CREATE TRIGGER [NOME DO TRIGGER]
ON [NOME DA TABELA]
[FOR/AFTER/INSTEAD OF] [INSERT/UPDATE/DELETE]
AS
‐‐CORPO DO TRIGGER
Os parâmetro são:
NOME DO TRIGGER: nome que identificará o gatilho como objeto do banco de
dados. Deve seguir as regras básicas de nomenclatura de objetos.
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=28194 2/7
26/04/2017 Triggers no SQL Server: teoria e prática aplicada em uma situação real
NOME DA TABELA: tabela à qual o gatilho estará ligado, para ser disparado
mediante ações de insert, update ou delete.
FOR/AFTER/INSTEAD OF: uma dessas opções deve ser escolhida para definir
o momento em que o trigger será disparado. FOR é o valor padrão e faz com
o que o gatilho seja disparado junto da ação. AFTER faz com que o disparo se
dê somente após a ação que o gerou ser concluída. INSTEAD OF faz com que
o trigger seja executado no lugar da ação que o gerou.
INSERT/UPDATE/DELETE: uma ou várias dessas opções (separadas por
vírgula) devem ser indicadas para informar ao banco qual é a ação que
disparará o gatilho. Por exemplo, se o trigger deve ser disparado após toda
inserção, devese utilizar AFTER INSERT.
O entendimento de toda essa sintaxe, bem como do funcionamento dos triggers
será facilitado quando desenvolvermos um exemplo próximo de um cenário real,
conforme faremos a seguir.
Exemplo prático
Para exemplificar o uso de gatilhos, tomaremos como cenário uma certa aplicação
Receba notificações :)
financeira que contém um controle de caixa e efetua vendas. Sempre que forem
registradas ou excluídas vendas, essas operações devem ser automaticamente
refletidas na tabela de caixa, aumentando ou reduzindo o saldo.
Vamos então criar as tabelas que utilizaremos neste exemplo e inserir o primeiro
registro no caixa.
Listagem 2: Criando as tabelas do exemplo
CREATE TABLE CAIXA
(
DATA DATETIME,
SALDO_INICIAL DECIMAL(10,2),
SALDO_FINAL DECIMAL(10,2)
)
GO
INSERT INTO CAIXA
VALUES (CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE(), 103)), 100, 100)
GO
CREATE TABLE VENDAS
(
DATA DATETIME,
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=28194 3/7
26/04/2017 Triggers no SQL Server: teoria e prática aplicada em uma situação real
CODIGO INT,
VALOR DECIMAL(10,2)
)
GO
Por lógica, o saldo final do caixa começa igual ao saldo inicial.
Criemos então o primeiro trigger sobre a tabela de vendas, que irá reduzir o saldo
final do caixa na data da venda quando uma venda for inserida.
Listagem 3: Trigger no insert na tabela de vendas
CREATE TRIGGER TGR_VENDAS_AI
ON VENDAS
FOR INSERT
AS
BEGIN
DECLARE
@VALOR DECIMAL(10,2),
@DATA DATETIME
SELECT @DATA = DATA, @VALOR = VALOR FROM INSERTED
Receba notificações :)
UPDATE CAIXA SET SALDO_FINAL = SALDO_FINAL + @VALOR
WHERE DATA = @DATA
END
GO
Nesse trigger utilizamos uma tabela temporária chamada INSERTED. Essa tabela
existe somente dentro do trigger e possui apenas uma linha, contendo os dados do
registro que acabou de ser incluído. Assim, fazemos um select sobre essa tabela e
passamos o valores de suas colunas para duas variáveis internas, @VALOR e
@DATA, que são utilizadas posteriormente para realizar o update na tabela de
caixa.
O que fazemos é atualizar o saldo final da tabela caixa, somando o valor da venda
cadastrada, no registro cuja data seja igual à data da venda (lógica de negócio
simples).
Como sabemos que o saldo final da tabela caixa encontrase com o valor 100,00,
podemos testar o trigger inserindo um registro na tabela vendas. Vamos então
executar a seguinte instrução SQL e observar seu resultado.
Listagem 4: Inserindo uma venda
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=28194 4/7
26/04/2017 Triggers no SQL Server: teoria e prática aplicada em uma situação real
INSERT INTO VENDAS
VALUES (CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE(), 103)), 1, 10)
Inserimos uma venda com a data atual, o código 1 e o valor 10,00. Seguindo a
lógica definida, o saldo final do caixa agora deverá ser 110,00.
Podemos conferir isso executando um select sobre a tabela CAIXA e observando o
resultado, conforme ilustra a Figura 1.
Figura 1: Tabela caixa após a inserção da primeira venda
Agora precisamos criar um trigger para a instrução de delete, que irá devolver o
Receba notificações :)
valor ao caixa quando uma venda for excluída.
Listagem 5: Trigger no delete na tabela vendas
CREATE TRIGGER TGR_VENDAS_AD
ON VENDAS
FOR DELETE
AS
BEGIN
DECLARE
@VALOR DECIMAL(10,2),
@DATA DATETIME
SELECT @DATA = DATA, @VALOR = VALOR FROM DELETED
UPDATE CAIXA SET SALDO_FINAL = SALDO_FINAL ‐ @VALOR
WHERE DATA = @DATA
END
GO
Dessa vez utilizamos a tabela temporária DELETED, que funciona da mesma forma
que a INSERTED já citada, porém com os dados do registro que está sendo
excluído, em operações de delete e update.
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=28194 5/7
26/04/2017 Triggers no SQL Server: teoria e prática aplicada em uma situação real
Nota: em operações de upate, o que ocorre na prática é uma exclusão do registro
antigo seguida da inserção de um novo registro com os dados atualizados. Então,
em triggers para a operação de update podemos utilizar tanto a tabela DELETED
quanto a INSERTED.
Podemos agora excluir o registro da tabela VENDAS e verificar como o saldo do
caixa é atualizado (deve voltar ao valor 100,00, devido ao cancelamento da venda
de 10,00).
Listagem 6: Excluindo uma venda
DELETE FROM VENDAS WHERE CODIGO = 1
GO
Listando os registros da tabela CAIXA podemos ver que o saldo final foi atualizado,
tendo sido subtraído dele o valor 10,00, conforme esperado (Figura 2).
Vemos então que ambos os triggers estão funcionando como esperado, sendo
disparados com as operações de insert e delete da tabela de vendas.
Conclusão
Com este exemplo bastante simples é possível perceber um ponto muito
importante da utilização de triggers para automatização de certas ações. Por
exemplo, o programador responsável por esta parte do sistema poderia optar,
antes de ler este artigo, por atualizar a tabela de caixa manualmente após cada
operação na tabela vendas, utilizando sua linguagem de programação de
preferência. Agora, ele apenas precisará se preocupar com o registro e
cancelamento da venda, pois a atualização da tabela de caixa será feita
automaticamente pelo próprio banco de dados.
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=28194 6/7
26/04/2017 Triggers no SQL Server: teoria e prática aplicada em uma situação real
Com isso, o sistema em si, ou seja, o aplicativo, tende a ficar mais leve, pois parte
da responsabilidade de execução de algumas tarefas foi transferida para o servidor
de banco de dados.
Apesar de breve, este artigo buscou apresentar os principais pontos sobre o uso de
triggers no SQL Server, apresentando um exemplo prático bastante próximo a uma
situação real, com o objetivo de facilitar o entendimento.
Caso surjam dúvidas, críticas ou sugestões, a seção de comentários está aberta
logo abaixo.
Links
Create trigger, MSDN
Leia também
Desenvolvendo Triggers em SQL Server, Oracle, Firebird e Postgres
Receba notificações :)
por Joel Rodrigues
Banco de dados & BigData expert
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=28194 7/7