How can I list all foreign keys referencing a given table in SQL Server?

后端 未结 26 2658
梦毁少年i
梦毁少年i 2020-11-22 07:13

I need to remove a highly referenced table in a SQL Server database. How can I get a list of all the foreign key constraints I will need to remove in order to drop the tabl

相关标签:
26条回答
  • 2020-11-22 08:04

    Try this :

    sp_help 'TableName'
    
    0 讨论(0)
  • 2020-11-22 08:05
     SELECT OBJECT_NAME(fk.parent_object_id) as ReferencingTable, 
            OBJECT_NAME(fk.constraint_object_id) as [FKContraint]
      FROM sys.foreign_key_columns as fk
     WHERE fk.referenced_object_id = OBJECT_ID('ReferencedTable', 'U')
    

    This only shows the relationship if the are foreign key constraints. My database apparently predates the FK constraint.Some table use triggers to enforce referential integrity, and sometimes there's nothing but a similarly named column to indicate the relationship (and no referential integrity at all).

    Fortunately, we do have a consistent naming scene so I am able to find referencing tables and views like this:

    SELECT OBJECT_NAME(object_id) from sys.columns where name like 'client_id'
    

    I used this select as the basis for generating a script the does what I need to do on the related tables.

    0 讨论(0)
  • 2020-11-22 08:05

    List of all foreign keys referencing a given table in SQL Server :

    You can get the referencing table name and column name through following query...

    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) = 'TableName'
    

    And following screenshot for your understanding...

    0 讨论(0)
  • 2020-11-22 08:06

    The most Simplest one is by using sys.foreign_keys_columns in SQL. Here the table contains the Object ids of all the foreign keys wrt their Referenced column ID Referenced Table ID as well as the Referencing Columns and Tables. As the Id's remains constant the result will be reliable for further modifications in Schema as well as tables.

    Query:

    SELECT    
    OBJECT_NAME(fkeys.constraint_object_id) foreign_key_name
    ,OBJECT_NAME(fkeys.parent_object_id) referencing_table_name
    ,COL_NAME(fkeys.parent_object_id, fkeys.parent_column_id) referencing_column_name
    ,OBJECT_SCHEMA_NAME(fkeys.parent_object_id) referencing_schema_name
    ,OBJECT_NAME (fkeys.referenced_object_id) referenced_table_name
    ,COL_NAME(fkeys.referenced_object_id, fkeys.referenced_column_id) 
    referenced_column_name
    ,OBJECT_SCHEMA_NAME(fkeys.referenced_object_id) referenced_schema_name
    FROM sys.foreign_key_columns AS fkeys
    

    We can also add filter by using 'where'

    WHERE OBJECT_NAME(fkeys.parent_object_id) = 'table_name' AND 
    OBJECT_SCHEMA_NAME(fkeys.parent_object_id) = 'schema_name'
    
    0 讨论(0)
  • 2020-11-22 08:06

    I am using this script to find all details related to foreign key. I am using INFORMATION.SCHEMA. Below is a SQL Script:

    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
    
    0 讨论(0)
  • 2020-11-22 08:06

    Determine primary keys and unique keys for all tables in a database...

    This should list all the constraints and at the end you can put your filters

    /* CAST IS DONE , SO THAT OUTPUT INTEXT FILE REMAINS WITH SCREEN LIMIT*/
    WITH   ALL_KEYS_IN_TABLE (CONSTRAINT_NAME,CONSTRAINT_TYPE,PARENT_TABLE_NAME,PARENT_COL_NAME,PARENT_COL_NAME_DATA_TYPE,REFERENCE_TABLE_NAME,REFERENCE_COL_NAME) 
    AS
    (
    SELECT  CONSTRAINT_NAME= CAST (PKnUKEY.name AS VARCHAR(30)) ,
            CONSTRAINT_TYPE=CAST (PKnUKEY.type_desc AS VARCHAR(30)) ,
            PARENT_TABLE_NAME=CAST (PKnUTable.name AS VARCHAR(30)) ,
            PARENT_COL_NAME=CAST ( PKnUKEYCol.name AS VARCHAR(30)) ,
            PARENT_COL_NAME_DATA_TYPE=  oParentColDtl.DATA_TYPE,        
            REFERENCE_TABLE_NAME='' ,
            REFERENCE_COL_NAME='' 
    
    FROM sys.key_constraints as PKnUKEY
        INNER JOIN sys.tables as PKnUTable
                ON PKnUTable.object_id = PKnUKEY.parent_object_id
        INNER JOIN sys.index_columns as PKnUColIdx
                ON PKnUColIdx.object_id = PKnUTable.object_id
                AND PKnUColIdx.index_id = PKnUKEY.unique_index_id
        INNER JOIN sys.columns as PKnUKEYCol
                ON PKnUKEYCol.object_id = PKnUTable.object_id
                AND PKnUKEYCol.column_id = PKnUColIdx.column_id
         INNER JOIN INFORMATION_SCHEMA.COLUMNS oParentColDtl
                ON oParentColDtl.TABLE_NAME=PKnUTable.name
                AND oParentColDtl.COLUMN_NAME=PKnUKEYCol.name
    UNION ALL
    SELECT  CONSTRAINT_NAME= CAST (oConstraint.name AS VARCHAR(30)) ,
            CONSTRAINT_TYPE='FK',
            PARENT_TABLE_NAME=CAST (oParent.name AS VARCHAR(30)) ,
            PARENT_COL_NAME=CAST ( oParentCol.name AS VARCHAR(30)) ,
            PARENT_COL_NAME_DATA_TYPE= oParentColDtl.DATA_TYPE,     
            REFERENCE_TABLE_NAME=CAST ( oReference.name AS VARCHAR(30)) ,
            REFERENCE_COL_NAME=CAST (oReferenceCol.name AS VARCHAR(30)) 
    FROM sys.foreign_key_columns FKC
        INNER JOIN sys.sysobjects oConstraint
                ON FKC.constraint_object_id=oConstraint.id 
        INNER JOIN sys.sysobjects oParent
                ON FKC.parent_object_id=oParent.id
        INNER JOIN sys.all_columns oParentCol
                ON FKC.parent_object_id=oParentCol.object_id /* ID of the object to which this column belongs.*/
                AND FKC.parent_column_id=oParentCol.column_id/* ID of the column. Is unique within the object.Column IDs might not be sequential.*/
        INNER JOIN sys.sysobjects oReference
                ON FKC.referenced_object_id=oReference.id
        INNER JOIN INFORMATION_SCHEMA.COLUMNS oParentColDtl
                ON oParentColDtl.TABLE_NAME=oParent.name
                AND oParentColDtl.COLUMN_NAME=oParentCol.name
        INNER JOIN sys.all_columns oReferenceCol
                ON FKC.referenced_object_id=oReferenceCol.object_id /* ID of the object to which this column belongs.*/
                AND FKC.referenced_column_id=oReferenceCol.column_id/* ID of the column. Is unique within the object.Column IDs might not be sequential.*/
    
    )
    
    select * from   ALL_KEYS_IN_TABLE
    where   
        PARENT_TABLE_NAME  in ('YOUR_TABLE_NAME') 
        or REFERENCE_TABLE_NAME  in ('YOUR_TABLE_NAME')
    ORDER BY PARENT_TABLE_NAME,CONSTRAINT_NAME;
    

    For reference please read thru - http://blogs.msdn.com/b/sqltips/archive/2005/09/16/469136.aspx

    0 讨论(0)
提交回复
热议问题