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:

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:


José Carlos Macoratti