복붙노트

[SQL] 어떻게 SQL Server의 특정 테이블을 참조하는 모든 외래 키를 나열 할 수 있습니다?

SQL

어떻게 SQL Server의 특정 테이블을 참조하는 모든 외래 키를 나열 할 수 있습니다?

나는 SQL Server 데이터베이스에 매우 참조 테이블을 제거해야합니다. 어떻게 내가 테이블을 삭제하기 위해 제거해야합니다 모든 외래 키 제약 조건의 목록을 얻을 수 있나요?

(SQL은 관리 스튜디오의 GUI에 대한 바람직 이상의 클릭에 응답합니다.)

해결법

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

    1.확실하지 아무도 제안하지하지만 주어진 테이블에 대한 쿼리 외래 키에 sp_fkeys를 사용하는 이유 :

    확실하지 아무도 제안하지하지만 주어진 테이블에 대한 쿼리 외래 키에 sp_fkeys를 사용하는 이유 :

    EXEC sp_fkeys 'TableName'
    

    또한 스키마를 지정할 수 있습니다 :

    EXEC sp_fkeys @pktable_name = 'TableName', @pktable_owner = 'dbo'
    

    스키마를 지정하지 않고, 워드 프로세서는 다음을 진술 :

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

    2.이 SQL Server 2008의 나를 위해 일한 (2005이없는) - I SQL Server Management Studio의 데이터베이스 다이어그램 기능을 사용하려고하지만 그 밖으로 지배하기 때문이다.

    이 SQL Server 2008의 나를 위해 일한 (2005이없는) - I SQL Server Management Studio의 데이터베이스 다이어그램 기능을 사용하려고하지만 그 밖으로 지배하기 때문이다.

    테이블 및 열 이름을 참조 목록을 얻으려면 ...

    select 
        t.name as TableWithForeignKey, 
        fk.constraint_column_id as FK_PartNo, c.
        name as ForeignKeyColumn 
    from 
        sys.foreign_key_columns as fk
    inner join 
        sys.tables as t on fk.parent_object_id = t.object_id
    inner join 
        sys.columns as c on fk.parent_object_id = c.object_id and fk.parent_column_id = c.column_id
    where 
        fk.referenced_object_id = (select object_id 
                                   from sys.tables 
                                   where name = 'TableOthersForeignKeyInto')
    order by 
        TableWithForeignKey, FK_PartNo
    

    외래 키 제약 조건의 이름을 얻으려면

    select distinct name from sys.objects where object_id in 
    (   select fk.constraint_object_id from sys.foreign_key_columns as fk
        where fk.referenced_object_id = 
            (select object_id from sys.tables where name = 'TableOthersForeignKeyInto')
    )
    
  3. ==============================

    3.이것은 당신을 제공합니다 :

    이것은 당신을 제공합니다 :

    코드 아래 :

    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
    
  4. ==============================

    4.이 시도 :

    이 시도 :

    sp_help 'TableName'
    
  5. ==============================

    5.또한 다른 개체에 대한 참조를 염두해야한다.

    또한 다른 개체에 대한 참조를 염두해야한다.

    테이블이 매우 그것은 아마도 매우 같은 뷰, 저장 프로 시저, 함수 등과 같은 다른 개체가 참조하는 것보다 다른 테이블에 의해 참조 된 경우.

    당신은 단지 SQL을 함께하고 싶어 오류가 경향이있을 수있는 다른 개체의 종속성을 검색하기 때문에 정말 같은 '종속성보기'SSMS 대화 또는 이것에 대한 ApexSQL 검색 등의 무료 도구로 GUI 도구를 권 해드립니다.

    SQL이 유일한 옵션 인 경우에는 다음과 같이 그 일을 시도 할 수 있습니다.

    select O.name as [Object_Name], C.text as [Object_Definition]
    from sys.syscomments C
    inner join sys.all_objects O ON C.id = O.object_id
    where C.text like '%table_name%'
    
  6. ==============================

    6.원래 질문은 테이블을 제거 할 수 있도록 고도의 참조 된 테이블에 모든 외부 키의 목록을 얻으려면 물었다.

    원래 질문은 테이블을 제거 할 수 있도록 고도의 참조 된 테이블에 모든 외부 키의 목록을 얻으려면 물었다.

    이 작은 쿼리 반환 모든 특정 테이블에 모든 외부 키를 삭제하는 데 필요한 명령 '외래 키를 드롭'

    SELECT 
       'ALTER TABLE ['+sch.name+'].['+referencingTable.Name+'] DROP CONSTRAINT ['+foreignKey.name+']' '[DropCommand]'
    FROM sys.foreign_key_columns fk
        JOIN sys.tables referencingTable ON fk.parent_object_id = referencingTable.object_id
        JOIN sys.schemas sch ON referencingTable.schema_id = sch.schema_id
        JOIN sys.objects foreignKey ON foreignKey.object_id = fk.constraint_object_id
        JOIN sys.tables referencedTable ON fk.referenced_object_id = referencedTable.object_id
    WHERE referencedTable.name = 'MyTableName'
    

    출력 예 :

    [DropCommand]
    ALTER TABLE [dbo].[OtherTable1] DROP CONSTRAINT [FK_OtherTable1_MyTable]
    ALTER TABLE [dbo].[OtherTable2] DROP CONSTRAINT [FK_OtherTable2_MyTable]
    

    생락 WHERE 절은 현재 데이터베이스의 모든 외부 키의 드롭 명령을 얻을 수 있습니다.

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

    7.여기 내가 사용하는 것이 SQL 코드입니다.

    여기 내가 사용하는 것이 SQL 코드입니다.

    SELECT 
       f.name AS 'Name of Foreign Key',
       OBJECT_NAME(f.parent_object_id) AS 'Table name',
       COL_NAME(fc.parent_object_id,fc.parent_column_id) AS 'Fieldname',
       OBJECT_NAME(t.object_id) AS 'References Table name',
       COL_NAME(t.object_id,fc.referenced_column_id) AS 'References fieldname',
    
       'ALTER TABLE [' + OBJECT_NAME(f.parent_object_id) + ']  DROP CONSTRAINT [' + f.name + ']' AS 'Delete foreign key',
    
       'ALTER TABLE [' + OBJECT_NAME(f.parent_object_id) + ']  WITH NOCHECK ADD CONSTRAINT [' + 
            f.name + '] FOREIGN KEY([' + COL_NAME(fc.parent_object_id,fc.parent_column_id) + ']) REFERENCES ' + 
            '[' + OBJECT_NAME(t.object_id) + '] ([' +
            COL_NAME(t.object_id,fc.referenced_column_id) + '])' AS 'Create foreign key'
        -- , delete_referential_action_desc AS 'UsesCascadeDelete'
    FROM sys.foreign_keys AS f,
         sys.foreign_key_columns AS fc,
         sys.tables t 
    WHERE f.OBJECT_ID = fc.constraint_object_id
    AND t.OBJECT_ID = fc.referenced_object_id
    AND OBJECT_NAME(t.object_id) = 'Employees'      --  Just show the FKs which reference a particular table
    ORDER BY 2
    

    너무의 예를 살펴 보자하지 특히 ​​명확 SQL입니다.

    그래서 가정하면 나는 마이크로 소프트의 사랑하여 Northwind 데이터베이스의 Employees 테이블을 삭제하고 싶어하지만, SQL 서버는 하나 이상의 외부 키는이 일에서 저를 방지 있다고 내게 말했다.

    SQL 명령은 위의 결과를 반환 ...

    그것은 직원 테이블을 참조하는 3 외래 키 있다는 것을 나에게 보여줍니다. 즉, 나는이 세 가지 외래 키가 먼저 삭제 될 때까지이 표를 (드롭)을 삭제하도록 허용하지 않을 것입니다.

    결과에서 첫 번째 행은 다음과 같은 외래 키 제약 조건이 결과에 표시 될 방법이다.

    ALTER TABLE [dbo].[Employees]  WITH NOCHECK 
    ADD CONSTRAINT [FK_Employees_Employees] FOREIGN KEY([ReportsTo])
    REFERENCES [dbo].[Employees] ([EmployeeID])
    

    마지막 두 번째 열 쇼는 SQL 명령은 내가이 외래 키, 예를 들어 중 하나를 삭제하는 데 사용해야합니다 :

    ALTER TABLE [Employees] DROP CONSTRAINT [FK_Employees_Employees]
    

    ... 그리고 오른쪽 열 쇼는 SQL 그것을 만들 수 ...

    ALTER TABLE [Employees] WITH NOCHECK 
    ADD CONSTRAINT [FK_Employees_Employees] 
    FOREIGN KEY([ReportsTo]) REFERENCES [Employees] ([EmployeeID])
    

    이러한 모든 명령으로, 당신은 모든 것을 가지고 당신은 나중에 다시 작성, 테이블을 삭제 할 수 있도록 관련 외부 키를 삭제해야합니다.

    휴. 도움이 되었기를 바랍니다.

  8. ==============================

    8.

    SELECT PKTABLE_QUALIFIER = CONVERT(SYSNAME,DB_NAME()),
           PKTABLE_OWNER = CONVERT(SYSNAME,SCHEMA_NAME(O1.SCHEMA_ID)),
           PKTABLE_NAME = CONVERT(SYSNAME,O1.NAME),
           PKCOLUMN_NAME = CONVERT(SYSNAME,C1.NAME),
           FKTABLE_QUALIFIER = CONVERT(SYSNAME,DB_NAME()),
           FKTABLE_OWNER = CONVERT(SYSNAME,SCHEMA_NAME(O2.SCHEMA_ID)),
           FKTABLE_NAME = CONVERT(SYSNAME,O2.NAME),
           FKCOLUMN_NAME = CONVERT(SYSNAME,C2.NAME),
           -- Force the column to be non-nullable (see SQL BU 325751)
           --KEY_SEQ             = isnull(convert(smallint,k.constraint_column_id), sysconv(smallint,0)),
           UPDATE_RULE = CONVERT(SMALLINT,CASE OBJECTPROPERTY(F.OBJECT_ID,'CnstIsUpdateCascade') 
                                            WHEN 1 THEN 0
                                            ELSE 1
                                          END),
           DELETE_RULE = CONVERT(SMALLINT,CASE OBJECTPROPERTY(F.OBJECT_ID,'CnstIsDeleteCascade') 
                                            WHEN 1 THEN 0
                                            ELSE 1
                                          END),
           FK_NAME = CONVERT(SYSNAME,OBJECT_NAME(F.OBJECT_ID)),
           PK_NAME = CONVERT(SYSNAME,I.NAME),
           DEFERRABILITY = CONVERT(SMALLINT,7)   -- SQL_NOT_DEFERRABLE
    FROM   SYS.ALL_OBJECTS O1,
           SYS.ALL_OBJECTS O2,
           SYS.ALL_COLUMNS C1,
           SYS.ALL_COLUMNS C2,
           SYS.FOREIGN_KEYS F
           INNER JOIN SYS.FOREIGN_KEY_COLUMNS K
             ON (K.CONSTRAINT_OBJECT_ID = F.OBJECT_ID)
           INNER JOIN SYS.INDEXES I
             ON (F.REFERENCED_OBJECT_ID = I.OBJECT_ID
                 AND F.KEY_INDEX_ID = I.INDEX_ID)
    WHERE  O1.OBJECT_ID = F.REFERENCED_OBJECT_ID
           AND O2.OBJECT_ID = F.PARENT_OBJECT_ID
           AND C1.OBJECT_ID = F.REFERENCED_OBJECT_ID
           AND C2.OBJECT_ID = F.PARENT_OBJECT_ID
           AND C1.COLUMN_ID = K.REFERENCED_COLUMN_ID
           AND C2.COLUMN_ID = K.PARENT_COLUMN_ID
    
  9. ==============================

    9.가장 간단한 하나는 SQL에서 sys.foreign_keys_columns을 사용하는 것입니다. 다음 표는 참조 된 열 ID 참조 된 테이블 ID뿐만 아니라 참조하는 열 및 테이블 WRT 모든 외래 키의 개체 ID를 포함합니다. 이드의 유골 상수로서 그 결과는 스키마뿐만 아니라 테이블의 추가 수정을위한 신뢰할 수있는 것입니다.

    가장 간단한 하나는 SQL에서 sys.foreign_keys_columns을 사용하는 것입니다. 다음 표는 참조 된 열 ID 참조 된 테이블 ID뿐만 아니라 참조하는 열 및 테이블 WRT 모든 외래 키의 개체 ID를 포함합니다. 이드의 유골 상수로서 그 결과는 스키마뿐만 아니라 테이블의 추가 수정을위한 신뢰할 수있는 것입니다.

    질문:

    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
    

    우리는 또한 '어디'를 사용하여 필터를 추가 할 수 있습니다

    WHERE OBJECT_NAME(fkeys.parent_object_id) = 'table_name' AND 
    OBJECT_SCHEMA_NAME(fkeys.parent_object_id) = 'schema_name'
    
  10. ==============================

    10.

    SELECT
      object_name(parent_object_id),
      object_name(referenced_object_id),
      name 
    FROM sys.foreign_keys
    WHERE parent_object_id = object_id('Table Name')
    
  11. ==============================

    11.나는 외래 키에 관련된 모든 세부 정보를 찾기 위해이 스크립트를 사용하고 있습니다. 나는 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
    
  12. ==============================

    12.먼저

    먼저

    EXEC sp_fkeys 'Table', 'Schema'
    

    그런 다음 결과를 재생 NimbleText를 사용

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

    13.좋은 답변을 위. 그러나 나는 하나 개의 쿼리로 대답을하는 것을 선호합니다. 이 코드 조각은 sys.sp_helpconstraint에서 가져온 것입니다 (SYS PROC)

    좋은 답변을 위. 그러나 나는 하나 개의 쿼리로 대답을하는 것을 선호합니다. 이 코드 조각은 sys.sp_helpconstraint에서 가져온 것입니다 (SYS PROC)

    즉, TBL에 관련된 외래 키가있는 경우 마이크로 소프트가 보이는 방법이다.

    --setup variables. Just change 'Customer' to tbl you want
    declare @objid int,
        @objname nvarchar(776)
    select @objname = 'Customer'    
    select @objid = object_id(@objname)
    
    if exists (select * from sys.foreign_keys where referenced_object_id = @objid)
        select 'Table is referenced by foreign key' =
            db_name() + '.'
            + rtrim(schema_name(ObjectProperty(parent_object_id,'schemaid')))
            + '.' + object_name(parent_object_id)
            + ': ' + object_name(object_id)
        from sys.foreign_keys 
        where referenced_object_id = @objid 
        order by 1
    

    test_db_name.dbo.Account : 대답은 다음과 같이 표시됩니다 FK_Account_Customer을

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

    14.

    SELECT
    OBJECT_NAME(parent_object_id) 'Parent table',
    c.NAME 'Parent column name',
    OBJECT_NAME(referenced_object_id) 'Referenced table',
    cref.NAME 'Referenced column name'
    FROM 
    sys.foreign_key_columns fkc 
    INNER JOIN 
    sys.columns c 
       ON fkc.parent_column_id = c.column_id 
          AND fkc.parent_object_id = c.object_id
    INNER JOIN 
    sys.columns cref 
       ON fkc.referenced_column_id = cref.column_id 
          AND fkc.referenced_object_id = cref.object_id  where   OBJECT_NAME(parent_object_id) = 'tablename'
    

    당신은 모두의 외래 키 관계를 얻고 싶다면 테이블은 절 다른 TABLENAME의 당신의 TABLENAME를 대신 쓸 곳을 제외

  15. ==============================

    15.

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

    (가) 외래 키 제약 조건이있는 경우에만 관계를 보여줍니다. 내 데이터베이스 분명히 참조 무결성을 적용 할 FK constraint.Some 테이블 사용 트리거를 선행하고, 때로는 아무것도하지만 (전혀없이 참조 무결성)의 관계를 표시하기 위해 비슷한 이름의 열이 없습니다.

    내가 참조 테이블을 찾을 수 있어요 다행히, 우리는 일관된 명명 장면을해야합니까 그리고 전망이 좋아 :

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

    나는 이것이 스크립트를 생성하기위한 기초로 선택 사용하는 I가해야 할 일을하지 관련 테이블.

  16. ==============================

    16.@Gishu 내가 2005 서버를 생산하고 SQL에서 다음 SQL을 사용 할 수 있었다 무슨 짓을했는지의 오프 근무

    @Gishu 내가 2005 서버를 생산하고 SQL에서 다음 SQL을 사용 할 수 있었다 무슨 짓을했는지의 오프 근무

    SELECT t.name AS TableWithForeignKey, fk.constraint_column_id AS FK_PartNo, 
           c.name AS ForeignKeyColumn, o.name AS FK_Name 
      FROM sys.foreign_key_columns AS fk
           INNER JOIN sys.tables AS t ON fk.parent_object_id = t.object_id
           INNER JOIN sys.columns AS c ON fk.parent_object_id = c.object_id 
                                      AND fk.parent_column_id = c.column_id
           INNER JOIN sys.objects AS o ON fk.constraint_object_id = o.object_id
      WHERE fk.referenced_object_id = (SELECT object_id FROM sys.tables 
                                            WHERE name = 'TableOthersForeignKeyInto')
      ORDER BY TableWithForeignKey, FK_PartNo;
    

    어떤 표시 테이블, 열 및 외래 키 이름은 모두 1 개 쿼리를.

  17. ==============================

    17.데이터베이스의 모든 테이블에 대한 기본 키 및 고유 키를 결정 ...

    데이터베이스의 모든 테이블에 대한 기본 키 및 고유 키를 결정 ...

    이것은 모든 제약 조건을 나열해야하고 마지막에 당신은 당신의 필터를 넣을 수 있습니다

    /* 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;
    

    http://blogs.msdn.com/b/sqltips/archive/2005/09/16/469136.aspx - 참고 통해 읽어 주시기 바랍니다

  18. ==============================

    18.나는 2008 년까지에서이를 사용하고있다. 그것은 다른 목록에 솔루션을하지만, 필드 이름이 적절한 핸들의 경우 특정 (LatBin) 데이터 정렬을 맡았다되는 유사합니다. 또한, 당신은 그것을 하나의 테이블 이름을 공급하고 테이블 바로 정보를 검색 할 수 있습니다.

    나는 2008 년까지에서이를 사용하고있다. 그것은 다른 목록에 솔루션을하지만, 필드 이름이 적절한 핸들의 경우 특정 (LatBin) 데이터 정렬을 맡았다되는 유사합니다. 또한, 당신은 그것을 하나의 테이블 이름을 공급하고 테이블 바로 정보를 검색 할 수 있습니다.

    -->>SPECIFY THE DESIRED DB
    USE ???
    GO
    
    /*********************************************************************************************
    
        LIST OUT ALL PRIMARY AND FOREIGN KEY CONSTRAINTS IN A DB OR FOR A SPECIFIED TABLE
    
    *********************************************************************************************/
    DECLARE @tblName VARCHAR(255) 
    
    /*******************/
    
        SET @tblName = NULL-->NULL will return all PK/FK constraints for every table in the database
    
    /*******************/
    
    SELECT PKTABLE_QUALIFIER = CONVERT(SYSNAME,DB_NAME()), 
           PKTABLE_OWNER = CONVERT(SYSNAME,SCHEMA_NAME(O1.schema_id)), 
           PKTABLE_NAME = CONVERT(SYSNAME,O1.name), 
           PKCOLUMN_NAME = CONVERT(SYSNAME,C1.name), 
           FKTABLE_QUALIFIER = CONVERT(SYSNAME,DB_NAME()), 
           FKTABLE_OWNER = CONVERT(SYSNAME,SCHEMA_NAME(O2.schema_id)), 
           FKTABLE_NAME = CONVERT(SYSNAME,O2.name), 
           FKCOLUMN_NAME = CONVERT(SYSNAME,C2.name), 
           -- Force the column to be non-nullable (see SQL BU 325751) 
           KEY_SEQ             = isnull(convert(smallint,K.constraint_column_id),0), 
           UPDATE_RULE = CONVERT(SMALLINT,CASE OBJECTPROPERTY(F.object_id,'CnstIsUpdateCascade')  
                                            WHEN 1 THEN 0 
                                            ELSE 1 
                                          END), 
           DELETE_RULE = CONVERT(SMALLINT,CASE OBJECTPROPERTY(F.object_id,'CnstIsDeleteCascade')  
                                            WHEN 1 THEN 0 
                                            ELSE 1 
                                          END), 
           FK_NAME = CONVERT(SYSNAME,OBJECT_NAME(F.object_id)), 
           PK_NAME = CONVERT(SYSNAME,I.name), 
           DEFERRABILITY = CONVERT(SMALLINT,7)   -- SQL_NOT_DEFERRABLE 
    FROM   sys.all_objects O1, 
           sys.all_objects O2, 
           sys.all_columns C1, 
           sys.all_columns C2, 
           sys.foreign_keys F 
           INNER JOIN sys.foreign_key_columns K 
             ON (K.constraint_object_id = F.object_id) 
           INNER JOIN sys.indexes I 
             ON (F.referenced_object_id = I.object_id 
                 AND F.key_index_id = I.index_id) 
    WHERE  O1.object_id = F.referenced_object_id 
           AND O2.object_id = F.parent_object_id 
           AND C1.object_id = F.referenced_object_id 
           AND C2.object_id = F.parent_object_id 
           AND C1.column_id = K.referenced_column_id
           AND C2.column_id = K.parent_column_id
           AND (   O1.name = @tblName 
                OR O2.name = @tblName
                OR @tblName IS null)
    ORDER BY PKTABLE_NAME,FKTABLE_NAME
    
  19. ==============================

    19.선택한 아이디에 대한 모든 책임의 수를 얻는 방법이있다. 그냥 변경 @dbTableName 값 @dbRowId 값과 그 유형 (당신이 라인에서 '제거해야 INT 경우에는 82 (..SET @SQL = ..)).하지 즐겨.

    선택한 아이디에 대한 모든 책임의 수를 얻는 방법이있다. 그냥 변경 @dbTableName 값 @dbRowId 값과 그 유형 (당신이 라인에서 '제거해야 INT 경우에는 82 (..SET @SQL = ..)).하지 즐겨.

    DECLARE @dbTableName varchar(max) = 'User'
    DECLARE @dbRowId uniqueidentifier = '21d34ecd-c1fd-11e2-8545-002219a42e1c'
    
    DECLARE @FK_ROWCOUNT int
    DECLARE @SQL nvarchar(max)
    
    DECLARE @PKTABLE_QUALIFIER sysname
    DECLARE @PKTABLE_OWNER sysname
    DECLARE @PKTABLE_NAME sysname
    DECLARE @PKCOLUMN_NAME sysname
    DECLARE @FKTABLE_QUALIFIER sysname
    DECLARE @FKTABLE_OWNER sysname
    DECLARE @FKTABLE_NAME sysname
    DECLARE @FKCOLUMN_NAME sysname
    DECLARE @UPDATE_RULE smallint
    DECLARE @DELETE_RULE smallint
    DECLARE @FK_NAME sysname
    DECLARE @PK_NAME sysname
    DECLARE @DEFERRABILITY sysname
    
    IF OBJECT_ID('tempdb..#Temp1') IS NOT NULL
        DROP TABLE #Temp1;
    CREATE TABLE #Temp1 ( 
        PKTABLE_QUALIFIER sysname,
        PKTABLE_OWNER sysname,
        PKTABLE_NAME sysname,
        PKCOLUMN_NAME sysname,
        FKTABLE_QUALIFIER sysname,
        FKTABLE_OWNER sysname,
        FKTABLE_NAME sysname,
        FKCOLUMN_NAME sysname,
        UPDATE_RULE smallint,
        DELETE_RULE smallint,
        FK_NAME sysname,
        PK_NAME sysname,
        DEFERRABILITY sysname,
        FK_ROWCOUNT int
        );
    DECLARE FK_Counter_Cursor CURSOR FOR
        SELECT PKTABLE_QUALIFIER = CONVERT(SYSNAME,DB_NAME()),
           PKTABLE_OWNER = CONVERT(SYSNAME,SCHEMA_NAME(O1.SCHEMA_ID)),
           PKTABLE_NAME = CONVERT(SYSNAME,O1.NAME),
           PKCOLUMN_NAME = CONVERT(SYSNAME,C1.NAME),
           FKTABLE_QUALIFIER = CONVERT(SYSNAME,DB_NAME()),
           FKTABLE_OWNER = CONVERT(SYSNAME,SCHEMA_NAME(O2.SCHEMA_ID)),
           FKTABLE_NAME = CONVERT(SYSNAME,O2.NAME),
           FKCOLUMN_NAME = CONVERT(SYSNAME,C2.NAME),
           -- Force the column to be non-nullable (see SQL BU 325751)
           --KEY_SEQ             = isnull(convert(smallint,k.constraint_column_id), sysconv(smallint,0)),
           UPDATE_RULE = CONVERT(SMALLINT,CASE OBJECTPROPERTY(F.OBJECT_ID,'CnstIsUpdateCascade') 
                                            WHEN 1 THEN 0
                                            ELSE 1
                                          END),
           DELETE_RULE = CONVERT(SMALLINT,CASE OBJECTPROPERTY(F.OBJECT_ID,'CnstIsDeleteCascade') 
                                            WHEN 1 THEN 0
                                            ELSE 1
                                          END),
           FK_NAME = CONVERT(SYSNAME,OBJECT_NAME(F.OBJECT_ID)),
           PK_NAME = CONVERT(SYSNAME,I.NAME),
           DEFERRABILITY = CONVERT(SMALLINT,7)   -- SQL_NOT_DEFERRABLE
        FROM   SYS.ALL_OBJECTS O1,
               SYS.ALL_OBJECTS O2,
               SYS.ALL_COLUMNS C1,
               SYS.ALL_COLUMNS C2,
               SYS.FOREIGN_KEYS F
               INNER JOIN SYS.FOREIGN_KEY_COLUMNS K
                 ON (K.CONSTRAINT_OBJECT_ID = F.OBJECT_ID)
               INNER JOIN SYS.INDEXES I
                 ON (F.REFERENCED_OBJECT_ID = I.OBJECT_ID
                     AND F.KEY_INDEX_ID = I.INDEX_ID)
        WHERE  O1.OBJECT_ID = F.REFERENCED_OBJECT_ID
               AND O2.OBJECT_ID = F.PARENT_OBJECT_ID
               AND C1.OBJECT_ID = F.REFERENCED_OBJECT_ID
               AND C2.OBJECT_ID = F.PARENT_OBJECT_ID
               AND C1.COLUMN_ID = K.REFERENCED_COLUMN_ID
               AND C2.COLUMN_ID = K.PARENT_COLUMN_ID
               AND O1.NAME = @dbTableName
    OPEN FK_Counter_Cursor;
    FETCH NEXT FROM FK_Counter_Cursor INTO @PKTABLE_QUALIFIER, @PKTABLE_OWNER, @PKTABLE_NAME, @PKCOLUMN_NAME, @FKTABLE_QUALIFIER, @FKTABLE_OWNER, @FKTABLE_NAME, @FKCOLUMN_NAME, @UPDATE_RULE, @DELETE_RULE, @FK_NAME, @PK_NAME, @DEFERRABILITY;
    WHILE @@FETCH_STATUS = 0
       BEGIN
            SET @SQL = 'SELECT @dbCountOut = COUNT(*) FROM [' + @FKTABLE_NAME + '] WHERE [' + @FKCOLUMN_NAME + '] = ''' + CAST(@dbRowId AS varchar(max)) + '''';
            EXECUTE sp_executesql @SQL, N'@dbCountOut int OUTPUT', @dbCountOut = @FK_ROWCOUNT OUTPUT;
            INSERT INTO #Temp1 (PKTABLE_QUALIFIER, PKTABLE_OWNER, PKTABLE_NAME, PKCOLUMN_NAME, FKTABLE_QUALIFIER, FKTABLE_OWNER, FKTABLE_NAME, FKCOLUMN_NAME, UPDATE_RULE, DELETE_RULE, FK_NAME, PK_NAME, DEFERRABILITY, FK_ROWCOUNT) VALUES (@FKTABLE_QUALIFIER, @PKTABLE_OWNER, @PKTABLE_NAME, @PKCOLUMN_NAME, @FKTABLE_QUALIFIER, @FKTABLE_OWNER, @FKTABLE_NAME, @FKCOLUMN_NAME, @UPDATE_RULE, @DELETE_RULE, @FK_NAME, @PK_NAME, @DEFERRABILITY, @FK_ROWCOUNT)
          FETCH NEXT FROM FK_Counter_Cursor INTO @PKTABLE_QUALIFIER, @PKTABLE_OWNER, @PKTABLE_NAME, @PKCOLUMN_NAME, @FKTABLE_QUALIFIER, @FKTABLE_OWNER, @FKTABLE_NAME, @FKCOLUMN_NAME, @UPDATE_RULE, @DELETE_RULE, @FK_NAME, @PK_NAME, @DEFERRABILITY;
       END;
    CLOSE FK_Counter_Cursor;
    DEALLOCATE FK_Counter_Cursor;
    GO
    SELECT * FROM #Temp1
    GO
    
  20. ==============================

    20.MySQL의 서버는 테이블 이름 또는 참조 된 테이블의 이름을 필터링 할 수 있습니다, 참고 information_schema.REFERENTIAL_CONSTRAINTS 테이블이 있습니다.

    MySQL의 서버는 테이블 이름 또는 참조 된 테이블의 이름을 필터링 할 수 있습니다, 참고 information_schema.REFERENTIAL_CONSTRAINTS 테이블이 있습니다.

  21. ==============================

    21.SQL Server의 특정 테이블을 참조하는 모든 외래 키 목록 :

    SQL Server의 특정 테이블을 참조하는 모든 외래 키 목록 :

    당신은 쿼리를 다음을 통해 참조하는 테이블 이름과 열 이름을 얻을 수 있습니다 ...

    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'
    

    그리고 당신의 이해 스크린 샷 다음 ...

  22. ==============================

    22.이것은 선택된 테이블을 포함 외국 키를 가져옵니다. *는 _FIRSTABLENAME_SECONDTABLENAME 형식을 가정합니다.

    이것은 선택된 테이블을 포함 외국 키를 가져옵니다. *는 _FIRSTABLENAME_SECONDTABLENAME 형식을 가정합니다.

     declare @tablename as varchar(MAX)
     SET @tablename = 'yourtablename'
     SELECT name
     FROM YOURDATABASE.sys.objects
     WHERE type_desc = 'FOREIGN_KEY_CONSTRAINT' and (name LIKE '%_' + @tablename + 'empdb_%' or name LIKE '%_' + @tablename )
    

    이것은보다 일반적인 형태이다 :

     SELECT name
     FROM YOURDATABASE_PROD.sys.objects
     WHERE type_desc = 'FOREIGN_KEY_CONSTRAINT' and name LIKE '%' + @tablename + '%' and
     name NOT LIKE '[a-zA-Z0-9]' + @tablename + '%' and name NOT LIKE '%' + @tablename + '[a-zA-Z0-9]' 
    
  23. ==============================

    23.나를 위해 다음과 같은 솔루션 작업 :

    나를 위해 다음과 같은 솔루션 작업 :

    --Eliminar las llaves foraneas
    declare @query varchar(8000)
    declare cursorRecorrerTabla cursor for
    
    SELECT  'ALTER TABLE [PoaComFinH].['+sch.name+'].['+referencingTable.Name+'] DROP CONSTRAINT ['+foreignKey.name+']' 'query'
    FROM PoaComFinH.sys.foreign_key_columns fk
    JOIN PoaComFinH.sys.tables referencingTable ON fk.parent_object_id = referencingTable.object_id
    JOIN PoaComFinH.sys.schemas sch ON referencingTable.schema_id = sch.schema_id
    JOIN PoaComFinH.sys.objects foreignKey ON foreignKey.object_id = fk.constraint_object_id
    JOIN PoaComFinH.sys.tables referencedTable ON fk.referenced_object_id = referencedTable.object_id
    
    
    --3ro. abrir el cursor.
    open cursorRecorrerTabla
    fetch next from cursorRecorrerTabla
    into @query
    while @@fetch_status = 0
    begin
    --inicio cuerpo del cursor
        print @query
        exec(@query)
    --fin cuerpo del cursor
    fetch next from cursorRecorrerTabla
    into @query
    end
    --cerrar cursor
    close cursorRecorrerTabla
    deallocate cursorRecorrerTabla
    
  24. ==============================

    24.당신은 쿼리 아래를 통해 찾을 수 있습니다 :

    당신은 쿼리 아래를 통해 찾을 수 있습니다 :

     SELECT OBJECT_NAME (FK.referenced_object_id) 'Referenced Table', 
          OBJECT_NAME(FK.parent_object_id) 'Referring Table', FK.name 'Foreign Key', 
          COL_NAME(FK.referenced_object_id, FKC.referenced_column_id) 'Referenced Column',
          COL_NAME(FK.parent_object_id,FKC.parent_column_id) 'Referring Column'
         FROM sys.foreign_keys AS FK
                 INNER JOIN sys.foreign_key_columns AS FKC 
                     ON FKC.constraint_object_id = FK.OBJECT_ID
         WHERE OBJECT_NAME (FK.referenced_object_id) = 'YourTableName'
         AND COL_NAME(FK.referenced_object_id, FKC.referenced_column_id) = 'YourColumnName'
         order by  OBJECT_NAME(FK.parent_object_id)
    
  25. ==============================

    25.또한보십시오.

    또한보십시오.

    EXEC sp_fkeys 'tableName', 'schemaName'
    

    sp_fkeys 당신은뿐만 아니라 PK 테이블 이름과 스키마에 의해뿐만 아니라 FK 테이블 이름과 스키마 결과를 필터링 할 수 있습니다. 링크

  26. ==============================

    26.@BankZ의 가장 바람직한 대답

    @BankZ의 가장 바람직한 대답

    sp_help 'TableName'   
    

    또한 다른 스키마

    sp_help 'schemaName.TableName'   
    
  27. from https://stackoverflow.com/questions/483193/how-can-i-list-all-foreign-keys-referencing-a-given-table-in-sql-server by cc-by-sa and MIT license