FK を介して削除する行を参照している行がある場合、その行を削除することはできません。
DELETEステートメントを実行する前に、削除する行を参照している行があるかどうかを知ることはできますか?
FK を介して削除する行を参照している行がある場合、その行を削除することはできません。
DELETEステートメントを実行する前に、削除する行を参照している行があるかどうかを知ることはできますか?
このスクリプトは、削除しようとしている行を参照する行を持つすべてのテーブルを表示します。
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)
外部キーが複合ではないという前提。
オプション 1 (検出) :
を実行しSelect Statement
て、削除するレコードを参照しているレコードがあるかどうかを確認します。必要に応じて、それを参照しているレコードを手動で削除します。これはトリガーを使用して達成することもできますが、トリガーを使用しないことをお勧めします。
オプション 2 (自動化) :
カスケード削除を調べることができます。正しく構成されていれば、削除されるレコードを参照するすべてのレコードも削除されます。
カスケード削除を使用する場合( Joel Coehoornによって書かれたテキストからの言い換え)
これは、stackoverflowのCascading Deletesに関する素晴らしい議論です。
誰もそれについて言及していませんが、記録のために私は多くの手順を使用しています
sp_helpconstraint 'dbo.mytable'
dbo.mytable に関連するすべての制約と、どのテーブルが dbo.mytable を参照しているかを見つけるためです。とても便利で便利だと思います。