program story

SQL Server 2008-테이블 제약 조건 가져 오기

inputbox 2020. 12. 15. 19:17
반응형

SQL Server 2008-테이블 제약 조건 가져 오기


모든 테이블의 제약 조건, 각 테이블의 제약 조건 수를 검색하고 제약 조건이없는 테이블의 경우 NULL을 표시하는 쿼리를 구성하는 데 도움이 될 수 있습니다. 미리 Thx!

이것이 내가 지금까지 가지고있는 것입니다.

Select  SysObjects.[Name] As [Constraint Name] ,
        Tab.[Name] as [Table Name],
        Col.[Name] As [Column Name]
From SysObjects Inner Join 
(Select [Name],[ID] From SysObjects) As Tab
On Tab.[ID] = Sysobjects.[Parent_Obj] 
Inner Join sysconstraints On sysconstraints.Constid = Sysobjects.[ID] 
Inner Join SysColumns Col On Col.[ColID] = sysconstraints.[ColID] And Col.[ID] = Tab.[ID]
order by [Tab].[Name] 

현재 sys카탈로그 뷰를 사용해야합니다 (SQL Server 2005 이상을 사용하는 경우 - sysobjects뷰는 더 이상 사용되지 않으며 사용하지 않아야 함) . 여기에서 카탈로그 뷰에 대한 광범위한 MSDN SQL Server 온라인 설명서를 확인하십시오 .

관심을 가질만한 몇 가지보기가 있습니다.

  • sys.default_constraints 열에 대한 기본 제약 조건
  • sys.check_constraints 열에 대한 검사 제약
  • sys.key_constraints 키 제약 (예 : 기본 키)
  • sys.foreign_keys 외래 키 관계

그리고 훨씬 더 -확인해보세요!

필요한 정보를 얻기 위해 해당 뷰를 쿼리하고 조인 할 수 있습니다. 예를 들어 테이블, 열 및 여기에 정의 된 모든 기본 제약 조건을 나열합니다.

SELECT 
    TableName = t.Name,
    ColumnName = c.Name,
    dc.Name,
    dc.definition
FROM sys.tables t
INNER JOIN sys.default_constraints dc ON t.object_id = dc.parent_object_id
INNER JOIN sys.columns c ON dc.parent_object_id = c.object_id AND c.column_id = dc.parent_column_id
ORDER BY t.Name

다음 쿼리를 사용하여 SQL Server 2012에서 제약 조건 정보를 검색했으며 완벽하게 작동합니다. 도움이 되셨기를 바랍니다.

SELECT 
    tab.name AS [Table]
    ,tab.id AS [Table Id]
    ,constr.name AS [Constraint Name]
    ,constr.xtype AS [Constraint Type]
    ,CASE constr.xtype WHEN 'PK' THEN 'Primary Key' WHEN 'UQ' THEN 'Unique' ELSE '' END AS [Constraint Name]
    ,i.index_id AS [Index ID]
    ,ic.column_id AS [Column ID]
    ,clmns.name AS [Column Name]
    ,clmns.max_length AS [Column Max Length]
    ,clmns.precision AS [Column Precision]
    ,CASE WHEN clmns.is_nullable = 0 THEN 'NO' ELSE 'YES' END AS [Column Nullable]
    ,CASE WHEN clmns.is_identity = 0 THEN 'NO' ELSE 'YES' END AS [Column IS IDENTITY]
FROM SysObjects AS tab
INNER JOIN SysObjects AS constr ON(constr.parent_obj = tab.id AND constr.type = 'K')
INNER JOIN sys.indexes AS i ON( (i.index_id > 0 and i.is_hypothetical = 0) AND (i.object_id=tab.id) AND i.name = constr.name )
INNER JOIN sys.index_columns AS ic ON (ic.column_id > 0 and (ic.key_ordinal > 0 or ic.partition_ordinal = 0 or ic.is_included_column != 0)) 
                                    AND (ic.index_id=CAST(i.index_id AS int) 
                                    AND ic.object_id=i.object_id)
INNER JOIN sys.columns AS clmns ON clmns.object_id = ic.object_id and clmns.column_id = ic.column_id
WHERE tab.xtype = 'U'
ORDER BY tab.name

이 쿼리로 얻을 수 있습니다.

Unique Constraint, 고유 제약

Default Constraint With Value, 값이있는 기본 제약

참조 된 테이블 및 열이있는 외래 키

그리고 Primary Key Constraint.

Select C.*, (Select definition From sys.default_constraints Where object_id = C.object_id) As dk_definition,
(Select definition From sys.check_constraints Where object_id = C.object_id) As ck_definition,
(Select name From sys.objects Where object_id = D.referenced_object_id) As fk_table,
(Select name From sys.columns Where column_id = D.parent_column_id And object_id = D.parent_object_id) As fk_col
From sys.objects As C
Left Join (Select * From sys.foreign_key_columns) As D On D.constraint_object_id = C.object_id 
Where C.parent_object_id = (Select object_id From sys.objects Where type = 'U'
And name = 'Table Name Here');

SELECT
    [oj].[name] [TableName],
    [ac].[name] [ColumnName],
    [dc].[name] [DefaultConstraintName],
    [dc].[definition]
FROM
    sys.default_constraints [dc],
    sys.all_objects [oj],
    sys.all_columns [ac]
WHERE
    (
        ([oj].[type] IN ('u')) AND
        ([oj].[object_id] = [dc].[parent_object_id]) AND
        ([oj].[object_id] = [ac].[object_id]) AND
        ([dc].[parent_column_id] = [ac].[column_id])
    )

marc_s가 제공 한 답변 을 편집하려고했지만 어떤 이유로 받아 들여지지 않았습니다. 쉽게 읽을 수 있도록 SQL 형식을 지정하고 스키마를 포함하며 다른 코드에 쉽게 붙여 넣을 수 있도록 기본 이름도 지정합니다.

  SELECT SchemaName = s.Name,
         TableName = t.Name,
         ColumnName = c.Name,
         DefaultName = dc.Name,
         DefaultDefinition = dc.Definition
    FROM sys.schemas                s
    JOIN sys.tables                 t   on  t.schema_id          = s.schema_id
    JOIN sys.default_constraints    dc  on  dc.parent_object_id  = t.object_id 
    JOIN sys.columns                c   on  c.object_id          = dc.parent_object_id
                                        and c.column_id          = dc.parent_column_id
ORDER BY s.Name, t.Name, c.name

참조 URL : https://stackoverflow.com/questions/14229277/sql-server-2008-get-table-constraints

반응형