none
Problema com trigger (update) RRS feed

  • Pergunta

  • Amigos, boa tarde.

    Estou com algumas dificuldades em criar uma trigger pela primeira vez no SQL Server 2014, eis a questão:

    Possuo uma tabela INVENTARIO:

    Colunas:

    Placa_mae             /tpo_memoria   /   total_slots/Lmt_memoria

    C2014-BAT-J1800/null            /1            /8192

    Estou tentando fazer uma trigger que após o insert das informações localize o tipo da placa mãe, e de um update nos campos tpo_memoria/total_slots/Lmt_memoria, com os valores que eu pretendo fixar na trigger.

    Até agora pesquisando aqui e em outros foruns cheguei a isto, mas não está funcionando, alguém pode ajudar?

    Create Trigger tgrCadastro
    On [inventario] 
    After Insert
    as
    
    Begin
    
       Update A 
          set A.TPO_MEMO = 'DDR3', 
    		  a.TOTAL_SLOTS = 1, 
    		  a.LMT_MEMORIA = 8192
         From inventario A
         where a.PLACA_MAE like '%C2014-BAT-J1800%' ;
    End
    
    GO
    E a última dúvida, eu posso inserir outros updates dentro do mesmo BEGIN?(no caso para outras placas diferentes)


    • Editado Wfrancischini sexta-feira, 14 de agosto de 2015 18:57 Formatação
    sexta-feira, 14 de agosto de 2015 18:42

Respostas

  • Boas,

    Vê se assim lhe resolve, testei aqui e funcionou.

    use DATABASE
    IF OBJECT_ID('name_trigger') IS NOT NULL
    DROP TRIGGER name_trigger'
    GO
    
    CREATE TRIGGER name_trigger'
    ON dbo.Table
    AFTER INSERT AS
    BEGIN
    
    UPDATE [dbo].[tabçe]
       SET [campoid] = 600,
          [campo] = 'AAAA',
          [campo] = 'BBB'
     WHERE placa_mae like '%C2014-BAT-J1800%'
    SELECT * FROM INSERTED
    END
    GO
    
    
    // Execute este inserte e teste a trigger
    INSERT INTO table(campos, campos, campos) VALUES (510, 'Vish2', 'Dalvi') 

    Respondendo a sua última dúvida, você pode ter quantos updates quiser na trigger.

    Atenciosamente, Roberto Alves



    • Editado Roberto AB Filho sexta-feira, 14 de agosto de 2015 19:45
    • Marcado como Resposta Marcos SJ sexta-feira, 14 de agosto de 2015 19:56
    sexta-feira, 14 de agosto de 2015 19:35
  • Wfrancischini,

    Você quer disparar um trigger com base no processamento que for gerado pelo Bulk Insert?

    Se for isso recomendo não pensar neste tipo de cenário, pois se você estiver planejando inserir um massa de dados poderá ter graves problemas de performance.

    Outra coisa, quando utilizamos Bulk Insert, você não pode trabalhar com Trigger After Insert, no caso tem que ser For Insert na declaração do Trigger.

    Veja este exemplo:

    ALTER TRIGGER [dbo].[Invoice_Line_Temp_Insert]
    
    on [dbo].[Invoice_Line_Temp]
    
    for Insert
    
    As
    
    BEGIN
    
     
    
    UPDATE il
    
    SET Item_Desc = i.Item_Desc,
    
    Invoice_Date = i.Invoice_Date,
    
    Group_Number = i.Group_Number,
    
    Item_Code = i.Item_Code,
    
    Quantity_Sold = i.Quantity_Sold,
    
    Section_Number = i.Section_Number,
    
    LastUpdate = i.LastUpdate
    
    FROM dbo.invoice_line il
    
    INNER JOIN inserted
    
    ON il.transaction_id = i.Transaction_id
    
    AND il.Line_Number = i.Line_Number
    
     
    
    INSERT INTO dbo.Invoice_Line
    
    (InvoiceLineId,Transaction_ID,Line_Number,Item_Desc,Invoice_Date,
    
    Group_Number,Item_Code,Quantity_Sold,Section_Number,LastUpdate)
    
    SELECT newid(), i.Transaction_id, i.Line_number, i.Item_Desc, i.Invoice_Date,
    
    i.GroupNumber, i.Item_Code, i.Quantity_Sold, i.Section_Number, i.LastUpdate
    
    FROM inserted
    
    WHERE NOT EXISTS
    
    ( SELECT * FROM dbo.Invoice_Line il
    
    WHERE il.transaction_id = i.Transaction_id
    
    AND il.Line_Number = i.Line_Number)
    
    END
    Este tipo de trigger é mais conhecido como Fire_Triggers.


    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta Wfrancischini segunda-feira, 17 de agosto de 2015 20:51
    sábado, 15 de agosto de 2015 01:07

Todas as Respostas

  • Boa tarde,

    E qual o erro?

    Sendo que você está fixando informações.

    Atenciosamente, Roberto Alves

    sexta-feira, 14 de agosto de 2015 19:04
  • Então, na verdade não há erro, eu repito a operação de insert, mas a trigger não é acionada..., nesse caso postado após o insert o campo TPO_memoria deveria ser preenchido com a string "DDR3", mas nada acontece.

    sexta-feira, 14 de agosto de 2015 19:14
  • Boas,

    Vê se assim lhe resolve, testei aqui e funcionou.

    use DATABASE
    IF OBJECT_ID('name_trigger') IS NOT NULL
    DROP TRIGGER name_trigger'
    GO
    
    CREATE TRIGGER name_trigger'
    ON dbo.Table
    AFTER INSERT AS
    BEGIN
    
    UPDATE [dbo].[tabçe]
       SET [campoid] = 600,
          [campo] = 'AAAA',
          [campo] = 'BBB'
     WHERE placa_mae like '%C2014-BAT-J1800%'
    SELECT * FROM INSERTED
    END
    GO
    
    
    // Execute este inserte e teste a trigger
    INSERT INTO table(campos, campos, campos) VALUES (510, 'Vish2', 'Dalvi') 

    Respondendo a sua última dúvida, você pode ter quantos updates quiser na trigger.

    Atenciosamente, Roberto Alves



    • Editado Roberto AB Filho sexta-feira, 14 de agosto de 2015 19:45
    • Marcado como Resposta Marcos SJ sexta-feira, 14 de agosto de 2015 19:56
    sexta-feira, 14 de agosto de 2015 19:35
  • Roberto, realmente usando a sua trigger ela foi acionada realizando o teste de insert manualmente.

    Mas no meu caso real, esta tabela INVENTARIO é carregada bia BULK INSERT:

    truncate table dbo.INVENTARIO;
    go
    BULK INSERT dbo.INVENTARIO
    FROM 'C:\INVENTARIO.csv'
    WITH
    (
     FIRSTROW = 2,
     FIELDTERMINATOR = ',',
     ROWTERMINATOR = '\n'
    )
    GO
    Tem alguma relação esse tipo de insert não ser reconhecido pela Trigger?

    sexta-feira, 14 de agosto de 2015 20:05
  • Wfrancischini,

    Você quer disparar um trigger com base no processamento que for gerado pelo Bulk Insert?

    Se for isso recomendo não pensar neste tipo de cenário, pois se você estiver planejando inserir um massa de dados poderá ter graves problemas de performance.

    Outra coisa, quando utilizamos Bulk Insert, você não pode trabalhar com Trigger After Insert, no caso tem que ser For Insert na declaração do Trigger.

    Veja este exemplo:

    ALTER TRIGGER [dbo].[Invoice_Line_Temp_Insert]
    
    on [dbo].[Invoice_Line_Temp]
    
    for Insert
    
    As
    
    BEGIN
    
     
    
    UPDATE il
    
    SET Item_Desc = i.Item_Desc,
    
    Invoice_Date = i.Invoice_Date,
    
    Group_Number = i.Group_Number,
    
    Item_Code = i.Item_Code,
    
    Quantity_Sold = i.Quantity_Sold,
    
    Section_Number = i.Section_Number,
    
    LastUpdate = i.LastUpdate
    
    FROM dbo.invoice_line il
    
    INNER JOIN inserted
    
    ON il.transaction_id = i.Transaction_id
    
    AND il.Line_Number = i.Line_Number
    
     
    
    INSERT INTO dbo.Invoice_Line
    
    (InvoiceLineId,Transaction_ID,Line_Number,Item_Desc,Invoice_Date,
    
    Group_Number,Item_Code,Quantity_Sold,Section_Number,LastUpdate)
    
    SELECT newid(), i.Transaction_id, i.Line_number, i.Item_Desc, i.Invoice_Date,
    
    i.GroupNumber, i.Item_Code, i.Quantity_Sold, i.Section_Number, i.LastUpdate
    
    FROM inserted
    
    WHERE NOT EXISTS
    
    ( SELECT * FROM dbo.Invoice_Line il
    
    WHERE il.transaction_id = i.Transaction_id
    
    AND il.Line_Number = i.Line_Number)
    
    END
    Este tipo de trigger é mais conhecido como Fire_Triggers.


    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta Wfrancischini segunda-feira, 17 de agosto de 2015 20:51
    sábado, 15 de agosto de 2015 01:07
  • Obrigado Junior, funcionou perfeitamente.

    Obrigado também ao Roberto.

    segunda-feira, 17 de agosto de 2015 20:50