Pregunta

Deseo crear un activador para verificar lo que se está eliminando con respecto a las reglas comerciales y luego cancelar la eliminación si es necesario. ¿Alguna idea?

La solución usó el disparador en lugar de eliminar. El rol Rollback detuvo la eliminación. Tenía miedo de tener un problema en cascada cuando borré, pero eso no pareció suceder. Tal vez un disparador no puede activarse solo.

¿Fue útil?

Solución

Utilice un EN LUGAR DE BORRAR (consulte MSDN ) dispara y decide dentro del gatillo lo que realmente quieres hacer.

Otros consejos

La solución usó el disparador en lugar de eliminar. El rol Rollback detuvo la eliminación. Tenía miedo de tener un problema en cascada cuando borré, pero eso no pareció suceder. Tal vez un disparador no puede dispararse a sí mismo. De todos modos, gracias a todos por su ayuda.

ALTER TRIGGER [dbo].[tr_ValidateDeleteForAssignedCalls]
on [dbo].[CAL]
   INSTEAD OF DELETE
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    DECLARE @RecType VARCHAR(1)
    DECLARE @UserID VARCHAR(8)
    DECLARE @CreateBy VARCHAR(8)
    DECLARE @RecID VARCHAR(20)

    SELECT @RecType =(SELECT RecType FROM DELETED)
    SELECT @UserID =(SELECT UserID FROM DELETED)
    SELECT @CreateBy =(SELECT CreateBy FROM DELETED)
    SELECT @RecID =(SELECT RecID FROM DELETED)

     -- Check to see if the type is a Call and the item was created by a different user
    IF @RECTYPE = 'C' and not (@USERID=@CREATEBY)

    BEGIN
        RAISERROR ('Cannot delete call.', 16, 1)
        ROLLBACK TRAN
        RETURN
    END

     -- Go ahead and do the update or some other business rules here
    ELSE
        Delete from CAL where RecID = @RecID    

END

El activador puede revertir la transacción actual, lo que tendrá el efecto de cancelar la eliminación. Como también se indica en el póster anterior, también puede usar un disparador en lugar de un disparador.

De acuerdo con la documentación de MSDN sobre los desencadenantes INSTEAD OF DELETE :

  

La tabla eliminada enviada a un BORRAR   el disparador contiene una imagen de las filas   tal como existían antes de ELIMINAR   se emitió una declaración.

Si lo entiendo correctamente, DELETE se está ejecutando. ¿Qué me estoy perdiendo?

De todos modos, no entiendo por qué desea eliminar los registros y si no se aprueban las reglas de negocio, elimine esos registros. Habría jurado que debería ser más fácil probar si pasa las reglas comerciales antes de eliminar los registros.

Y hubiera dicho que usara una transacción, no había escuchado antes sobre los desencadenantes INSTEAD OF .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top