You are on page 1of 6

18/09/13

Com partilhar 0

SQLBURGER: Triggers para iniciantes no SQL Server – Parte 1/3
mais Próximo blog»

SEGUNDA-FEIRA, 6 DE DEZEMBRO DE 2010

TRANSLATOR

Triggers para iniciantes no SQL Server – Parte 1/3
Este artigo se aplica ao Microsoft SQL Server a partir da versão 2000, porém o conceito de triggers se aplica à maioria dos sistemas gerenciadores de bancos de dados do mercado. Warning e x am ple s will

Olá caros sqlnautas. Neste artigo, trarei a vocês algumas dicas importantes sobre TRIGGERS no SQL Server. Este recurso nos possibilita disparar eventos programados ao se inserir, excluir ou alterar dados em uma tabela. Um exemplo de aplicação, que vamos abordar neste tópico, será a criação de uma trigger em uma tabela dos itens de uma nota fiscal. Quando os itens são gravados nesta tabela, automaticamente a trigger irá movimentar o estoque. Lembrando que nesta primeira parte, os scripts de exemplo foram desenvolvidos apenas para ilustrar. Na segunda parte, fornecerei scripts completos para realizar as simulações em seu próprio SQL Server.

FACEBOOK
Fabiano Cores

Criar seu atalho

CONHECENDO A ESTRUTURA DE UMA TRIGGER Uma trigger (gatilho) é um bloco de código T-SQL (como um procedimento) que é executado no momento em que ocorre um INSERT, UPDATE e/ou DELETE na tabela onde foi criada. Vamos então começar visualizando uma trigger. Para abrir uma trigger, podemos faze-lo de duas formas: 1. Localizar a trigger através do Object Explorer do Microsoft SQL Server Management Studio (imagem abaixo), clicar com o botão direito sobre ela e clicar em MODIFY (modificar).
Fabiano on Google+

MEUS SEGUIDOR

Participar d Membros

Google Friend Conn

Já é um membro?

SUBSCRIBE VIA

Subscribe to SQ Email
INSCREVA-SE

Receba no seu e-ma

2. Utilizando o comando sp_helptext

sqlburger.blogspot.com.br/2010/12/triggers-para-iniciantes-no-sql-server.html

1/6

18/09/13

SQLBURGER: Triggers para iniciantes no SQL Server – Parte 1/3

Vamos agora rapidamente olhar um código documentado de uma trigger completa (baixa estoque ao inserir itens na nota):
Code Snippet 1 . C R E A T Et r i g g e rt g i N o t a I t e mo nN o t a I t e m 2 . f o ri n s e r t 3 . a s 4 . b e g i n 5 . 6 . 7 . 8 . 9 . 1 0 . 1 1 . 1 2 . 1 3 . 1 4 . 1 5 . 1 6 . 1 7 . 1 8 . 1 9 . 2 0 . 2 1 . 2 2 . 2 3 . 2 4 . 2 5 . 2 6 . 2 7 . 2 8 . 2 9 . 3 0 . 3 1 . 3 2 . 3 3 . 3 4 . 3 5 . 3 6 . 3 7 . 3 8 . 3 9 . 4 0 . 4 1 . o p e nc u r _ N F _ I t e m d e c l a r ec u r _ N F _ I t e mc u r s o r l o c a lf a s t _ f o r w a r dr e a d _ o n l yf o r s e l e c tc d _ e m p r e s a ,n r _ s e r i e ,n r _ n o t a ,c d _ i t e m ,q t _ f a t u r a d a ,v l _ u n i t a r i o f r o mi n s e r t e d d e c l a r e@ v c d _ e m p r e s a d e c l a r e@ v n r _ s e r i e d e c l a r e@ v n r _ n o t a d e c l a r e@ v c d _ i t e m s m a l l i n t c h a r ( 3 ) i n t c h a r ( 1 3 ) / *At a b e l ai n s e r t e de x i s t e" v i r t u a l m e n t e "d u r a n t e ae x e c u ç ã od eu m at r i g g e r .E l ap o s s u ie x a t a m e n t e am e s m ae s t r u t u r ad at a b e l ad at r i g g e r ,ec o n t e m t o d o so sr e g i s t r o si n s e r i d o sn oe v e n t oI N S E R T , q u ed i s p a r o uat r i g g e r .* / * / D e s e n v o l v i d op a r ad e m o n s t r a rau t i l i z a ç ã od e t r i g g e r sn oS Q LS e r v e r .Ar e p r o d u ç ã od e s t e a r t i g os óép e r m i t i d as ef o r e mm a n t i d o so s c r é d i t o sd oa u t o r . A u t o r :F a b i a n oC o r e s D a t a:0 6 / 1 2 / 2 0 1 0 S i t e:h t t p : / / s q l b u r g e r . b l o g s p o t . c o m / *

d e c l a r e@ v q t _ f a t u r a d a d e c i m a l ( 1 0 , 4 ) d e c l a r e@ v v l _ u n i t a r i o m o n e y

sqlburger.blogspot.com.br/2010/12/triggers-para-iniciantes-no-sql-server.html

2/6

18/09/13
4 2 . 4 3 . 4 4 . 4 5 . 4 6 . 4 7 . 4 8 . 4 9 . 5 0 . 5 1 . 5 2 . 5 3 . 5 4 . 5 5 . 5 6 . 5 7 . 5 8 . 5 9 . 6 0 . 6 1 . 6 2 . 6 3 . 6 4 . 6 5 . 6 6 . 6 7 . 6 8 . 6 9 . e n d e n d c l o s ec u r _ N F _ I t e m d e a l l o c a t ec u r _ N F _ I t e m i f@ @ f e t c h _ s t a t u s< >0b r e a k w h i l e1=1 b e g i n

SQLBURGER: Triggers para iniciantes no SQL Server – Parte 1/3

f e t c hn e x tf r o mc u r _ N F _ I t e mi n t o@ v c d _ e m p r e s a ,@ v n r _ s e r i e ,@ v n r _ n o t a ,@ v c d _ i t e m ,@ v q t _ f a t u r a d a ,@ v v l _ u n i t a r i o

/ *P a r ac a d ai t e mq u ef o ii n s e r i d o ,e x e c u t oo p r o c e d i m e n t oq u em o v i m e n t ae s t o q u e( s óp a r a e x e m p l i f i c a r )* / e x e cs p c M o v i m e n t a E s t o q u e@ v c d _ e m p r e s a ,@ v n r _ s e r i e ,@ v n r _ n o t a ,@ v c d _ i t e m ,@ v q t _ f a t u r a d a ,@ v v l _ u n i t a r i o

CABEÇALHO DE UMA TRIGGER O primeiro parâmetro é o NOME (tgiNotaItem) da trigger, forma como o objeto será identificado no banco de dados. Quando uma trigger é criada, é gerado um registro na tabela SYSOBJECTS. Para se atribuir o nome da trigger, tenho como padrão colocar tgiTabela (trigger de insert), tgdTabela (trigger de delete), tguTabela (trigger de update), ou somente tgTabela, quando ambas as situações são contempladas no código. O segundo parâmetro é o nome da tabela que será vinculada a esta trigger (no exemplo abaixo, estamos colocando um gatilho na tabela NotaItem). O terceiro parâmetro (“for insert”) determina o tipo de trigger, que vamos entender melhor cada uma adiante.
Code Snippet 1 . c r e a t et r i g g e rt r i g g e r _ n a m e 2 . o n{t a b l e _ n a m e} 3 . {F O R/A F T E R|I N S T E A DO F} 4 . {[ I N S E R T ][ , ][ D E L E T E ][ , ][ U P D A T E ]} 5 . a s 6 . b e g i n 7 . 8 . 9 . 1 0 . e n d s q l _ s t a t e m e n t[. . . n]

Tipos de triggers Existem 2 tipos de triggers no SQL Server (e na maioria dos SGBD do mercado). AFTER: A trigger somente é executada após a gravação dos dados na tabela (padrão quando cria trigger) INSTEAD OF: A trigger será disparada ANTES do registro ser modificado na tabela. O tipo AFTER é o mais comum de ser utilizado. O tipo INSTEAD OF tem aplicações mais específicas. Os casos mais comuns em que utilizei este tipo de trigger foi para criar bloqueios em sistema que não detenho o código fonte (exemplo: lançamentos contábeis em período fechado, não permite gravar). Mais adiante falaremos mais sobre este tipo. Exemplos: AFTER
Code Snippet 1 . C R E A T Et r i g g e rt g i N o t a I t e mo nN o t a I t e m 2 . F O R{i n s e r t|d e l e t e|u p d a t e} 3 . a s 4 .

sqlburger.blogspot.com.br/2010/12/triggers-para-iniciantes-no-sql-server.html

3/6

18/09/13
5 . O U 6 .

SQLBURGER: Triggers para iniciantes no SQL Server – Parte 1/3

7 . C R E A T Et r i g g e rt g i N o t a I t e mo nN o t a I t e m 8 . A F T E R{i n s e r t|d e l e t e|u p d a t e} 9 . a s

INSTEAD OF
Code Snippet 1 . C R E A T Et r i g g e rt g i N o t a I t e mo nN o t a I t e m 2 . I N S T E A DO F{i n s e r t|d e l e t e|u p d a t e } 3 . a s

Eventos de disparo de uma trigger Uma trigger é disparada quando um evento de INSERT, DELETE ou UPDATE ocorre em uma tabela. Para isso, é necessário informar ao SQL que tipo de evento deseja tratar, que pode INSERT, DELETE ou UPDATE. Exemplos:

Code Snippet 1 . 2 . -T r i g g e rq u es e r áe x e c u t a d aa oi n s e r i ru mi t e mn os i s t e m a 3 . C R E A T Et r i g g e rt g i N o t a I t e mo nN o t a I t e m 4 . F O Ri n s e r t 5 . a s 6 . 7 . 8 . 9 . 1 0 . 1 1 . -T r i g g e rq u es e r áe x e c u t a d aa oe x c l u i ru mi t e mn os i s t e m a 1 2 . C R E A T Et r i g g e rt g d N o t a I t e mo nN o t a I t e m 1 3 . F O Rd e l e t e 1 4 . a s 1 5 . 1 6 . 1 7 . 1 8 . 1 9 . 2 0 . -T r i g g e rq u es e r áe x e c u t a d ae mq u a l q u e ro p e r a ç ã od em a n i p u l a ç ã o 2 1 . -d ed a d o sn at a b e l a( i n s e r t ,d e l e t eo uu p d a t e ) 2 2 . C R E A T Et r i g g e rt g N o t a I t e mo nN o t a I t e m 2 3 . F O Ri n s e r t ,d e l e t e ,u p d a t e 2 4 . a s 2 5 . 2 6 . 2 7 . s q l _ s t a t e m e n t[. . . n] s q l _ s t a t e m e n t[. . . n] s q l _ s t a t e m e n t[. . . n]

TABELAS “DE AMBIENTE” EXISTENTES NA EXECUÇÃO DE UMA TRIGGER Ao desenvolver uma trigger, você precisa ter acesso aos dados EM ATUALIZAÇÃO (no caso de insert, quais dados estão sendo inseridos, para exclusão quais estão sendo excluídos, e assim por diante). Para isso, chamo-as de “tabelas de ambiente”, que só existem no momento em que uma trigger está sendo executada. Existe duas tabelas, chamadas INSERTED (registros incluídos ou alterados – novos valores) e DELETED (registros excluídos ou alterados – valores anteriores). Estas tabelas “virtuais” possuem exatamente a mesma estrutura da tabela em que a trigger foi criada. Vamos separar somente o trecho do código que busca dados desta tabela.

Exemplo:
Code Snippet 1 . C R E A T Et r i g g e rt g i N o t a I t e mo nN o t a I t e m 2 . f o ri n s e r t 3 . a s 4 . b e g i n 5 . 6 . 7 . 8 . d e c l a r ec u r _ N F _ I t e mc u r s o r . . .

sqlburger.blogspot.com.br/2010/12/triggers-para-iniciantes-no-sql-server.html

4/6

18/09/13
9 . 1 0 . 1 1 . 1 2 . 1 3 . 1 4 . 1 5 . 1 6 . 1 7 . 1 8 . 1 9 . 2 0 . 2 1 . 2 2 . e n d . . . o p e nc u r _ N F _ I t e m s e l e c tc d _ e m p r e s a ,n r _ s e r i e ,n r _ n o t a ,c d _ i t e m ,q t _ f a t u r a d a ,v l _ u n i t a r i o f r o mi n s e r t e d

SQLBURGER: Triggers para iniciantes no SQL Server – Parte 1/3
l o c a lf a s t _ f o r w a r dr e a d _ o n l yf o r

Observe que estou buscando dados de uma tabela INSERTED, porém se olhar esta tabela no Object Explorer, perceberá que ela não existe. Ela somente vai existir durante a execução de uma trigger. Os updates são ainda mais interessantes. Toda vez que um UPDATE é feito em uma tabela, durante a execução da trigger nós teremos na tabela DELETED quais eram os dados antes do update, e na INSERTED quais são os novos valores dos registros alterados. Fique atento para o próximo capítulo da saga. Na próxima parte vamos entender mais sobre a parte prática, parâmetros e o comportamentos das triggers. =)
Postado por Fabiano Cores
Recomende isto no Google

Nenhum comentário: Postar um comentário
D i g i t es e uc o m e n t á r i o . . .

Comentar como: Conta do Google Publicar Visualizar

Postagem mais recente
Assinar: Postar comentários (Atom)

Início

Postagem mais antiga

POSTAGENS POPULARES

ARQUIVO DO BLOG

CATEGORIAS

Calculando o tamanho de cada tabela no SQL Server Hoje vou descrever uma solução que adotei durante uma visita a um cliente que estava com problemas de tamanho e performance no banco de dado... Triggers para iniciantes no SQL Server – Parte 1/3 Este artigo se aplica ao Microsoft SQL Server a partir da versão 2000, porém o conceito de triggers se aplica à maioria dos sistemas gerenci... Round() – Arredondar ou truncar os decimais? Esta dica vai para todos os colegas que trabalham com SQL Server e precisam trabalhar arredondamentos. Creio que a maioria dos pro... Como tratar valores DATA (datetime) no SQL SERVER Este artigo se aplica a qualquer versão do Microsoft SQL Server a partir da versão 2000. TAGS : #DATEADD, #DATEPART, #GETDATE, #BISSEXTO, #S...

► 2013 (3) ► 2012 (1) ► 2011 (6) ▼ 2010 (11) ▼ Dezembro (6) Um caso de recursividade Triggers para iniciantes no SQL Server – Parte 2/3... Triggers para iniciantes no SQL Server – Parte 1/3... SQL Dinâmico – usar código para criar código Afinal de contas, maiúsculo ou minúsculo? Calculando o tamanho de cada tabela no SQL Server ► Novembro (5)

Avançado (4) Crystal Reports (1) Curiosidades (2) Datetime (1) DB Admin (4) Manipulação de string (4) Manipulação de valores (1) Para programadores (9) Projetos (2) SQL (8) T-SQL (13)

sqlburger.blogspot.com.br/2010/12/triggers-para-iniciantes-no-sql-server.html

5/6

18/09/13

SQLBURGER: Triggers para iniciantes no SQL Server – Parte 1/3
O truque do zero à esquerda Technorati Marcas: Microsoft SQL Server , Programação , Development , SQL , String , Rtrim , Right Olá caros sqlnautas. Este artigo é relac...

Automação de impressoras térmicas diretamente pelo SQL Server *Este artigo se aplica a versões 2005 ou superior do SQL Server. Na versão 2000, haverá restrições de 8000 caracteres na geração de arquivos... sysobjects, sys.objects, syscolumns e syscomments Utilize as tabelas de sistema do SQL Server para turbinar seu trabalho As tabelas de sistema contém informações sobre a estrutura do seu ba... SPLIT STRING – Função para dividir uma string por um caracter de controle Imagine a seguinte situação: você possui uma string, separada por ponto e vírgula, e você deseja separar estas strings para realizar um trat... Crystal Reports – Como buscar uma imagem de arquivo para ser exibida no relatório Olá caros sqlnautas, gostaria de retornar aqui com mais uma dica importante sobre imagens no crystal reports. Imagine o seguinte cenário: vo... Triggers para iniciantes no SQL Server – Parte 2/3 Este artigo se aplica ao Microsoft SQL Server a partir da versão 2000, porém o conceito de triggers se aplica à maioria dos sistemas gerenci...

Modelo Picture Window. Tecnologia do Blogger.

sqlburger.blogspot.com.br/2010/12/triggers-para-iniciantes-no-sql-server.html

6/6