Usuário com melhor resposta
Problema com trigger (update)

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
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
-
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
Todas as 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
-
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?
-
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
-