0

我已经实现了以下触发器:

CREATE TRIGGER [OnContactDeleted]
    ON [TABLE].[Contact]
    INSTEAD OF DELETE
    AS 
    BEGIN
        SET NOCOUNT ON
        /*Store contact ID to variable*/
        Update [TABLE].[Account] Set [PrimaryContactID] = null where [TABLE].[Account].[PrimaryContactID] = (Select ContactID from Deleted)
        Delete from [TABLE].[Contact] where [TABLE].[Contact].[ContactID] = (Select ContactID from Deleted)
    END

很显然是从另一个表中取出一组外键然后删除当前记录。这样做是因为在删除时将外键设置为 null 不起作用。

我的问题是关于将此触发器包装在 try...catch 块中,如果发生异常,我可以在其中回滚。这是一种好的做法吗?我应该为这种触发器做吗?

谢谢,杰森

4

1 回答 1

1

我宁愿让它失败并让异常在消费者中处理(执行 DELETE 语句的代码)。在此删除的上下文中不应该有任何逻辑原因并触发此操作失败,因此这将是导致失败的外部因素。因此,异常也应该在外部处理。通常 DELETE 也会发生在事务中,所以这就是发生回滚的地方。

于 2009-02-13T11:19:06.060 回答