none
trabalhar com triggers para fazer update RRS feed

  • Pergunta

  • bom dia,

    tenho uma tabela artigo(id_art(PK), nome, preco) e tenho uma tabela historico_artigo(id_hist, id_art(FK), preco, data_inicio, data_fim).

    o que quero é que no momento de atualizar um preço de um artigo, ter um trigger que pega o valor inicial do artigo e coloca na tabela historico juntamente com os dados (as datas sao pegas de textbox). e faz pralem do update na tabela artigo com o novo preço, mas tambem guarda o antigo preço do artigo na tabela historico.

    como se faz isso?? com triggers?? qual a melhor ideia


    quinta-feira, 4 de dezembro de 2014 10:12

Respostas

  • Olá Flavio,

    Não sei se já conseguiu, mas segue uma trigger que eu monte;

    OBS: Quando a tabela artigo sofrer alteração, a trigger pega o valor que era anteriormente e insere na tabela de historico_artigo, só confira antes os nomes das colunas 

    CREATE TRIGGER [dbo].[TR_ARTIGO_AFTER_UPD] ON [dbo].[ARTIGO]  
    AFTER UPDATE  
    AS  
    BEGIN  
    -- Coloque o id_hist como identity na tabela historico_artigo
     INSERT INTO historico_artigo ( [ID_ART],
         [preco],  
         [ data_inicio],

         [ data_fim]

        )  

    --verifique o nome das colunas da tabela artigo e coloque-os corretamente mantendo -os na ordem do insert acima

      SELECT U.[ART_ID],U.[ART_PRECO],GETDATE(),GETDATE()    
         FROM DELETED  U  

    END  

           
    • Sugerido como Resposta AlineBC sexta-feira, 12 de dezembro de 2014 10:36
    • Marcado como Resposta flaviodantas quinta-feira, 18 de dezembro de 2014 15:53
    quinta-feira, 4 de dezembro de 2014 17:10

Todas as Respostas

  • As duas maneiras funcionariam.

    Via código, você colocaria na mesma transação a inserção/atualização na tabela artigo, e ainda no mesmo bloco, adiciona também na historico_artigo.

    Via trigger também funciona. A cada nova inserção/atualização na tabela artigo, a trigger respectiva (updated/inserted) seria disparada para criar o histórico na historico_artigo.

    Via procedure (sp_insereArtigo) e dentro dela, você já faz as duas coisas numa única transação (igual ao primeiro exemplo)

    Enfim.. qual é a melhor? Depende de como está estruturado seu projeto. Se toda a regra está no código, mantenha lá (primeiro exemplo). Se seu sistema preserva regras no banco, use a segunda ou terceira.

    quinta-feira, 4 de dezembro de 2014 12:43
  • Raphael, eu tenho uma regra que faço sempre o maximo possivel por storedProcedure. entao a melhor forma de entra as 2 ultimas, qual aconcelharias??

    fazer um SP que pega o valor antigo antes de atualizar, fazer o update e depois fazer a nova inserção na tabela historico...

    ou fazer um sp que dispara um trigger?? e se for essa abordagem, favor mostre um exemplo para poder seguir pq não tou acostumado a trabalhar com trigger

    quinta-feira, 4 de dezembro de 2014 12:58
  • Bom, se sua regra está do lado do banco e você precisa apenas criar o historico de uma tabela, convém usar trigger.

    Se, por exemplo, antes de inserir da historico você precisasse passar por uma regra de negócio, ae seria melhor deixar tudo dentro da procedure mesmo, numa transação só, por questões de solidez e de manutenção mesmo.

    Imagina tu começar a colocar regra de negócio em trigger. Ae, daqui uns anos, todo mundo fazendo isso, um dia dá um probelma, e nego fica lá doido para achar a treta e no fim descobre que foi uma das trigger (que ninguém mais lembra) é quem tava fazendo merda. =D

    quinta-feira, 4 de dezembro de 2014 14:03
  • Raphael,

    se nao for pedir muito, poderias me dar um exemplo em codigo como fazer esse trigger... 

    quinta-feira, 4 de dezembro de 2014 15:12
  • Lá no banco, expanda a tabela "artigo" e na pasta "triggers", clique com o botão direito e escolha "New Trigger".

    No seu caso, você vai precisar de duas. Uma para INSERT e outra para UPDATE (separadas).

    Segue um exemplo. Criando a tabela, e uma trigger que dispara a cada "insert".

    http://www.devmedia.com.br/triggers-no-sql-server-teoria-e-pratica-aplicada-em-uma-situacao-real/28194

    Para deletar, é igual, só trocando o contexto da trigger (INSERTED para DELETED ou UPDATED).

    No geral, essas tabelas "INSERTED/DELETED/UPDATED" a qual se faz referencia só existe no contexto da trigger. Ela te devolve todas as colunas da tabela que sofreu a alteração.

    Então, de posse disso, basta dentro da trigger você inserir na sua tabela de historico, pegando o valor dessa tabela temporária.

    CREATE TRIGGER TGR_INS_ARTIGO ON ARTIGO FOR INSERT AS BEGIN 
    
    insert into artigo_historico (col1, col2, col3)
    values(INSERTED.col1, INSERTED.col2, INSERTED.col3)
    
    END GO

    quinta-feira, 4 de dezembro de 2014 15:45
  • Olá Flavio,

    Não sei se já conseguiu, mas segue uma trigger que eu monte;

    OBS: Quando a tabela artigo sofrer alteração, a trigger pega o valor que era anteriormente e insere na tabela de historico_artigo, só confira antes os nomes das colunas 

    CREATE TRIGGER [dbo].[TR_ARTIGO_AFTER_UPD] ON [dbo].[ARTIGO]  
    AFTER UPDATE  
    AS  
    BEGIN  
    -- Coloque o id_hist como identity na tabela historico_artigo
     INSERT INTO historico_artigo ( [ID_ART],
         [preco],  
         [ data_inicio],

         [ data_fim]

        )  

    --verifique o nome das colunas da tabela artigo e coloque-os corretamente mantendo -os na ordem do insert acima

      SELECT U.[ART_ID],U.[ART_PRECO],GETDATE(),GETDATE()    
         FROM DELETED  U  

    END  

           
    • Sugerido como Resposta AlineBC sexta-feira, 12 de dezembro de 2014 10:36
    • Marcado como Resposta flaviodantas quinta-feira, 18 de dezembro de 2014 15:53
    quinta-feira, 4 de dezembro de 2014 17:10