SQL Server : T-SQL - Updates, Joins e Triggers - II
Neste artigo vamos recordar o conceito de Triggers e sua aplicação de forma correta com T-SQL. |
Continuando a primeira parte deste artigo veremos
resolver o problema dos Triggers usando Updates e Joins.
Recursos usados:
SQL Server Management Studio
SQL Server 2012
T-SQL
Usando instruções Update e Join
Para
corrigir o problema do Trigger apresentando no artigo anterior, precisamos
atualizar uma linha de nível de estoque para cada pedido criado.
Podemos criar um cursor sobre a tabela inserida e fazer um loop por cada linha.
Cada iteração atualizaria o nível de estoque que corresponde ao pedido inserido
atual do cursor.
Uma solução melhor é usar uma instrução UPDATE que inclua um JOIN.
Essa declaração permite que você atualize as linhas em apenas uma das tabelas.
No entanto, os dados usados para controlar as atualizações podem vir de qualquer
uma das tabelas juntadas.
A sintaxe da instrução UPDATE é a seguinte :
UPDATE
table-to-update-alias
SET
table-to-update-alias.column-1 = source-table-alias.column-1,
table-to-update-alias.column-2 = source-table-alias.column-2,
.
.
.
table-to-update-alias.column-X = source-table-alias.column-X
FROM
table-to-update table-to-update-alias
INNER JOIN
source-table source-table-alias
ON
table-to-update-alias.join-column source-table.join-column
|
Corrigindo o Trigger
Usando a instrução UPDATE, podemos corrigir o trigger que esta falhando.
Tudo o que precisamos fazer é juntar a tabela Estoque à tabela temporária inserida(inserted) para que possamos ajustar todos os níveis de estoque afetados de uma só vez.
O script do trigger atualizado é mostrado abaixo.
ALTER TRIGGER PedidosAutoAlocados
ON Pedidos
AFTER INSERT
AS
UPDATE
S
SET
S.Alocado = S.Alocado + I.Quantidade
FROM
Estoque S
INNER JOIN
inserted I
ON
S.CodigoEstoque = I.CodigoEstoque
|
Veja que estamos atualizando os dados na tabela Estoque, acessados através de um alias "S".
Isto é unido à tabela inserida(inserted), com o alias "I", onde os códigos de estoque correspondem.
O novo valor Alocado é calculado somando o valor atual e a quantidade de cada pedido correspondente.
Testando o novo Trigger
Antes de testar o novo Trigger que alteramos para funcionar corretamente, vamos deletar todos os pedidos e resetar as alocações usando o comando:
DELETE Pedidos
UPDATE Estoque SET Alocado = 0
Assim voltamos a ter os dados iniciais nas tabelas Estoque e Pedidos.
Agora vamos executar novamente o script abaixo que cria um pedido para cada código de estoque conhecido.
INSERT INTO
Pedidos(CodigoEstoque, Quantidade)
SELECT CodigoEstoque, 1 FROM Estoque
A seguir ao exibirmos o conteúdo da tabela Estoque onde temos o seguinte
resultado :
Dessa forma o Trigger agora esta funcionando corretamente, pois após a inclusão dos dados na tabela Pedidos, os dados na tabela Estoque são atualizados corretamente e correspondem ao novo pedido.
Tudo isso graças ao UPDATE ao JOIN.
"E esta é a mensagem que dele ouvimos, e
vos anunciamos: que Deus é luz, e não há nele trevas nenhumas. "
1 João 1:5
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
http://technet.microsoft.com/pt-br/library/ms187953%28v=sql.105%29.aspx
http://technet.microsoft.com/pt-br/library/ms188037.aspx(IF/ELSE)
http://technet.microsoft.com/pt-br/library/ms178642.aspx(WHILE)
http://technet.microsoft.com/pt-br/library/ms189074%28v=sql.105%29.aspx(CASE)
http://msdn.microsoft.com/pt-br/library/ms174377.aspx(TRANSACTION)
http://msdn.microsoft.com/pt-br/library/ms181299.aspx (ROLLBACK)
http://msdn.microsoft.com/pt-br/library/ms187926.aspx(STORED PROCEDURE)