web-dev-qa-db-ja.com

データベースで外部キーのないすべてのテーブルを検索します

SQL Serverでは、次のいずれもないすべてのテーブルをどのように検索しますか。

  • 外部キー制約
  • 他のテーブルの外部キーによる参照
4
xameeramir

SwapnilBhateの回答 は、外部キーによって参照されるテーブルを返します。さらにLEFT JOINはこれらを除外します:

SELECT tbl.name 
FROM sys.tables AS tbl
    LEFT JOIN sys.foreign_key_columns AS fKey 
        ON tbl.object_id = fKey.parent_object_id
    LEFT JOIN sys.foreign_key_columns AS rKey 
        ON tbl.object_id = rKey.referenced_object_id
WHERE fKey.parent_object_id IS NULL 
    AND rKey.referenced_object_id IS NULL;
12
Sam

sp_fkeysプロシージャを使用して、論理外部キー情報を取得できます。ただし、実行する必要がある制限は、入力パラメーターとしてテーブル名を渡すことです。同じことに関する詳細情報は、MSDNライブラリの下にあります。

sp_fkeys

または、以下のクエリを使用してsys.tablesからすべてのテーブルを取得し、同じテーブルobject_idがsys.foreign_key_columnsに存在するかどうかを確認できます。

SELECT tbl.name
FROM sys.tables AS tbl
    LEFT JOIN sys.foreign_key_columns AS fKey
    ON tbl.object_id = fKey.parent_object_id
WHERE fKey.parent_object_id IS NULL
5
SwapnilBhate

完全を期すために、sys.foreign_key_columnsの代わりにsys.foreign_keysをクエリして、参照されておらず、他を参照していないテーブルを見つけることもできます。

SELECT
  schema_name = s.name,
  table_name  = t.name
FROM
  sys.tables AS t
  INNER JOIN sys.schemas AS s ON t.schema_id = s.schema_id
  LEFT JOIN sys.foreign_keys AS fk
    ON t.object_id IN (fk.parent_object_id, fk.referenced_object_id)
WHERE
  t.is_ms_shipped = 0
  AND fk.object_id IS NULL
;

クエリでは、各テーブルのスキーマ名も追加で表示されます。これは、システムがデフォルト以外のdboスキーマを使用して構築される場合があるためです。

検索からis_ms_shipped = 0フィルターも含めました。これは、定義済み/システムテーブルを検索から除外することを想定しているためです。

2
Andriy M