Ver Mensaje Individual
  #1 (permalink)  
Antiguo 12/10/2010, 15:56
Avatar de Danielfuzz
Danielfuzz
 
Fecha de Ingreso: septiembre-2007
Mensajes: 111
Antigüedad: 16 años, 7 meses
Puntos: 18
Problema con Trigger en SQL Server 2005

Hola foreros!!

tengo un problema con un trigger que se ejecuta al hacer un insert en una tabla.
Lo que pasa es que para hacer el insert llamo a un porcedimiento almacenado, éste hace una serie de validaciones, si esta todo OK hace el INSERT lo que ocasiona que se dispare el trigger pero algo pasa que me sale este mensaje:

Msg 3609, Level 16, State 1, Procedure sp_insDetallePago, Line 31
The transaction ended in the trigger. The batch has been aborted.


Lo más extrano es que se hace el insert correctamente en la tabla.

Cómo puedo solucionar esto?

Les paso el procedimiento y el trigger:

Código:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER PROCEDURE [dbo].[sp_insDetallePago]
	@pago int,
	@monto decimal(18,2),
	@boleta nchar(10),
	@msg nchar(100)=null OUTPUT
AS
BEGIN TRANSACTION
	SET NOCOUNT ON;
	IF dbo.validarBoleta(@boleta)=1
		SET @msg='Boleta válida'
	else
	BEGIN
		SET @msg='Boleta no válida'
		RAISERROR ('Boleta no válida', 
			8, -- Severidad 
			1   -- Estado
		)
		GOTO error
	END
	Declare @deuda decimal(18,2)
	SET @deuda=(Select (Monto-Cancelado) From vw_pagos where ID_Pago=@pago)
	IF @@ERROR<>0
		GOTO error
	IF @monto>@deuda
	BEGIN
		SET @msg='El monto a cancelar es mayor al adeudado'
		GOTO error
	END
	INSERT INTO DetallePago values(@pago, @monto, GETDATE(),@boleta)
	IF @@ERROR<>0
		GOTO error
COMMIT TRANSACTION
	return(0)
error:
ROLLBACK TRANSACTION
	print 'Error'
	return(1)
El trigger

Código:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO




ALTER TRIGGER [dbo].[trg_INS_DetallePago] on [dbo].[DetallePago] AFTER INSERT AS
	Declare @deuda decimal(18,2)
	Declare @monto decimal(18,2)
	Declare @boleta nchar(10)
	SET @boleta = (Select Boleta FROM INSERTED)
	SET @monto = (Select Monto FROM INSERTED)
	SET @deuda=(Select (Monto-Cancelado) From vw_pagos where ID_Pago=(SELECT ID_Pago FROM INSERTED))
	IF @@ERROR<>0
		GOTO error
	IF @monto<=0
	BEGIN
		print 'El monto a cancelar debe ser mayor a 0'
		GOTO error
	END	
	--IF @monto>@deuda
	IF @deuda<0
	BEGIN
		Declare @aux int
		SET @aux=(SELECT ID_Pago FROM INSERTED)
		print 'El monto a cancelar es mayor al adeudado'
		GOTO error
	END	
--	IF dbo.validarBoleta(@boleta)=0
--	BEGIN
--		print 'Boleta no válida'
--		GOTO error
--	END	
	--IF @deuda-@monto=0
	IF @deuda=0
		UPDATE Pago set Estado ='t' Where ID=(SELECT ID_Pago FROM INSERTED)
	ELSE
		UPDATE Pago set Estado ='c' Where ID=(SELECT ID_Pago FROM INSERTED)
	IF @@ERROR<>0
	BEGIN
		print 'No se pudo actualizar el estado del pago'
		GOTO error
	END
	COMMIT TRAN
	return
	error:
	ROLLBACK TRAN 
		print 'Error'
		return
Saludos!!