¿Cómo cancelo un Eliminar en SQL?
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.
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
.