[.net] SQL Server에서 외래 키 종속성을 찾는 방법은 무엇입니까?

특정 열에서 외래 키 종속성을 모두 찾으려면 어떻게해야합니까?

다른 대안 (SSMS 그래픽, SQL Server 쿼리 / 뷰, 타사 데이터베이스 도구, .NET 코드)은 무엇입니까?



답변

다음 쿼리는 시작하는 데 도움이됩니다. 현재 데이터베이스 내의 모든 외래 키 관계를 나열합니다.

SELECT
    FK_Table = FK.TABLE_NAME,
    FK_Column = CU.COLUMN_NAME,
    PK_Table = PK.TABLE_NAME,
    PK_Column = PT.COLUMN_NAME,
    Constraint_Name = C.CONSTRAINT_NAME
FROM
    INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK
    ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK
    ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU
    ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME
INNER JOIN (
            SELECT
                i1.TABLE_NAME,
                i2.COLUMN_NAME
            FROM
                INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1
            INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2
                ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME
            WHERE
                i1.CONSTRAINT_TYPE = 'PRIMARY KEY'
           ) PT
    ON PT.TABLE_NAME = PK.TABLE_NAME

데이터베이스 다이어그램 내의 SQL Server Management Studio 내에서 관계를 그래픽으로 볼 수도 있습니다.


답변

시험: sp_help [table_name]

모든 외래 키를 포함하여 테이블에 대한 모든 정보를 얻습니다.


답변

외래 키 종속성 만 발견하여 테이블 또는 열을 삭제하거나 이름을 바꾸려는 경우 충분하지 않을 수 있습니다.

외래 키와 연결되지 않은 참조 테이블 – 도 검색해야합니다 (외래 키가 정의되지 않았지만 관련 데이터가있는 디자인이 잘못된 데이터베이스가 많이 있음을 확인했습니다) ). 해결책은 모든 테이블에서 열 이름을 검색하고 유사한 열을 찾는 것입니다.

다른 데이터베이스 객체 – 아마도 약간의 주제 일지 모르지만 모든 참조를 찾고 있다면 종속 객체를 확인하는 것이 중요합니다.

GUI 도구 – SSMS“관련 개체 찾기”옵션 또는 ApexSQL 검색 (무료 도구, SSMS에 통합) 과 같은 도구를 사용해 외래 키로 연결된 테이블을 포함한 모든 종속 개체를 식별하십시오.


답변

귀하의 질문은 단일 테이블을 대상으로하기 때문에 다음을 사용할 수 있습니다.

EXEC sp_fkeys 'TableName'

나는 그것을 여기에서 찾았다.

https://stackoverflow.com/a/12956348/652519

필요한 정보를 아주 빨리 찾았습니다. 외래 키의 테이블, 열 및 이름이 나열됩니다.

편집하다

다음은 사용할 수있는 다양한 매개 변수를 자세히 설명하는 설명서 링크입니다. https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-fkeys-transact-sql


답변

이 스크립트는 덜 비싸다고 생각합니다.

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


답변

제가 정말로 사용하고 싶은 것은 Red Gate Software의 SQL Dependency Tracker입니다 입니다. 테이블, 저장 프로 시저 등과 같은 데이터베이스 개체를 넣을 수 있으며 선택한 항목에 의존하는 다른 모든 개체간에 관계 선을 자동으로 그립니다.

스키마의 종속성을 그래픽으로 잘 보여줍니다.


답변

John Sansom에게 대단히 감사합니다. 그의 질문은 훌륭합니다!

또한 : 검색어 끝에 “AND PT.ORDINAL_POSITION = CU.ORDINAL_POSITION”을 추가해야합니다.

기본 키에 여러 필드가있는 경우이 문은 해당 필드를 서로 일치시킵니다 (필자의 경우 쿼리에서 모든 조합을 만들었으므로 기본 키의 두 필드에 대해 해당 외래 키에 대해 4 개의 결과가 있음) .

(죄평 한 점이 충분하지 않아서 John의 답변에 대해서는 언급 할 수 없습니다.)