A frase..

"A bondade tornou feliz minha vida."



segunda-feira, 9 de janeiro de 2012

Como faço uma Trigger de Inserção e Update??

Para você, querido internauta:


"Trigger -- Quero fazer uma!"
"Trigger para Delete"


O bom disso tudo é que se você por um acaso tiver dúvidas mais profundas você pode consultar nesses tópicos ou deixar um post no meu mural no face "Nathália Bielski Tavares". Se eu por um acaso não souber responder sua pergunta, vou procurar buscar a resposta.. Não é porque não sei que não possa aprender ;)


Agora continuaremos com o Tópico. Como imagino que você já tenha uma boa base e precise apenas tirar umas dúvidas, vou apenas lançar o ambiente e explicar basicamente os passos da Trigger.


O ambiente (se você estiver acompanhando os tópicos poderá usar o mesmo ambiente dos anteriores se não..):


CREATE DATABASE bd_Trigger
USE bd_Trigger 



CREATE TABLE ProdutosExcluidos(
cd_Produto INT NULL,
ds_produto VARCHAR(50) NULL,
dt_exclusao SMALLDATETIME NULL)
CREATE TABLE Produto(
cd_Produto INT NOT NULL,
ds_Produto VARCHAR(50) NOT NULL,
vl_Produto MONEY NULL,
qt_Estoque INT NULL,
qt_Estoquemin INT NULL,
 CONSTRAINT PK_Produto PRIMARY KEY CLUSTERED(cd_Produto))

 CREATE TABLE PedidoCompra(
cd_PedidoCompra INT IDENTITY NOT NULL,
cd_Produto INT NOT NULL,
dt_Solicitacao SMALLDATETIME  NOT NULL, 
qt_Compra INT NOT NULL,
 CONSTRAINT PK_PedidoCompra PRIMARY KEY CLUSTERED (cd_PedidoCompra))

 CREATE TABLE LogPreco(
cd_LogPreco INT IDENTITY NOT NULL,
dt_Alteracao SMALLDATETIME NOT NULL,
cd_Produto INT NOT NULL,
vl_ProdutoAntigo MONEY NOT NULL,
vl_ProdutoNovo MONEY NOT NULL,
 CONSTRAINT PK_LogPreco PRIMARY KEY CLUSTERED (cd_LogPreco))

ALTER TABLE LogPreco
ADD CONSTRAINT fk_LogPreco
FOREIGN KEY (cd_Produto)
REFERENCES Produto (cd_Produto)


ALTER TABLE PedidoCompra
ADD CONSTRAINT fk_PedidoCompra
FOREIGN KEY (cd_Produto)
REFERENCES Produto (cd_Produto)


INSERT Produto(cd_Produtods_Produto ,  vl_Produto ,qt_Estoque, qt_EstoqueminVALUES  ( 1 , 'Prego' , 1.0000 , 25 , 10) 
INSERT Produto ( cd_Produto , ds_Produto , vl_Produto , qt_Estoque, qt_Estoquemin  VALUES  ( 2 , 'Martelo' , 50.0000, 30 , 15) 
INSERT Produto ( cd_Produto , ds_Produto , vl_Produto , qt_Estoque, qt_Estoquemin  VALUES  ( 3 , 'Parafuso' , 2.0000 ,  10 ,  5) 
INSERT Produto ( cd_Produto , ds_Produto ,vl_Produto , qt_Estoque, qt_Estoquemin   VALUES  ( 4 , 'Chave de Fenda' , 25.0000 , 15 , 10)


Após esses procedimentos faça os seguintes testes:


SELECT * FROM Produto
SELECT * FROM PedidoCompra


Esse deve ser o resultado:



Repare que uma das tabelas você encontra os 5 itens cadastrados corretamente enquanto a outra está totalmente vazia. Perfeito. Como acredito que já conheçam a sintaxe de uma trigger, irei explicar apenas as partes que apareçam como novidade, no caso já na primeira linha posso dizer que como desejo fazer uma trigger para insert e update simplesmente declaro que é "para os dois".

CREATE TRIGGER tr_PedidoCompra ON Produto FOR INSERT,UPDATE
AS

DECLARE @cd_produto INT,@dt_solicitacao SMALLDATETIMA,@qt_compra INT,@qt_estoque INT,
@qt_estoquemin INT

--Repare que tomo valores da tabela inserted apenas. Isso porque estamos trabalhando com um --log para insert e update, lembrando que não existe uma tabela que tão pouco se chame --"updated". Lembresse toda vez que você faz um update você está trocando o antigo --valor por um novo, inserindo um novo.
SELECT @qt_estoque=qt_Estoque , @qt_estoquemin = qt_EstoqueMin ,  @cd_produto = cd_Produto , @qt_compra = qt_EstoqueMin qt_Estoque FROM inserted

--O que nós estamos tentando fazer aqui é simplesmente avaliar: Quando eu inserir na tabela de
--produtos ou alterar um produto já existente na tabela vai existir uma analise entre os campos
--EstoqueMin e Estoque. O dado do campo de Estoque desse tal produto está abaixo do dado do
--EstoqueMin...


IF(@qt_estoque < @qt_estoquemin)
BEGIN

--então um log será enviado para a tabela PedidoCompra.

INSERT INTO PedidoCompra VALUES ( @cd_produto , GETDATE ( ) , @qt_compra)
END

Agora eu gostaria que gentilmente você deletasse esse produto utilize este código:

DELETE Produto WHERE cd_Produto=5

Resultado:


Agora vamos fazer dois teste mas com insert, veja o que acontece:


INSERT INTO Produto VALUES(7,'Serra' , 17 , 3 , 5)
INSERT INTO  Produto  VALUES ( 8 , 'Machado' , 20 , 3 , 7)


Nesse momento você vê que quatro linhas são afetadas. Duas delas são da tabela produto, obvio já que nela foram realizados os dois insert. Mas e as duas outras? Teste isso e veja:

SELECT * FROM PedidoCompra



Sim duas linhas foram inseridas nessa tabela, e isso é bom, significa que a trigger funcionou e que é hora do comerciante fazer compras.

Agora vamos testar com update:

UPDATE Produto SET qt_Estoque= 7 WHERE cd_Produto  1
UPDATE Produto SET qt_Estoque 4 WHERE cd_Produto   3

Interessante:


Agora o teste final:

SELECT * FROM PedidoCompra





E as inserções automáticas foram bem sucedidas.

Espero que tenham aprendido muito e agradeço sua visita.