10

我想创建一个触发器来检查正在根据业务规则删除的内容,然后在需要时取消删除。有任何想法吗?

该解决方案使用了替代删除触发器。Rollback tran 停止了删除。我担心删除时会出现级联问题,但似乎没有发生。也许触发器不能自己触发。

4

4 回答 4

19

使用INSTEAD OF DELETE(请参阅MSDN)触发器并在触发器中决定您真正想要做什么。

于 2008-10-29T10:19:48.903 回答
9

该解决方案使用了替代删除触发器。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
于 2008-10-29T11:10:55.447 回答
1

触发器可以回滚当前事务,具有取消删除的效果。正如上面的海报还指出的那样,您也可以使用代替触发器。

于 2008-10-29T10:49:16.457 回答
1

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

发送到 DELETE 触发器的已删除表包含在发出 DELETE 语句之前存在的行的图像。

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

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

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

于 2008-10-29T10:59:14.173 回答