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:
El triggerSET 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)
Código:
Saludos!! 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