Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Evandro Sousa

[Resolvido] problemas na criação de trigger

Recommended Posts

Boa tarde pessoal, eu estou iniciando minha jornada com SQLServer, e agora me deparei com um problema ao criar uma trigger, é o seguinte:

Tenho um programa em C#, que o usuario irá criar um pedido, seguido de itens, e quando ele pedir para salvar eu gostaria de pegar os dados salvos na tabela de itensPedido e salvasse na historicoItensPedido.

 

Tentei fazer a trigger da seguinte maneira:

CREATE TRIGGER trgItensPedido
ON ItensPedido
FOR AFTER INSERT, UPDATE
AS  
BEGIN 
	INSERT INTO historicoItensPedido
	VALUES
	(
		
	);

Porém não estou sabendo como fazer o insert nela, pois os dados serão salvos na tabela ItensPedido, para depois serem salvos nela.

 

Vcs poderiam me ajudar?

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Eriva,

Cara esses sites me ajudaram bastante. Consegui criar a Trigger, mas aconteceu o seguinte, minha trigger funcionou apenas uma vez e depois deu erro.

 

Trigger criada:

ALTER TRIGGER [dbo].[trgOnInsertUsuario] ON [dbo].[tbUsuario]
FOR INSERT
AS
	IF(SELECT COUNT(*) FROM INSERTED) = 1
		SELECT cpf, nome, email
		INTO tbUsuarioHist
		FROM tbUsuario

Foi inserido dois registros que eu já tinha feito na primeira vez que executei a trigger, quando tentei executar pela segunda vez ele deu o seguinte erro:

 

Msg 2714, Level 16, State 6, Procedure trgOnInsertUsuario, Line 5

There is already an object named 'tbUsuarioHist' in the database.

 

Por um acaso qndo se usa INTO ele cria um objeto? no INTO do meu código eu passo o nome da tabela que deverá ser salvo o mesmo conteudo.

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Msg 2714, Level 16, State 6, Procedure trgOnInsertUsuario, Line 5

There is already an object named 'tbUsuarioHist' in the database.

 

Por um acaso qndo se usa INTO ele cria um objeto? no INTO do meu código eu passo o nome da tabela que deverá ser salvo o mesmo conteudo.

 

Abraços.

 

exacto, ocorreu o erro na segunda vez, pq. o INTO criou o objecto na primeira vez, utilize o comando INSERT com o SELECT, veja exemplo no site oficial: http://msdn.microsoft.com/en-us/library/ms174335.aspx

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eriva, tudo bem?

Rapaz esta quase tudo correto, mas apenas para finalizar poderia me tirar mais uma duvida?

Seguinte, a trigger funcionou normalmente qndo usei duas tabelas sem ser auto-numericas IDENTITY(1,1), mas qndo fui utilizar tabelas auto-numericas deu esse erro:

 

An explicit value for the identity column in table 'historicoItensPedido' can only be specified when a column list is used and IDENTITY_INSERT is ON.

 

Sabe o que acontece?

As duas tem os mesmos campos, uma é apenas para salvar log.

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eriva, me desculpe, eu acabei não falando tudo.

Na tabela historicoItensPedido eu gostaria de gravar um novo id para cada item alterado ou inserido, por isso preciso do IdAutoNumerico.

Atualmente o meu id esta assim:

[idHistItensPedido] [bigint] NOT NULL,
Mas o correto para o que eu preciso seria:

[idHistItensPedido] [bigint] IDENTITY(1,1) NOT NULL,
Mas quando deixo Identity ele da aquele erro, parece q ele esta tentando salvar o id da outra tabela nesse id.

 

Estou fazendo a trigger dessa maneira:

 

ALTER TRIGGER [dbo].[trgItensPedido]
ON [dbo].[ItensPedido]
FOR INSERT, UPDATE
AS
	IF(SELECT COUNT(*) FROM INSERTED) = 1
		INSERT INTO historicoItensPedido
		SELECT
			fkPedido, 
			fkItem, 
			quantidade, 
			bonificado, 
			CONVERT(int,dtEntrada ),
			CONVERT(int,dtAtualizacao),
			fkUsuarioAtualizacao,
			quantidadeAnterior,
			quantidadeAtual,
			aliquitaIcmsAnterior,
			custoCompraAnterior,
			custoOperacionalAnterior,
			margemAnterior,
			cargaTributariaAnterior,
			precoVendaAnterior,
			precoVendaAnterior,
			fabricanteAnterior,
			descricaoAnterior
		FROM INSERTED

Como pode ver, não estou pedindo para salvar o ID da ItensPedido. Atualmente a HistoricoItensPedido esta sem ser autoNumerico e esta funcionando, mas ela deve ser autoNumerico como te disse anteriormente.

 

Vlw pela força, Abraços.

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

no comando INSERT INTO, informe os campos que vai estar inserindo, EX.

INSERT INTO (CAMPO1, CAMPO2)
SELECT CAMPOX, CAMPOY FROM INSERTED

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eriva, muito obrigado por toda ajuda e compreensão.

 

Já esta tudo beleza.

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.