Articles tagged with: TARGET

Resposta do Desafio T-SQL #2 – MERGE e OUTPUT

BIRD

Boa noite pessoal ūüôā

1) Segue resposta do desafio anterior.

Eu coloquei o script com BEGIN TRAN, pra que possamos ver o resultado sem commit no banco, pra que testemos de novo o script sem necessidade de rodar tudo de novo.

Vamos primeiro traduzir alguns termos no contexto de um comando MERGE:

TARGET:  A tabela alvo, que você tem por objetivo atualizar. Eu prefiro traduzir TARGET como destino pra assimilar com mais facilidade;

SOURCE:  A tabela fonte de onde vem a informação necessária para se atualizar a tabela alvo. Eu prefiro traduzir SOURCE neste caso como origem pra assimilar com mais facilidade;

Sobre o algoritmo: Quero usar MERGE na tabela Empregado, que √© o destino da atualiza√ß√£o. Quero pra isso utilizar a tabela ListaMudancasRH, que √© a fonte que irei utilizar para atualizar minha tabela Empregado. Eu quero associar as duas utilizando o nome do funcion√°rio. Tendo isso em mente, √© f√°cil entender qual a utilidade do MATCH…

#1 – WHEN MATCHED AND SOURCE.ativo = 1 THEN¬†UPDATE…

Significa: Quando o nome do funcion√°rio coincidir nas duas tabelas (ou seja, fizer o MATCH sucessivamente) e na tabela origem com as novas informa√ß√Ķes, tiver o ativo =1, significa que o funcion√°rio ainda est√° empregado. Logo, devo atualizar o cargo na tabela destino utilizando a origem como base

#2 WHEN MATCHED AND SOURCE.ativo = 0 THEN¬†DELETE…

Significa :¬†Quando o nome do funcion√°rio coincidir nas duas tabelas (ou seja, fizer o MATCH sucessivamente) ¬†e na tabela origem com as novas informa√ß√Ķes. tiver o ativo =0, significa que o funcion√°rio est√°/ser√° desempregado. Logo, devo DELETAR ele na tabela de destino utilizando a origem como base (√Č importante ressaltar que isso √© um exemplo apenas. Em casos reais, dependendo da modelagem dos sistemas que apontam para o banco, registros de pessoas comumente n√£o s√£o deletados, e sim atualizados para algo que indique desuso, que nesse caso poderia ser simplesmente a flag ativo da destino (tabela Empregados) atualizada para 0.

#3 – WHEN NOT MATCHED BY TARGET THEN INSERT…

Significa: Quando o nome do funcion√°rio n√£o coincidir na TARGET, ou seja, na tabela destino, se faz necess√°ria a inser√ß√£o de um funcion√°rio que n√£o existia antes na tabela de destino. Veja s√≥, aqui inserimos os dados da tabela origem na tabela destino, a de Empregados. —

2) A segunda quest√£o pede que fa√ßamos uma tabela de auditoria. Lembram que recomendei o uso da cl√°usula output? N√£o foi por acaso. Bem, existem v√°rias formas de se realizar auditoria de um registro, e uma delas √© utilizando as famosas “tabelas especiais” deleted e inserted, ¬†que s√£o duas tabelas utilizadas pelo SQL Server na execu√ß√£o de tarefas DML (que manipulam dados).

Esse post n√£o pretende cobrir assunto , mas voc√™ pode v√™-lo aqui¬†e recomendo que o fa√ßa caso precise aprender novas possibilidade pra debugging e auditoria… Mas enfim… Cada vez que o c√≥digo¬†faz um:

DELETE: Internamente, no SQL Server, é salva uma cópia do registro apagado na tabela DELETED.

INSERT: Internamente, no SQL Server é salva uma cópia do registro recém-inserido na tabela INSERTED

UPDATE: Internamente, no SQL Server, é salva o registro na tabela DELETED e insere o novo no INSERTED.

Em resumo, combinando com a cl√°usula OUTPUT (maiores informa√ß√Ķes aqui), que a grosso modo √© um “SELECT pra registros que est√£o sendo manipulados em express√Ķes DML”, √© poss√≠vel capturar os registros que o SQL Server joga nas tabelas INSERTED e DELETED e assim sendo, persistir estes dados com o uso de uma cl√°usula INSERT INTO!

Para praticar, e já considerando que a cláusula MERGE soa mais familiar pra você, leitor, mostro uma nova possibilidade: Realizar o MERGE e manipulando os registros modificados (apagados, atualizados e inseridos).

Informa√ß√Ķes adicionais… COALESCE compara dois nomes e traz o primeiro resultado n√£o nulo que encontrar. Inevitavelmente o nome do funcion√°rio se encontrar√° NULO se o registro sofreu opera√ß√Ķes de DELETE na inserted e encontrar√° NULO tamb√©m na deleted se foi feita uma opera√ß√£o de inser√ß√£o.

No caso de um UPDATE, os dois campos estarão preenchidos, pois uma atualização consiste, internamente para o SQL Server, de uma deleção + inserção. A variável $ACTION guarda internamente qual operação foi realizada naquele registro, e que aqui foi mantida em inglês por motivos de praticidade. Você pode tratar isso com um CASE caso queira registrar um outro nome diferente do retornado ao servidor.

Essa foi a resolução básica! Tem várias outras formas de se resolver o problema, sendo esta apenas uma delas.

Espero que tenha passado alguma informa√ß√£o √ļtil. Caso tenha alguma cr√≠tica, corre√ß√£o, ou opini√£o, sinta-se √† vontade para comentar!
[]’s