복붙노트

[SQL] 어떻게 SQL Server의 어떤 FOREIGN KEY 제약 조건 참조 테이블을 찾을 수 있습니까?

SQL

어떻게 SQL Server의 어떤 FOREIGN KEY 제약 조건 참조 테이블을 찾을 수 있습니까?

나는 테이블을 삭제하려고하지만, 다음과 같은 메시지가 무엇입니까 :

나는 SQL Server Management Studio를 함께 주위를 둘러 보았다하지만 제약 조건을 찾을 수 없습니다입니다. 어떻게 외래 키 제약 조건을 찾을 수 있습니까?

해결법

  1. ==============================

    1.여기있어:

    여기있어:

    SELECT 
       OBJECT_NAME(f.parent_object_id) TableName,
       COL_NAME(fc.parent_object_id,fc.parent_column_id) ColName
    FROM 
       sys.foreign_keys AS f
    INNER JOIN 
       sys.foreign_key_columns AS fc 
          ON f.OBJECT_ID = fc.constraint_object_id
    INNER JOIN 
       sys.tables t 
          ON t.OBJECT_ID = fc.referenced_object_id
    WHERE 
       OBJECT_NAME (f.referenced_object_id) = 'YourTableName'
    

    이 방법은, 당신은 참조 테이블 및 열 이름을 얻을 것이다.

    대신 주석의 제안에 따라 제네릭는 sys.objects의 sys.tables를 사용하여 편집. 감사합니다, marc_s

  2. ==============================

    2.또 다른 방법의 결과를 확인하는 것입니다

    또 다른 방법의 결과를 확인하는 것입니다

    sp_help 'TableName'
    

    (또는 인용 테이블 이름을 누르 ALT + F1을 강조)

    시간이 흐르면서, 난 그냥 내 대답을 수정하기로 결정했다. 다음은 그 sp_help는이 제공하는 결과의 스크린 샷이다. A는이 예를 들어 AdventureWorksDW2012 DB를 사용하고 있습니다. 이 많은 좋은 정보가, 그리고 우리가 찾고있는 것은 매우 끝에 - 녹색으로 강조 표시 :

  3. ==============================

    3.이 시도

    이 시도

    SELECT
      object_name(parent_object_id) ParentTableName,
      object_name(referenced_object_id) RefTableName,
      name 
    FROM sys.foreign_keys
    WHERE parent_object_id = object_id('Tablename')
    
  4. ==============================

    4.나는이 대답은 아주 간단 발견하고 내가 필요한 것을 위해 속임수를 썼는지 : https://stackoverflow.com/a/12956348/652519

    나는이 대답은 아주 간단 발견하고 내가 필요한 것을 위해 속임수를 썼는지 : https://stackoverflow.com/a/12956348/652519

    링크에서 요약이 쿼리를 사용 :

    EXEC sp_fkeys 'TableName'
    

    빠르고 간단합니다. 나는 꽤 빨리 모든 외부 키 테이블, 각각의 기둥과 15 개 테이블의 외래 키 이름을 찾을 수 있었다.

    @mdisibio 아래에 언급 한 바와 같이, 여기에 사용할 수있는 다른 매개 변수를 자세히 설명 문서에 대한 링크는 다음과 같습니다 https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp- fkeys - 트랜 잭트 SQL

  5. ==============================

    5.나는 외래 키에 관련된 모든 세부 정보를 찾기 위해이 스크립트를 사용하고 있습니다. 나는 INFORMATION.SCHEMA을 사용하고 있습니다. 다음은 SQL 스크립트는 다음과 같습니다

    나는 외래 키에 관련된 모든 세부 정보를 찾기 위해이 스크립트를 사용하고 있습니다. 나는 INFORMATION.SCHEMA을 사용하고 있습니다. 다음은 SQL 스크립트는 다음과 같습니다

    SELECT 
        ccu.table_name AS SourceTable
        ,ccu.constraint_name AS SourceConstraint
        ,ccu.column_name AS SourceColumn
        ,kcu.table_name AS TargetTable
        ,kcu.column_name AS TargetColumn
    FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu
        INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
            ON ccu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME 
        INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu 
            ON kcu.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME  
    ORDER BY ccu.table_name
    
  6. ==============================

    6.당신이 개체 탐색기 창에서 SSMS를 통해 가고 싶은 경우에, 오른쪽, 당신이 드롭 할 개체를 클릭보기 종속성을한다.

    당신이 개체 탐색기 창에서 SSMS를 통해 가고 싶은 경우에, 오른쪽, 당신이 드롭 할 개체를 클릭보기 종속성을한다.

  7. ==============================

    7.여기에 모든 데이터베이스에서 외래 키 관계를 알 수있는 가장 좋은 방법입니다.

    여기에 모든 데이터베이스에서 외래 키 관계를 알 수있는 가장 좋은 방법입니다.

    exec sp_helpconstraint 'Table Name'
    

    그리고 또 하나의 방법

    select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME='Table Name'
    --and left(CONSTRAINT_NAME,2)='FK'(If you want single key)
    
  8. ==============================

    8.

    SELECT 
        obj.name      AS FK_NAME,
        sch.name      AS [schema_name],
        tab1.name     AS [table],
        col1.name     AS [column],
        tab2.name     AS [referenced_table],
        col2.name     AS [referenced_column]
    FROM 
         sys.foreign_key_columns fkc
    INNER JOIN sys.objects obj
        ON obj.object_id = fkc.constraint_object_id
    INNER JOIN sys.tables tab1
        ON tab1.object_id = fkc.parent_object_id
    INNER JOIN sys.schemas sch
        ON tab1.schema_id = sch.schema_id
    INNER JOIN sys.columns col1
        ON col1.column_id = parent_column_id AND col1.object_id = tab1.object_id
    INNER JOIN sys.tables tab2
        ON tab2.object_id = fkc.referenced_object_id
    INNER JOIN sys.columns col2
        ON col2.column_id = referenced_column_id 
            AND col2.object_id =  tab2.object_id;
    
  9. ==============================

    9.--The 다음은 더 당신이 찾고있는 무엇을 줄 수 있습니다 :

    --The 다음은 더 당신이 찾고있는 무엇을 줄 수 있습니다 :

    create Procedure spShowRelationShips 
    ( 
        @Table varchar(250) = null,
        @RelatedTable varchar(250) = null
    )
    as
    begin
        if @Table is null and @RelatedTable is null
            select  object_name(k.constraint_object_id) ForeginKeyName, 
                    object_name(k.Parent_Object_id) TableName, 
                    object_name(k.referenced_object_id) RelatedTable, 
                    c.Name RelatedColumnName,  
                    object_name(rc.object_id) + '.' + rc.name RelatedKeyField
            from sys.foreign_key_columns k
            left join sys.columns c on object_name(c.object_id) = object_name(k.Parent_Object_id) and c.column_id = k.parent_column_id
            left join sys.columns rc on object_name(rc.object_id) = object_name(k.referenced_object_id) and rc.column_id = k.referenced_column_id
            order by 2,3
    
        if @Table is not null and @RelatedTable is null
            select  object_name(k.constraint_object_id) ForeginKeyName, 
                    object_name(k.Parent_Object_id) TableName, 
                    object_name(k.referenced_object_id) RelatedTable, 
                    c.Name RelatedColumnName,  
                    object_name(rc.object_id) + '.' + rc.name RelatedKeyField
            from sys.foreign_key_columns k
            left join sys.columns c on object_name(c.object_id) = object_name(k.Parent_Object_id) and c.column_id = k.parent_column_id
            left join sys.columns rc on object_name(rc.object_id) = object_name(k.referenced_object_id) and rc.column_id = k.referenced_column_id
            where object_name(k.Parent_Object_id) =@Table
            order by 2,3
    
        if @Table is null and @RelatedTable is not null
            select  object_name(k.constraint_object_id) ForeginKeyName, 
                    object_name(k.Parent_Object_id) TableName, 
                    object_name(k.referenced_object_id) RelatedTable, 
                    c.Name RelatedColumnName,  
                    object_name(rc.object_id) + '.' + rc.name RelatedKeyField
            from sys.foreign_key_columns k
            left join sys.columns c on object_name(c.object_id) = object_name(k.Parent_Object_id) and c.column_id = k.parent_column_id
            left join sys.columns rc on object_name(rc.object_id) = object_name(k.referenced_object_id) and rc.column_id = k.referenced_column_id
            where object_name(k.referenced_object_id) =@RelatedTable
            order by 2,3
    
    
    
    end
    
  10. ==============================

    10.또한 @LittleSweetSeas 응답을 adapating하여 외부 키에 대한 모든 정보를 반환 할 수 있습니다 :

    또한 @LittleSweetSeas 응답을 adapating하여 외부 키에 대한 모든 정보를 반환 할 수 있습니다 :

    SELECT 
       OBJECT_NAME(f.parent_object_id) ConsTable,
       OBJECT_NAME (f.referenced_object_id) refTable,
       COL_NAME(fc.parent_object_id,fc.parent_column_id) ColName
    FROM 
       sys.foreign_keys AS f
    INNER JOIN 
       sys.foreign_key_columns AS fc 
          ON f.OBJECT_ID = fc.constraint_object_id
    INNER JOIN 
       sys.tables t 
          ON t.OBJECT_ID = fc.referenced_object_id
    order by
    ConsTable
    
  11. ==============================

    11.SQL Server 관리 Studio에서 당신은 오른쪽에서 테이블을 클릭 할 수 있습니다 개체 탐색기 및 "보기 종속성"을 선택합니다. 이것은 당신을 줄 것이다 좋은 출발점. 이는 테이블, 뷰, 절차 및 그 기준을 도시 탁자.

    SQL Server 관리 Studio에서 당신은 오른쪽에서 테이블을 클릭 할 수 있습니다 개체 탐색기 및 "보기 종속성"을 선택합니다. 이것은 당신을 줄 것이다 좋은 출발점. 이는 테이블, 뷰, 절차 및 그 기준을 도시 탁자.

  12. ==============================

    12.다음 쿼리를 시도합니다.

    다음 쿼리를 시도합니다.

    select object_name(sfc.constraint_object_id) AS constraint_name,
           OBJECT_Name(parent_object_id) AS table_name ,
           ac1.name as table_column_name,
           OBJECT_name(referenced_object_id) as reference_table_name,      
           ac2.name as reference_column_name
    from  sys.foreign_key_columns sfc
    join sys.all_columns ac1 on (ac1.object_id=sfc.parent_object_id and ac1.column_id=sfc.parent_column_id)
    join sys.all_columns ac2 on (ac2.object_id=sfc.referenced_object_id and ac2.column_id=sfc.referenced_column_id) 
    where sfc.parent_object_id=OBJECT_ID(<main table name>);
    

    이것은 constraint_name을, 참조되고 제약 조건에 따라됩니다 테이블이있을 것 COLUMN_NAMES을 줄 것이다.

  13. ==============================

    13.당신은 외래 키 제약 조건을 표시하려면이 쿼리를 사용할 수 있습니다 :

    당신은 외래 키 제약 조건을 표시하려면이 쿼리를 사용할 수 있습니다 :

    SELECT
    K_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
    ---- optional:
    ORDER BY
    1,2,3,4
    WHERE PK.TABLE_NAME='YourTable'
    

    http://blog.sqlauthority.com/2006/11/01/sql-server-query-to-display-foreign-key-relationships-and-name-of-the-constraint-for-each-table-에서 촬영 에서 데이터베이스 /

  14. ==============================

    14.테이블이를 위해 가장 쉬운 방법은 기본 키와 외래 키를 얻을 수 있습니다 :

    테이블이를 위해 가장 쉬운 방법은 기본 키와 외래 키를 얻을 수 있습니다 :

    /*  Get primary key and foreign key for a table */
    USE DatabaseName;
    
    SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
    WHERE CONSTRAINT_NAME LIKE 'PK%' AND
    TABLE_NAME = 'TableName'
    
    SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
    WHERE CONSTRAINT_NAME LIKE 'FK%' AND
    TABLE_NAME = 'TableName'
    
  15. from https://stackoverflow.com/questions/17501840/how-can-i-find-out-what-foreign-key-constraint-references-a-table-in-sql-server by cc-by-sa and MIT license