シナリオ:
SQLServerDBAまたは開発者として作業しています。データベースからテーブルを削除する必要があります。ドロップテーブルSchemaName.TableNameステートメントを実行すると、以下のエラーが発生します。Msg 3726、レベル16、状態1、行12
オブジェクト'SchemaName.TableName'は、次の理由でドロップできませんでした。 FOREIGNKEY制約によって参照されます。
これで、テーブルが外部キー制約によって参照されることがわかりました。問題は、このテーブルを参照している外部キー制約を持つテーブルを見つける方法です。
解決策:
1)この情報を取得する方法はたくさんあります。システムビューを使用して、プライマリテーブルを参照している外部キー制約を持つテーブルの名前を見つけることができます。SELECT Schema_Name(Schema_id) as TableSchemaName, object_name(FK.parent_object_id) ParentTableName, object_name(FK.referenced_object_id) ReferenceTableName FROM sys.foreign_keys AS FK WHERE object_name(FK.referenced_object_id)='YourTableName' and Schema_Name(Schema_id)='YourTableSchemaName'
dboスキーマに存在するcustomerテーブルに対して上記のスクリプトを実行しました。これが、取得したものです。
> |
SQLServerでテーブルを参照しているテーブルの外部キーを見つける方法。 |
これで、Ordが、テーブルを参照している外部キー制約を持つテーブルであることがわかりました。先に進み、外部キー制約を削除してから、テーブルを削除できます。
2)システムストアドプロシージャ sp_fkeysを使用します。
システムストアドプロシージャを使用して、テーブルを参照している外部キー制約情報を取得できます。テーブル名がCustomerの場合、次のようにスクリプトを実行できます
EXEC sp_fkeys 'Customer'
SQLServerでテーブルの外部キー制約名を取得する方法 |
sp_fkeysは非常に詳細な情報を返しますが、上記のスナップショットに表示されていない列はいくつかあります。返される列のリストは次のとおりです。
- PKTABLE_QUALIFIER
- PKTABLE_OWNER
- PKTABLE_NAME
- PKCOLUMN_NAME
- FKTABLE_QUALIFIER
- FKTABLE_OWNER
- FKTABLE_NAME
- FKCOLUMN_NAME
- KEY_SEQ
- UPDATE_RULE
- DELETE_RULE
- FK_NAME
- PK_NAME
ビデオデモ:外部キー制約によって参照されているため、オブジェクトを削除できませんでした