2009-08-04 11 views

Odpowiedz

80

Używam tego stwierdzenia, wygląda na to, że działa całkiem nieźle.

SELECT RC.CONSTRAINT_NAME FK_Name 
, KF.TABLE_SCHEMA FK_Schema 
, KF.TABLE_NAME FK_Table 
, KF.COLUMN_NAME FK_Column 
, RC.UNIQUE_CONSTRAINT_NAME PK_Name 
, KP.TABLE_SCHEMA PK_Schema 
, KP.TABLE_NAME PK_Table 
, KP.COLUMN_NAME PK_Column 
, RC.MATCH_OPTION MatchOption 
, RC.UPDATE_RULE UpdateRule 
, RC.DELETE_RULE DeleteRule 
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC 
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KF ON RC.CONSTRAINT_NAME = KF.CONSTRAINT_NAME 
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KP ON RC.UNIQUE_CONSTRAINT_NAME = KP.CONSTRAINT_NAME 
+3

Uwaga! 'INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS' pomija niektóre klucze obce, które zwraca' sys.foreign_keys' (w moim przypadku klucz obcy z 'Wymuszaj dla replikacji' ustawiony na' Nie '. Zamiast tego użyłem tej odpowiedzi: http: // stackoverflow. com/a/10697248/14731 – Gili

+0

Niech cię Bóg błogosławi, bo uratowałeś mnie dzisiaj - nie mogłem wymyślić tego! – LearnByReading

8

Teoretycznie jest to trudne. Model relacyjny pozwala dowolnemu polu odnosić się do dowolnego innego pola. Które z nich są rzeczywiście używane, określają wszystkie możliwe instrukcje SELECT, które mogą zostać użyte.

W praktyce zależy to od tego, ile tabel zawiera definicje FK. Jeśli ktoś zadał sobie trud starannego zdefiniowania wszystkich referencji FK - a instrukcje SELECT trzymają się tych reguł - możesz je zapytać.

Jednakże, ponieważ SELECT może przyłączyć się na niczym, nie ma gwarancji, że masz chyba że masz również wszystkie SELECT wszystkich FK użytkownika.


Edit.

Zobacz http://www.lostechies.com/blogs/jimmy_bogard/archive/2008/11/26/viewing-all-foreign-key-constraints-in-sql-server.aspx

SELECT f.name AS ForeignKey, 
    OBJECT_NAME(f.parent_object_id) AS TableName, 
    COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName, 
    OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName, 
    COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName 
FROM sys.foreign_keys AS f 
INNER JOIN sys.foreign_key_columns AS fc 
    ON f.OBJECT_ID = fc.constraint_object_id 

może pracować dla Ciebie.

+0

Wszystkie zdefiniowane klucze obce są zdefiniowane. Jak mam zapytać o zdefiniowane klucze obce? –

+1

Nie jest to w żaden sposób odpowiedź na pytanie. Klucz obcy to rzecz prawdziwa, obiekt w bazie danych (lub przynajmniej własność obiektu). Pytanie nie pyta o listę wszystkich możliwych kolumn, do których można dołączyć, co nie miałoby sensu. –

+0

@Byron Whitlock: "Wszystko" rzadko oznacza wszystko, zwykle oznacza "Wszystkie oprócz kilku wyjątków". –

5

używam http://technet.microsoft.com/en-us/library/ms189807.aspx

SELECT * FROM sys.foreign_keys 

To znaczy, jeśli są na co najmniej SQL Server 2005+ i chcesz zobaczyć listę nazw FK.

Ale prawdopodobnie chcesz dowiedzieć się więcej o tabelach, które są ze sobą powiązane, prawda, to tam odpowiedź jest przydatna.

0

Tutaj jest bardziej pouczający sposób prezentowania go

SELECT DISTINCT PARENT_TABLE = 
      RIGHT(Replace(TC.constraint_name, 'FK_', ''), 
      Len(Replace(TC.constraint_name, 'FK_', '')) - Charindex('_', Replace(TC.constraint_name, 'FK_', ''))), 
      CHILD_TABLE = TC.table_name, 
      CU.column_name, 
      TC.constraint_name, 
      TC.constraint_type 
FROM information_schema.table_constraints TC 
INNER JOIN information_schema.constraint_column_usage CU 
      ON TC.constraint_name = CU.constraint_name 
WHERE TC.constraint_type LIKE '%foreign' 
      OR TC.constraint_type LIKE '%foreign%' 
      OR TC.constraint_type LIKE 'foreign%' 
Powiązane problemy