【问题标题】:Aborting a stored procedure on foreign key constraint violations因违反外键约束而中止存储过程
【发布时间】:2011-11-03 19:25:17
【问题描述】:

如果由于违反外键约束而无法成功执行删除语句,是否有办法中止 SQL Server 中的存储过程?默认情况下,该过程似乎会忽略错误并继续执行下一条语句。

但是,对于其他类型的错误(例如,从不存在的表中删除),过程中止。

示例程序:

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE  [dbo].[TestSP]
AS
BEGIN
    SET NOCOUNT ON;

    print 'BEFORE';

    DELETE FROM ExistingWithConstraints;
    print 'AFTER DELETE ExistingWithConstraints';

    DELETE FROM NonExisting;
    print 'AFTER DELETE NonExisting';
END

产生输出(注意上面的最后一条消息没有打印出来):

BEFORE
<snip constraint violation error message>
AFTER DELETE ExistingWithConstraints    
<snip invalid object name error message>

【问题讨论】:

    标签: sql-server stored-procedures


    【解决方案1】:

    使用事务和正确的错误处理

    CREATE PROCEDURE  [dbo].[TestSP]
    AS
    SET XACT_ABORT, NOCOUNT ON
    DECLARE @starttrancount int
    
    BEGIN TRY
        SELECT @starttrancount = @@TRANCOUNT
    
        IF @starttrancount = 0
            BEGIN TRANSACTION
    
        DELETE FROM ExistingWithConstraints;
        DELETE FROM NonExisting;
    
        IF @starttrancount = 0 
            COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
        IF XACT_STATE() <> 0 AND @starttrancount = 0 
            ROLLBACK TRANSACTION
        RAISERROR [rethrow caught error using @ErrorNumber, @ErrorMessage, etc]
    END CATCH
    GO
    

    这是基于我在这里的回答:Nested stored procedures containing TRY CATCH ROLLBACK pattern?

    【讨论】:

    • 如果@@TRANCOUNT &gt; 0,您可以使用保存点回滚仅由TestSP 完成的错误处理程序修改——我们在这里使用的更通用的模式。
    • @wqw:我自己不使用保存点:数据库调用应该是原子的。如果你点击我的链接,你会看到 Remus 使用这些的另一个模板。您还必须小心使用 XACT_ABORT 来破坏交易
    【解决方案2】:

    继续执行以允许您检查@@ERROR 标准变量是否存在问题。一种更现代的做事方式,尽管它使用了 2005 年添加到 SQL 中的 TRY..CATCH 块:

    http://msdn.microsoft.com/en-us/library/ms179296.aspx

    【讨论】:

    • @gbn:为什么不呢? - 我仍然看到很多 procs 是这样编码的(当然不是我!)
    • 是时候我们开始教育他们了,不是吗。
    猜你喜欢
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 2023-02-08
    • 1970-01-01
    相关资源
    最近更新 更多