0

複合外部キーのどの列が主/一意キーのどの列に対応するかを示すSQLクエリをまとめたいと思います。

たとえば、データベースに

CREATE TABLE TA
(
    B int,
    C int
)

ALTER TABLE TA ADD CONSTRAINT [UK_CB] UNIQUE NONCLUSTERED 
(
    C ASC,
    B ASC
)

CREATE TABLE TB
(
    D int,
    E int
)

ALTER TABLE TB ADD CONSTRAINT [FK_TA] FOREIGN KEY (D, E) REFERENCES TA(C, B)

次に、クエリが返されるようにします

| Pk/Uk | PK/UK Column |  FK   | FK Column |
--------------------------------------------
| UK_CB |      C       | FK_TA |     D     |
| UK_CB |      B       | FK_TA |     E     |

可能であれば、INFORMATION_SCHEMA ビューのみを使用したいと考えています。

INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE を認識していますが、特定の制約の列しか得られません。

INFORMATION_SCHEMA.COLUMNS に参加して序数の位置で何かを行うこともできますが、それはキー参照が序数であるという誤った仮定をします。

データベースにクエリを実行して、複合キー間の列の対応を取得する方法はありますか?

4

1 に答える 1

0

INFORMATION_SCHEMA ビューで検証済みの列の順序が見つかりません。ただし、(INFORMATION_SCHEMA ビューの代わりに) システム カタログ ビューを使用できる場合は、次のことができます (Here's a sql fiddle )。それを pk / uk に直接関連付ける方法はわかりませんが、pk / uk テーブルの列を見つけることができます。

SELECT
  fk.name as constraint_name,
  sfkc.constraint_column_id,
  sfkc.parent_column_id,
  fkt.name as fk_table,
  fkc.name as fk_column,
  sfkc.referenced_column_id,
  pkt.name as pk_table,
  pkc.name as pk_column
FROM sys.foreign_keys AS fk
JOIN sys.foreign_key_columns AS sfkc
  ON fk.object_id = sfkc.constraint_object_id
JOIN sys.tables AS fkt
  ON  sfkc.parent_object_id = fkt.object_id
JOIN sys.columns as fkc
  ON fkt.object_id = fkc.object_id
 AND sfkc.parent_column_id = fkc.column_id
JOIN sys.tables AS pkt
  ON sfkc.referenced_object_id = pkt.object_id
JOIN sys.columns as pkc
  ON pkt.object_id = pkc.object_id
 AND sfkc.referenced_column_id = pkc.column_id
于 2012-12-21T00:10:36.533 に答える