programing

SQL Server의 테이블을 참조하는 FORENAL KEY 제약 조건이 무엇인지 어떻게 알 수 있습니까?

fastcode 2023. 4. 25. 23:12
반응형

SQL Server의 테이블을 참조하는 FORENAL KEY 제약 조건이 무엇인지 어떻게 알 수 있습니까?

테이블을 삭제하려고 하는데 다음 메시지가 표시됩니다.

, 16단계, 상태 1, 33726호선, 16단계, 13단계, 3단계이다.
이렇게 '또'는 '또'또'는요?FORENAL KEY 사용자 프로파일'입니다.
, 16번, 6번, 22714번, 16번, 16번, 2번입니다.
'사용자 프로파일'입니다.

SQL Server Management Studio로 둘러보았지만 제약사항을 찾을 수 없습니다.외부 키 제약 조건은 어떻게 알 수 있나요?

여기 있습니다.

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

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

sp_help 'TableName'

(또는 따옴표로 묶인 TableName을 강조 표시하고 ALT+F1을 누릅니다.)

시간이 지남에 따라, 저는 제 대답을 다듬기로 결심했습니다.는 하다, 하다, 하다, 하다, 하다, 하다의 결과를 스크린샷한 것입니다.sp_helpA는 AdventureWorksAadventure AdventureWorks를 사용했습니다.DW2012 DB입니다.여기에는 수많은 유용한 정보가 있으며, 가장 끝에 녹색으로 강조 표시되어 있습니다.

여기에 이미지 설명을 입력하십시오.

이거 드셔보세요

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

저는 이 답이 매우 간단하다는 것을 알았고 제가 필요한 것을 위해 https://stackoverflow.com/a/12956348/652519를 이용했습니다.

링크의 요약은 다음 쿼리를 사용합니다.

EXEC sp_fkeys 'TableName'

빠르고 간단합니다.저는 15개 테이블의 모든 외래 키 테이블과 각 컬럼, 외래 키 이름을 매우 빠르게 찾을 수 있었습니다.

@mdisibio가 아래에 언급한 바와 같이, https://learn.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-fkeys-transact-sql에서 사용할 수 있는 다양한 매개 변수를 자세히 설명하는 설명서에 대한 링크가 있습니다.

다음은 모든 데이터베이스에서 외부 키 관계를 찾는 가장 좋은 방법입니다.

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)

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

개체 탐색기 창에서 SSMS를 통해 이동하려면 놓을 개체를 마우스 오른쪽 버튼으로 클릭하고 종속성을 확인합니다.

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;

SQL Server Management Studio에서 개체 탐색기의 테이블을 마우스 오른쪽 버튼으로 클릭하고 "의존 관계 보기"를 선택하면 됩니다.이렇게 하면 좋은 출발점이 될 거예요.여기에는 테이블을 참조하는 테이블, 뷰 및 절차가 표시됩니다.

개체 탐색기에서 테이블을 확장하고 키:

여기에 이미지 설명을 입력하십시오.

--다음은 여러분이 원하는 것을 더 많이 제공할 수 있습니다.

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

이 쿼리를 사용하여 표시할 수 있습니다.Foreign key제약 조건:

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-in-database/에서 가져옵니다.

또한 에 대한 모든 정보를 반환할 수 있습니다.Foreign Keys@LittleSweetSeas의 답변을 수정하십시오.

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

가장 쉽게 구할 수 있는 방법이죠Primary Key그리고.Foreign Key테이블은 다음과 같습니다.

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

다음 쿼리를 시도하십시오.

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

그러면 contraint_name, column_names가 참조되고 제약 조건에 따라 테이블이 표시됩니다.

절차입니다.

_sp_help 'tbl_name'_ 

많은 정보를 제공하지만 절차를 찾을 수 있습니다.

_sp_fkeys 'tbl_name'_ and 
_sp_pkeys 'tbl_name'_ 

보다 사용하기 쉽고 미래 대비적인 결과를 얻을 수 있습니다.

(그리고 그들은 완벽하게 OP에 답합니다.)

언급URL : https://stackoverflow.com/questions/17501840/how-can-i-find-out-what-foreign-key-constraint-references-a-table-in-sql-server 입니다.

반응형