Tsql T-SQL:DBCC检查约束后有没有回滚的方法?

Tsql T-SQL:DBCC检查约束后有没有回滚的方法?,tsql,transactions,constraints,Tsql,Transactions,Constraints,我有一个启动事务的存储过程。在它里面,我禁用了一些约束。我修改了数据。然后启用约束。 我想要的是,如果SP末尾的数据不一致(当然是在调用commit之前),则回滚 目前,我最后运行了DBCC CHECKCONSTRAINTS,以查看哪些内容被破坏。 但是当DBCC CHECKCONSTRAINTS输出任何数据时,我可以回滚吗 或者更好:如果任何约束被破坏,DBCC CHECKCONSTRAINTS是否会引发错误?当您再次启用约束时,请使用带有CHECK的选项,而不是使用DBCC CHECKCON

我有一个启动事务的存储过程。在它里面,我禁用了一些约束。我修改了数据。然后启用约束。 我想要的是,如果SP末尾的数据不一致(当然是在调用commit之前),则回滚

目前,我最后运行了DBCC CHECKCONSTRAINTS,以查看哪些内容被破坏。 但是当DBCC CHECKCONSTRAINTS输出任何数据时,我可以回滚吗


或者更好:如果任何约束被破坏,DBCC CHECKCONSTRAINTS是否会引发错误?

当您再次启用约束时,请使用带有CHECK的
选项,而不是使用DBCC CHECKCONSTRAINTS

ALTER TABLE YourTable WITH CHECK CHECK CONSTRAINT YourConstraint;
如果存在违规行为,则会出现如下错误:

Msg 547, Level 16, State 0, Line 15
The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "YourConstraint". The conflict occurred in database "YourDatabase", table "YourTable", column 'YourColumn'.
使用下面的示例代码进行简单演示

use tempdb
go

create table a (
    id int primary key
)

create table b (
    id int
) 

alter table b add constraint x foreign key (id) references a(id)

alter table b nocheck constraint x

insert into b (id) values (1)

alter table b with check check constraint x
go

drop table b
drop table a
go

我不明白。为什么要禁用约束,然后尝试自己手动检查它们?只需让它们处于启用状态,并捕获/回滚该错误。因为我在SP内执行了一些打破约束的数据操作。SP完成后,一切都应该正常。如果没有所有详细信息,我不能肯定,但这听起来像是以错误的顺序执行操作。这是一个巨大的数据导入SP,会在一段时间内中断关系。并逐步导入新数据(插入、提取、删除)。让我们假设它这样做是有原因的。有没有办法使DBCC CHECKCONSTRAINTS引发错误?