tsql - tabla - Cómo cancelo una eliminación en SQL
poner restricciones en sql (4)
Quiero crear un disparador para verificar qué se está eliminando contra las reglas comerciales y luego cancelar la eliminación si es necesario. ¿Algunas ideas?
La solución usó el disparador En lugar de Eliminar. El rollback tran detuvo la eliminación. Tenía miedo de tener un problema de cascada cuando lo eliminé, pero eso no pareció suceder. Tal vez un gatillo no se puede disparar a sí mismo.
De acuerdo con la documentación de MSDN sobre los desencadenadores INSTEAD OF DELETE
:
La tabla eliminada enviada a un desencadenador DELETE contiene una imagen de las filas tal como existían antes de que se emitiera la instrucción DELETE.
Si lo entiendo correctamente, el DELETE se está ejecutando. ¿Qué me estoy perdiendo?
De todos modos, no entiendo por qué quieres eliminar los registros y si las reglas comerciales no se pasan, entonces recupera esos registros. Juraría que debería ser más fácil probar si pasas las reglas de negocios antes de borrar los registros.
Y yo hubiera dicho que usara una transacción, no había escuchado antes sobre los desencadenadores INSTEAD OF
.
El desencadenador puede retrotraer la transacción actual, lo que tendrá el efecto de cancelar la eliminación. Como también lo indica el póster anterior, también puede usar un en lugar de desencadenar.
La solución usó el disparador En lugar de Eliminar. El rollback tran detuvo la eliminación. Tenía miedo de tener un problema de cascada cuando hice la eliminación, pero parece que eso no sucedió. Tal vez un gatillo no se puede disparar 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
Use un disparador INSTEAD OF DELETE
(vea MSDN ) y decida dentro del activador lo que realmente desea hacer.