2016-06-24 8 views
0

私は外部キー制約として11の他のテーブルによって参照されるテーブルを持っています。私はそれから行を削除しようとすると、明らかに他のテーブルをチェックして、他のレコードをカスケードして削除する必要があるかどうかを確認します。私は削除しているテーブルと他のテーブルで制約を無効にしようとしましたが、動作しませんでした(結果パネルにはまだ "影響を受けた0行"の11行があります)。SQL Serverの外部インデックス、トリガーなどをチェックせずに行を削除する

私はすでに子供を削除していますが、どうしてカスケードをチェックするためにこれらのテーブルに移動しないのですか?ここで私はこれをテストしてきました。

BEGIN TRANSACTION 
    ALTER TABLE Table1 NOCHECK CONSTRAINT ALL 
    ALTER TABLE Table2 NOCHECK CONSTRAINT ALL 

    DELETE FROM Table2 
    WHERE id IN (100, 101) 

    ALTER TABLE Table2 CHECK CONSTRAINT ALL 
    ALTER TABLE Table1 CHECK CONSTRAINT ALL 
ROLLBACK 
+0

「それは働いていない」の追加と、おそらく不要なI/O:このコードを試してみてください - エラーメッセージを共有するように気をつけますか? –

+0

実際のエラーではありません。障害が作動していた場合、他の表に対して結果パネルに「影響を受けた0行」が表示されないことが想像されます。 –

+0

ばかげた質問:id = 100,101のレコードはありますか? –

答えて

0

ところで、あなたはデータの完全性を破るかなり危険な立場にあります。あなたのFKはもう信頼されていません後を意味

CREATE TABLE C1(ID INT IDENTITY(1,1) PRIMARY KEY); 
GO 
INSERT INTO C1 DEFAULT VALUES; 
GO 10 
GO 
SELECT * INTO C2 FROM C1; 
GO 
ALTER TABLE C2 WITH CHECK ADD CONSTRAINT FK_C12 FOREIGN KEY(ID) REFERENCES C1 (ID); 
GO 
BEGIN TRANSACTION 
    SELECT is_not_trusted from sys.foreign_keys WHERE name = 'FK_C12'; 
    ALTER TABLE C1 NOCHECK CONSTRAINT ALL 
    ALTER TABLE C2 NOCHECK CONSTRAINT ALL 
    DELETE FROM C1 WHERE ID = 5; 
    ALTER TABLE C2 CHECK CONSTRAINT ALL 
    ALTER TABLE C1 CHECK CONSTRAINT ALL 
    SELECT is_not_trusted from sys.foreign_keys WHERE name = 'FK_C12'; 
ROLLBACK 

enter image description here
はあなたが別の思い付くかもしれない/低速の実行計画と

関連する問題