2010-11-24 8 views
2

私はトランザクションを開始するストアドプロシージャを持っています。その中で、いくつかの制約を無効にします。私はデータを修正する。そして、制約を有効にします。 私が望むのは、データがSPの最後に矛盾している場合(もちろんコミットを呼び出す前に)ロールバックすることです。T-SQL:DBCC CHECKCONTRAINTSの後にロールバックする方法はありますか?

現在、私は最後にDBCC CHECKCONSTRAINTSを実行して、何が壊れていたかを確認します。 DBCC CHECKCONSTRAINTSがデータを出力するときにロールバックできますか?

またはそれより良い:制約のいずれかが壊れていると、DBCC CHECKCONSTRAINTSでエラーが発生する可能性がありますか?

+0

私はそれを得ていません。制約を無効にして手動で手動でチェックしようとするのはなぜですか?そのエラーを有効にしてCATCH/ROLLBACKのままにしておきます。 –

+0

私はSP内の制約を破るいくつかのデータ操作を行うので。 SPが終了したら、すべてOKになります。 – Evgenyt

+0

私はすべての細部を除いて確実に言うことはできませんが、間違った順序で操作を行う場合のように聞こえます。 –

答えて

3

DBCC CHECKCONSTRAINTSを使用する代わりに、再度制約を有効にする場合は、WITH CHECKオプションを使用してください。

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 
+0

素晴らしい!できます – Evgenyt

関連する問題