16

FK を介して削除する行を参照している行がある場合、その行を削除することはできません。

DELETEステートメントを実行する前に、削除する行を参照している行があるかどうかを知ることはできますか?

4

4 に答える 4

24

このスクリプトは、削除しようとしている行を参照する行を持つすべてのテーブルを表示します。

declare @RowId int = 1
declare @TableName sysname = 'ParentTable'

declare @Command varchar(max) 

select @Command = isnull(@Command + ' union all ', '') + 'select ''' + object_name(parent_object_id) + 
    ''' where exists(select * from ' + object_name(parent_object_id) + ' where ' + col.name+ ' = ' + cast(@RowId as varchar) + ')' 
from sys.foreign_key_columns fkc
    join sys.columns col on
        fkc.parent_object_id = col.object_id and fkc.parent_column_id = col.column_id
where object_name(referenced_object_id) = @TableName

execute (@Command)

外部キーが複合ではないという前提。

于 2011-06-10T05:19:35.300 に答える
3

オプション 1 (検出) :

を実行しSelect Statementて、削除するレコードを参照しているレコードがあるかどうかを確認します。必要に応じて、それを参照しているレコードを手動で削除します。これはトリガーを使用して達成することもできますが、トリガーを使用しないことをお勧めします。

オプション 2 (自動化) :

カスケード削除を調べることができます。正しく構成されていれば、削除されるレコードを参照するすべてのレコードも削除されます。

カスケード削除を使用する場合( Joel Coehoornによって書かれたテキストからの言い換え)

  • カスケード削除は、リレーションシップのセマンティクスに「is part of」記述が含まれる場合に意味があります。例: Web 注文、Web 注文品目
  • 履歴を保持している場合、または削除されたビット列のみを設定する論理的な削除を使用している場合は、カスケード削除を使用しないでください。
  • 外部キーを間違って設定すると、カスケードによって問題が発生する可能性があります。
  • 完全に理解する前にカスケードを使用するのは賢明ではありません。ただし、これは便利な機能であるため、時間をかけて理解する価値があります。

これは、stackoverflowのCascading Deletesに関する素晴らしい議論です。

于 2011-06-10T04:28:14.827 に答える
0

誰もそれについて言及していませんが、記録のために私は多くの手順を使用しています

sp_helpconstraint 'dbo.mytable'

dbo.mytable に関連するすべての制約と、どのテーブルが dbo.mytable を参照しているかを見つけるためです。とても便利で便利だと思います。

于 2014-04-30T09:35:36.933 に答える