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

解决方案使用了“替代删除”触发器。 Rollback tran停止了删除。当我做删除时,我担心会遇到级联问题,但似乎没有发生。也许触发器无法触发自己。

有帮助吗?

解决方案

使用 INSTEAD OF DELETE (参见 MSDN )触发并在触发器内决定你真正想要做什么。

其他提示

解决方案使用了“替代删除”触发器。 Rollback tran停止了删除。当我做删除时,我担心会遇到级联问题,但似乎没有发生。也许触发器无法触发自身。无论如何,感谢大家的帮助。

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

触发器可以回滚当前事务,这将取消删除。如上面的海报也说明,您也可以使用而不是触发器。

根据MSDN关于 INSTEAD OF DELETE 触发器的文档:

  

删除的表发送到DELETE   trigger包含行的图像   因为它们在DELETE之前存在   声明已经发布。

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

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

我会说使用一个事务,我之前没有听说过 INSTEAD OF 触发器。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top