Tsql 如何在SQL中取消删除

Tsql 如何在SQL中取消删除,tsql,triggers,Tsql,Triggers,我想创建一个触发器,根据业务规则检查要删除的内容,然后根据需要取消删除。有什么想法吗 解决方案使用了而不是Delete触发器。回滚传输已停止删除。我担心删除时会出现级联问题,但这似乎没有发生。可能触发器本身无法触发。使用而不是DELETE(请参阅)触发器,并在触发器内决定您真正想要做什么。触发器可以回滚当前事务,这将具有取消删除的效果。正如上面的海报所述,您也可以使用instead of触发器。根据MSDN文档中关于而不是DELETE触发器: 已删除的表已发送到删除服务器 触发器包含行的映像 因

我想创建一个触发器,根据业务规则检查要删除的内容,然后根据需要取消删除。有什么想法吗


解决方案使用了而不是Delete触发器。回滚传输已停止删除。我担心删除时会出现级联问题,但这似乎没有发生。可能触发器本身无法触发。

使用
而不是DELETE
(请参阅)触发器,并在触发器内决定您真正想要做什么。

触发器可以回滚当前事务,这将具有取消删除的效果。正如上面的海报所述,您也可以使用instead of触发器。

根据MSDN文档中关于
而不是DELETE
触发器:

已删除的表已发送到删除服务器 触发器包含行的映像 因为它们在删除之前就存在 发表声明

如果我理解正确,删除实际上正在执行。我错过了什么

无论如何,我不明白为什么要删除这些记录,如果业务规则未通过,则取消删除这些记录。我发誓,如果你在删除记录之前通过了业务规则,那么测试应该会更容易


我会说使用事务,我以前没有听说过
而不是
触发器。

解决方案使用了
而不是Delete触发器。回滚传输已停止删除。我担心删除时会出现级联问题,但似乎没有发生。也许触发器本身无法触发。无论如何,谢谢大家的帮助

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

在决定答案之前,先看看其他人的贡献是值得的。问题不到一个小时,问题是应用程序允许用户删除分配给他们的内容,但由于我没有源代码,只能在DB级别停止。我不希望用户删除分配给他们但尚未完成的任务。如果尝试删除多条记录,则会出现错误:子查询返回的值超过1。当子查询在=、!=、=或者当子查询用作表达式时。因此,您需要以另一种方式检查权限(如从删除的位置选择@C=count(1))