2009-08-04 41 views

Trả lời

80

Tôi sử dụng tuyên bố này, có vẻ như nó hoạt động khá tốt.

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

Hãy coi chừng! 'INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS' bỏ qua một số khóa ngoại mà' sys.foreign_keys' trả về (trong trường hợp của tôi, một khóa ngoại với 'Enforce For Replication' được đặt thành' No'. Tôi đã sử dụng câu trả lời này thay vì: http: // stackoverflow. com/a/10697248/14731 – Gili

+0

Chúa ban phước cho bạn vì bạn đã cứu tôi hôm nay - Tôi không thể hình dung ra điều này !! – LearnByReading

8

Về mặt lý thuyết, điều này thật khó. Mô hình quan hệ cho phép bất kỳ trường nào liên quan đến bất kỳ trường nào khác. Những cái nào thực sự được sử dụng được định nghĩa bởi tất cả các câu lệnh SELECT có thể được sử dụng.

Thực tế, nó phụ thuộc vào bao nhiêu bảng có định nghĩa FK được bao gồm. Nếu ai đó làm phiền để xác định cẩn thận tất cả các tài liệu tham khảo FK - và các câu lệnh SELECT dính vào các quy tắc này - bạn có thể truy vấn chúng.

Tuy nhiên, vì một câu lệnh SELECT có thể tham gia vào bất cứ điều gì, không có đảm bảo rằng bạn có tất cả FK trừ khi bạn cũng có tất cả câu lệnh SELECT.


Chỉnh sửa.

Xem 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 

Có thể làm việc cho bạn.

+0

Tất cả các phím nước ngoài quy định được xác định. Làm thế nào tôi sẽ truy vấn các khóa nước ngoài được xác định? –

+1

Đây không phải là câu trả lời cho câu hỏi. Khóa ngoài là một điều thực, một đối tượng trong cơ sở dữ liệu (hoặc ít nhất là một thuộc tính của một đối tượng). Câu hỏi không yêu cầu liệt kê mọi cột có thể mà bạn có thể tham gia chống lại, điều đó sẽ không có nghĩa là bất kỳ ý nghĩa nào –

+0

@Byron Whitlock: "Tất cả" hiếm khi có nghĩa là tất cả, nó thường có nghĩa là "Tất cả trừ một vài ngoại lệ". –

5

tôi sử dụng http://technet.microsoft.com/en-us/library/ms189807.aspx

SELECT * FROM sys.foreign_keys 

Đó là nếu bạn đang ở trên ít nhất SQL Server 2005 + và muốn nhìn thấy một danh sách các tên FK.

Nhưng bạn có thể muốn biết thêm về các bảng có liên quan quá, phải không, đó là nơi mà câu trả lời có ích.

0

Dưới đây là một cách thông tin mới hơn trình bày nó

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%' 
Các vấn đề liên quan