You are on page 1of 6

18/09/13

Com partilhar 0

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


mais Prximo 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 verso 2000, porm 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 vocs 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 aplicao, que vamos abordar neste tpico, ser a criao de uma trigger em uma tabela dos itens de uma nota fiscal. Quando os itens so 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 simulaes em seu prprio SQL Server.

FACEBOOK
Fabiano Cores

Criar seu atalho

CONHECENDO A ESTRUTURA DE UMA TRIGGER Uma trigger (gatilho) um bloco de cdigo T-SQL (como um procedimento) que executado no momento em que ocorre um INSERT, UPDATE e/ou DELETE na tabela onde foi criada. Vamos ento comear visualizando uma trigger. Para abrir uma trigger, podemos faze-lo de duas formas: 1. Localizar a trigger atravs do Object Explorer do Microsoft SQL Server Management Studio (imagem abaixo), clicar com o boto 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 cdigo 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

CABEALHO DE UMA TRIGGER O primeiro parmetro 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 padro colocar tgiTabela (trigger de insert), tgdTabela (trigger de delete), tguTabela (trigger de update), ou somente tgTabela, quando ambas as situaes so contempladas no cdigo. O segundo parmetro o nome da tabela que ser vinculada a esta trigger (no exemplo abaixo, estamos colocando um gatilho na tabela NotaItem). O terceiro parmetro (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 aps a gravao dos dados na tabela (padro 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 aplicaes mais especficas. Os casos mais comuns em que utilizei este tipo de trigger foi para criar bloqueios em sistema que no detenho o cdigo fonte (exemplo: lanamentos contbeis em perodo fechado, no 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, necessrio 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 EXECUO DE UMA TRIGGER Ao desenvolver uma trigger, voc precisa ter acesso aos dados EM ATUALIZAO (no caso de insert, quais dados esto sendo inseridos, para excluso quais esto sendo excludos, 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 includos ou alterados novos valores) e DELETED (registros excludos 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 cdigo 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, porm se olhar esta tabela no Object Explorer, perceber que ela no existe. Ela somente vai existir durante a execuo de uma trigger. Os updates so ainda mais interessantes. Toda vez que um UPDATE feito em uma tabela, durante a execuo da trigger ns teremos na tabela DELETED quais eram os dados antes do update, e na INSERTED quais so os novos valores dos registros alterados. Fique atento para o prximo captulo da saga. Na prxima parte vamos entender mais sobre a parte prtica, parmetros e o comportamentos das triggers. =)
Postado por Fabiano Cores
Recomende isto no Google

Nenhum comentrio: Postar um comentrio


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 comentrios (Atom)

Incio

Postagem mais antiga

POSTAGENS POPULARES

ARQUIVO DO BLOG

CATEGORIAS

Calculando o tamanho de cada tabela no SQL Server Hoje vou descrever uma soluo 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 verso 2000, porm 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 verso do Microsoft SQL Server a partir da verso 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 Dinmico usar cdigo para criar cdigo Afinal de contas, maisculo ou minsculo? Calculando o tamanho de cada tabela no SQL Server Novembro (5)

Avanado (4) Crystal Reports (1) Curiosidades (2) Datetime (1) DB Admin (4) Manipulao de string (4) Manipulao 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 , Programao , Development , SQL , String , Rtrim , Right Ol caros sqlnautas. Este artigo relac...

Automao de impressoras trmicas diretamente pelo SQL Server *Este artigo se aplica a verses 2005 ou superior do SQL Server. Na verso 2000, haver restries de 8000 caracteres na gerao de arquivos... sysobjects, sys.objects, syscolumns e syscomments Utilize as tabelas de sistema do SQL Server para turbinar seu trabalho As tabelas de sistema contm informaes sobre a estrutura do seu ba... SPLIT STRING Funo para dividir uma string por um caracter de controle Imagine a seguinte situao: voc possui uma string, separada por ponto e vrgula, e voc deseja separar estas strings para realizar um trat... Crystal Reports Como buscar uma imagem de arquivo para ser exibida no relatrio Ol caros sqlnautas, gostaria de retornar aqui com mais uma dica importante sobre imagens no crystal reports. Imagine o seguinte cenrio: vo... Triggers para iniciantes no SQL Server Parte 2/3 Este artigo se aplica ao Microsoft SQL Server a partir da verso 2000, porm 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

You might also like