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))