Desvendando o SQL - Parte XI - Gatilhos
Autor: Rubens Lima | Publicado: 2013-08-22T11:26:00-03:00




De volta com nosso último artigo
da série sobre a linguagem SQL, caso não tenha acompanhado os artigos
anteriores, no final do artigo coloco o link para os anteriores. Hoje vamos
mostrar como funcionam as TRIGGERS ou como alguns conhecem os GATILHOS do SQL.
Boa leitura a todos.





DEFINIÇÃO



Os gatilhos são um tipo especial
de procedimento armazenado que é executado automaticamente na ocorrência de
eventos no banco de dados. 


Existem os gatilhos DML que
ocorrem no momento da modificação dos dados de uma tabela, ou seja, quando
estamos manipulando os dados, quando executados INSERTS, UPDATE E DELETES, e
são disparados quando um evento válido é acionado.


Existem também os gatilhos DDL
que ocorrem no momento da definição dos dados do banco, eventos esses que
correspondem às instruções CREATE, ALTER e DROP.


Pela sua característica
automática, a segurança na sua utilização e execução deve ser levada em
consideração para evitarmos a utilização de forma mal-intencionada.




SINTAXE



Como em outras instruções vistas
em artigos anteriores a sintaxe de construção pode mostrar várias opções, mas
procuramos mostrar sempre uma forma mais simples visando os principiantes, caso
desejem pode pesquisar as outras inúmeras opções existentes.




Para instruções DML (Insert, Update ou Delete)




CREATE TRIGGER &lt; nome da trigger &gt;

ON &lt; tabela | visão &gt;

FOR | AFTER | INSTEAD OF

[ INSERT ] [ , ] [ UPDATE ] [ , ]
[ DELETE ] 

AS

&lt;
Instruções de execução &gt;




Para instruções DDL (Create, Alter ou Drop)




CREATE TRIGGER &lt; nome da trigger &gt;

ON { ALL SERVER | DATABASE } 

{ FOR | AFTER } { event_type | event_group } [
,...n ]

AS

&lt;
Instruções de execução &gt;




LIMITAÇÕES


Não inclua instruções SELECT que
retornem resultados ou instruções que executem atribuição de variável em um
gatilho.&nbsp;Um gatilho que inclua instruções SELECT que retornem resultados
ao usuário ou instruções que executam atribuição de variável requer um
tratamento especial;


Os resultados retornados devem
ser gravados em todos os aplicativos nos quais as modificações na tabela de
gatilhos são permitidas.&nbsp;Se uma atribuição de variável tiver de ocorrer em
um gatilho, use a instrução SET NOCOUNT no início do gatilho para evitar o
retorno de algum conjunto de resultados;


As instruções seguintes não podem
ser utilizadas em gatilhos DML:




ALTER DATABASE
CREATE DATABASE
DROP DATABASE
RESTORE DATABASE
RESTORE LOG
RECONFIGURE
ALTER TABLE, quando adicionar,
modificar ou deletar colunas; alternar partições e adicionar ou deletar chaves
primárias ou únicas.






ANINHAMENTO DE GATILHOS


Gatilhos aninhados podem ser
utilizados até o 32º nível. Recomenda o cuidado em sua utilização visando a
performance do banco de dados



EXEMPLOS



Vamos criar uma tabela de log do
estoque para o nosso banco, assim sempre que for incluído, alterado ou deletado
algum registro, vamos guardar a informação.


Primeiro vamos à criação da
tabela de log que vamos chamar de TBEstoqueLog.


CREATE TABLE
TBEstoqueLog

(

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CD_EVENTO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NOT
NULL IDENTITY,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CD_ESTOQUE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NOT&nbsp;&nbsp; NULL,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DESC_OPERACAO&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR(10) NOT NULL,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DESC_COLUNA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR(30) NULL,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VLR_ANTERIOR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR(30) NULL,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VLR_ATUAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR(30) NULL,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DTH_OPERACAO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DATETIME&nbsp;&nbsp;&nbsp; NOT NULL&nbsp;&nbsp;&nbsp; 

)



EXECUTE SP_ADDEXTENDEDPROPERTY 'MS_DESCRIPTION', 

&nbsp;&nbsp;
'Tabela de Log dos Estoque',

&nbsp;&nbsp; 'USER', 'DBO',
'TABLE', 'TBEstoqueLog'

GO



ALTER TABLE
TBEstoqueLog

&nbsp;&nbsp;
ADD CONSTRAINT
PK_LOGE PRIMARY KEY (CD_EVENTO)

GO


Vamos ter uma coluna de código de
controle da tabela, o código do estoque que está sendo alterado, qual a
operação (insert, update ou delete), qual a coluna alterada, somente quando for
update, o valor anterior e atual e a data que foi realizado.


Depois de criada a tabela vamos
criar nossa TRIGGER:


CREATE TRIGGER
TgEstLog ON TBEstoque

&nbsp;&nbsp;
AFTER INSERT,UPDATE,DELETE

AS 

BEGIN



&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECLARE 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Operacao&nbsp;&nbsp; VARCHAR(15),

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Coluna&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR(30),

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @VlrAnt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR(15),

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @VlrAtu&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR(15)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @Operacao = NULL

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @Coluna = ''

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @VlrAnt = ''

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @VlrAtu = ''

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --Verificando
tipo do trigger

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF EXISTS(SELECT 1 FROM
inserted)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @Operacao = 'INSERT'&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF EXISTS(SELECT 1 FROM deleted) 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BEGIN

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF @Operacao IS NULL

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @Operacao = 'DELETE'

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ELSE

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @Operacao = 'UPDATE'

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF @OPERACAO = 'UPDATE'

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BEGIN

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF UPDATE(QTD_ESTOQUE)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BEGIN

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @Coluna = 'QTD_ESTOQUE'

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @VlrAnt = (SELECT QTD_ESTOQUE FROM
Deleted)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @VlrAtu = (SELECT QTD_ESTOQUE FROM
Inserted)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF UPDATE(CD_UNIDADE)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BEGIN

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @Coluna = 'CD_UNIDADE'

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @VlrAnt = (SELECT CD_UNIDADE FROM
Deleted)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @VlrAtu = (SELECT CD_UNIDADE FROM
Inserted)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF UPDATE(VLR_UNITARIO)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BEGIN

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @Coluna = 'VLR_UNITARIO'

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @VlrAnt = (SELECT VLR_UNITARIO FROM
Deleted)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @VlrAtu = (SELECT VLR_UNITARIO FROM
Inserted)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF EXISTS(SELECT 1 FROM
inserted)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT
INTO TBEstoqueLog (CD_ESTOQUE,
DESC_OPERACAO, DESC_COLUNA, VLR_ANTERIOR,
VLR_ATUAL, DTH_OPERACAO)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CD_ESTOQUE, 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Operacao,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Coluna,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @VlrAnt,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @VlrAtu,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getdate()

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM Inserted

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF @OPERACAO = 'delete'

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT
INTO TBEstoqueLog (CD_ESTOQUE,
DESC_OPERACAO, DESC_COLUNA, VLR_ANTERIOR,
VLR_ATUAL, DTH_OPERACAO)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CD_ESTOQUE, 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Operacao,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Coluna,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @VlrAnt,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @VlrAtu,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getdate()

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM deleted

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end



END



Testamos qual a operação
realizada:


--Verificando tipo do
trigger

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF EXISTS(SELECT 1 FROM
inserted)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @Operacao = 'INSERT'&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF EXISTS(SELECT 1 FROM deleted) 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BEGIN

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF @Operacao IS NULL

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @Operacao = 'DELETE'

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ELSE

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET
@Operacao = 'UPDATE'

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 



Buscamos os valores anterior e
atual quando a operação for de update:


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF @OPERACAO = 'UPDATE'

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BEGIN

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF UPDATE(QTD_ESTOQUE)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BEGIN

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @Coluna = 'QTD_ESTOQUE'

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @VlrAnt = (SELECT QTD_ESTOQUE FROM
Deleted)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @VlrAtu = (SELECT QTD_ESTOQUE FROM
Inserted)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF UPDATE(CD_UNIDADE)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BEGIN

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @Coluna = 'CD_UNIDADE'

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @VlrAnt = (SELECT CD_UNIDADE FROM
Deleted)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @VlrAtu = (SELECT CD_UNIDADE FROM
Inserted)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF UPDATE(VLR_UNITARIO)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BEGIN

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @Coluna = 'VLR_UNITARIO'

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @VlrAnt = (SELECT VLR_UNITARIO FROM
Deleted)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET @VlrAtu = (SELECT VLR_UNITARIO FROM
Inserted)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END



Inserimos em nossa tabela de log
de acordo com a operação realizada;


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF EXISTS(SELECT 1 FROM
inserted)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT
INTO TBEstoqueLog (CD_ESTOQUE,
DESC_OPERACAO, DESC_COLUNA, VLR_ANTERIOR,
VLR_ATUAL, DTH_OPERACAO)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CD_ESTOQUE, 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Operacao,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Coluna,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @VlrAnt,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @VlrAtu,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getdate()

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM Inserted

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF @OPERACAO = 'delete'

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT
INTO TBEstoqueLog (CD_ESTOQUE,
DESC_OPERACAO, DESC_COLUNA, VLR_ANTERIOR,
VLR_ATUAL, DTH_OPERACAO)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CD_ESTOQUE, 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Operacao,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Coluna,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @VlrAnt,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @VlrAtu,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getdate()

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM deleted

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end



END



Vamos testar a nossa trigger:


INSERT INTO
TBESTOQUE (CD_PRODUTO, QTD_ESTOQUE,
CD_UNIDADE, VLR_UNITARIO, DTH_MOVIMENTO) VALUES (12,1,7,2.50,GETDATE())



UPDATE TBESTOQUE

SET QTD_ESTOQUE = 2

WHERE CD_ESTOQUE = 13



DELETE FROM TBESTOQUE WHERE
CD_ESTOQUE = 13







E o resultado da execução da trigger é o mostrado abaixo:


CD_EVENTO&nbsp;&nbsp;
CD_ESTOQUE&nbsp; DESC_OPERACAO
DESC_COLUNA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
VLR_ANTERIOR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VLR_ATUAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DTH_OPERACAO

----------- ----------- -------------
------------------------------ ------------------------------
------------------------------ -----------------------

22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INSERT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2013-08-22
11:00:46.060

23&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UPDATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QTD_ESTOQUE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2013-08-22
11:01:00.440

24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DELETE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2013-08-22
11:01:03.363



(3 row(s) affected)




Com um exemplo prático mostramos
como funcionam as TRIGGERS, espero que tenha ficado claro, qualquer dúvida, é
só comentar.


Com essa série de artigos
procuramos mostrar um pouco da linguagem SQL, como funcionam as operações via
código, espero que tenham gostado, e brevemente estaremos de volta com mais
novidades.


Grande abraço e até breve.







Artigos anteriores:

Desvendando o SQL - Parte I - Introdução
Desvendando o SQL - Parte II - Criando um Banco de Dados e Tabelas

Desvendando o SQL - Parte III - Alterando Registros


Desvendando o SQL - Parte IV - Consultas


Desvendando o SQL - Parte V - Visões

Desvendando o SQL - Parte VI - Estruturas Condicionais e de Repetição
Desvendando o SQL - Parte VII - Cursores
Desvendando o SQL - Parte VIII - Conversão de Valores
Desvendando o SQL - Parte IX - Procedimentos Armazenados
Desvendando o SQL - Parte X - Funções