복붙노트

[SQL] SQL Server의 데이터베이스의 모든 테이블 사이의 관계를 알고

SQL

SQL Server의 데이터베이스의 모든 테이블 사이의 관계를 알고

내 데이터베이스의 테이블이 서로 (즉 PK / FK / UK)에 관련된 따라서 내가 SQL 서버 내 모든 테이블의 데이터베이스 다이어그램을 생성하는 방법을 모두 알고 싶습니다. 작성된 다이어그램을 쉽게 판독 않았고, 다른 쪽의 표를 참조하는 (때로는 가로 세로) 이동했다.

이 많은 테이블 사이의 관계를 알고에 올 때 짧은 SQL의 DB를 다이어그램에서 UI 친절하지 않습니다.

내 (단순) 질문 : DB 그림은 그러나 "좋은"방법으로 무슨 짓을 할 수있는 데이터베이스 다이어그램과 같은 뭔가인가?

해결법

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

    1.때때로, 텍스트 표현도 도움이 될 수 있습니다; 시스템 카탈로그 뷰에서이 쿼리와 함께, 당신은 모든 FK 관계의 목록을 얻을 수있는 방법을 링크 두 테이블 (어떤 컬럼 그들이에서 작동).

    때때로, 텍스트 표현도 도움이 될 수 있습니다; 시스템 카탈로그 뷰에서이 쿼리와 함께, 당신은 모든 FK 관계의 목록을 얻을 수있는 방법을 링크 두 테이블 (어떤 컬럼 그들이에서 작동).

    SELECT
        fk.name 'FK Name',
        tp.name 'Parent table',
        cp.name, cp.column_id,
        tr.name 'Refrenced table',
        cr.name, cr.column_id
    FROM 
        sys.foreign_keys fk
    INNER JOIN 
        sys.tables tp ON fk.parent_object_id = tp.object_id
    INNER JOIN 
        sys.tables tr ON fk.referenced_object_id = tr.object_id
    INNER JOIN 
        sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id
    INNER JOIN 
        sys.columns cp ON fkc.parent_column_id = cp.column_id AND fkc.parent_object_id = cp.object_id
    INNER JOIN 
        sys.columns cr ON fkc.referenced_column_id = cr.column_id AND fkc.referenced_object_id = cr.object_id
    ORDER BY
        tp.name, cp.column_id
    

    Excel로이 덤프, 당신은 슬라이스와 주사위 수 - 부모 테이블, 참조 된 테이블이나 다른 어떤 기준으로합니다.

    나는 시각적 가이드가 도움이 - 그러나 때때로, 텍스트 문서는 좋은으로 (또는 더 나은)입니다 - 그냥 내 2 센트 .....

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

    2.또는 당신은 schemacrawler 볼 수 있습니다

    또는 당신은 schemacrawler 볼 수 있습니다

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

    3.그냥 다른 방법은 INFORMATION_SCHEMA를 사용하여 동일한 데이터를 검색 할

    그냥 다른 방법은 INFORMATION_SCHEMA를 사용하여 동일한 데이터를 검색 할

    sqlauthority 방법

    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='something'WHERE FK.TABLE_NAME='something'
    WHERE PK.TABLE_NAME IN ('one_thing', 'another')
    WHERE FK.TABLE_NAME IN ('one_thing', 'another')
    
  4. ==============================

    4.이 저장 프로시 저는 관계의 계층 적 트리를 제공합니다. 윈스 테크넷에서이 문서 기준으로합니다. 또한 선택적으로 읽거나 모든 관련 데이터를 삭제하는 당신에게 쿼리를 제공 할 것입니다.

    이 저장 프로시 저는 관계의 계층 적 트리를 제공합니다. 윈스 테크넷에서이 문서 기준으로합니다. 또한 선택적으로 읽거나 모든 관련 데이터를 삭제하는 당신에게 쿼리를 제공 할 것입니다.

    IF OBJECT_ID('GetForeignKeyRelations','P') IS NOT NULL 
        DROP PROC GetForeignKeyRelations 
    GO 
    
    CREATE PROC GetForeignKeyRelations 
    @Schemaname Sysname = 'dbo' 
    ,@Tablename Sysname 
    ,@WhereClause NVARCHAR(2000) = '' 
    ,@GenerateDeleteScripts bit  = 0  
    ,@GenerateSelectScripts bit  = 0 
    
    AS 
    
    SET NOCOUNT ON 
    
    DECLARE @fkeytbl TABLE 
    ( 
    ReferencingObjectid        int NULL 
    ,ReferencingSchemaname  Sysname NULL 
    ,ReferencingTablename   Sysname NULL  
    ,ReferencingColumnname  Sysname NULL 
    ,PrimarykeyObjectid     int  NULL 
    ,PrimarykeySchemaname   Sysname NULL 
    ,PrimarykeyTablename    Sysname NULL 
    ,PrimarykeyColumnname   Sysname NULL 
    ,Hierarchy              varchar(max) NULL 
    ,level                  int NULL 
    ,rnk                    varchar(max) NULL 
    ,Processed                bit default 0  NULL 
    ); 
    
    
    
     WITH fkey (ReferencingObjectid,ReferencingSchemaname,ReferencingTablename,ReferencingColumnname 
                ,PrimarykeyObjectid,PrimarykeySchemaname,PrimarykeyTablename,PrimarykeyColumnname,Hierarchy,level,rnk) 
        AS 
        ( 
            SELECT                   
                                   soc.object_id 
                                  ,scc.name 
                                  ,soc.name 
                                  ,convert(sysname,null) 
                                  ,convert(int,null) 
                                  ,convert(sysname,null) 
                                  ,convert(sysname,null) 
                                  ,convert(sysname,null) 
                                  ,CONVERT(VARCHAR(MAX), scc.name + '.' + soc.name  ) as Hierarchy 
                                  ,0 as level 
                                  ,rnk=convert(varchar(max),soc.object_id) 
            FROM SYS.objects soc 
            JOIN sys.schemas scc 
              ON soc.schema_id = scc.schema_id 
           WHERE scc.name =@Schemaname 
             AND soc.name =@Tablename 
          UNION ALL 
          SELECT                   sop.object_id 
                                  ,scp.name 
                                  ,sop.name 
                                  ,socp.name 
                                  ,soc.object_id 
                                  ,scc.name 
                                  ,soc.name 
                                  ,socc.name 
                                  ,CONVERT(VARCHAR(MAX), f.Hierarchy + ' --> ' + scp.name + '.' + sop.name ) as Hierarchy 
                                  ,f.level+1 as level 
                                  ,rnk=f.rnk + '-' + convert(varchar(max),sop.object_id) 
            FROM SYS.foreign_key_columns sfc 
            JOIN Sys.Objects sop 
              ON sfc.parent_object_id = sop.object_id 
            JOIN SYS.columns socp 
              ON socp.object_id = sop.object_id 
             AND socp.column_id = sfc.parent_column_id 
            JOIN sys.schemas scp 
              ON sop.schema_id = scp.schema_id 
            JOIN SYS.objects soc 
              ON sfc.referenced_object_id = soc.object_id 
            JOIN SYS.columns socc 
              ON socc.object_id = soc.object_id 
             AND socc.column_id = sfc.referenced_column_id 
            JOIN sys.schemas scc 
              ON soc.schema_id = scc.schema_id 
            JOIN fkey f 
              ON f.ReferencingObjectid = sfc.referenced_object_id 
            WHERE ISNULL(f.PrimarykeyObjectid,0) <> f.ReferencingObjectid 
          ) 
    
         INSERT INTO @fkeytbl 
         (ReferencingObjectid,ReferencingSchemaname,ReferencingTablename,ReferencingColumnname 
                ,PrimarykeyObjectid,PrimarykeySchemaname,PrimarykeyTablename,PrimarykeyColumnname,Hierarchy,level,rnk) 
         SELECT ReferencingObjectid,ReferencingSchemaname,ReferencingTablename,ReferencingColumnname 
                ,PrimarykeyObjectid,PrimarykeySchemaname,PrimarykeyTablename,PrimarykeyColumnname,Hierarchy,level,rnk 
           FROM fkey 
    
            SELECT F.Relationshiptree 
             FROM 
            ( 
            SELECT DISTINCT Replicate('------',Level) + CASE LEVEL WHEN 0 THEN '' ELSE '>' END +  ReferencingSchemaname + '.' + ReferencingTablename 'Relationshiptree' 
                   ,RNK 
              FROM @fkeytbl 
              ) F 
            ORDER BY F.rnk ASC 
    
    ------------------------------------------------------------------------------------------------------------------------------- 
    -- Generate the Delete / Select script 
    ------------------------------------------------------------------------------------------------------------------------------- 
    
        DECLARE @Sql VARCHAR(MAX) 
        DECLARE @RnkSql VARCHAR(MAX) 
    
        DECLARE @Jointables TABLE 
        ( 
        ID INT IDENTITY 
        ,Object_id int 
        ) 
    
        DECLARE @ProcessTablename SYSNAME 
        DECLARE @ProcessSchemaName SYSNAME 
    
        DECLARE @JoinConditionSQL VARCHAR(MAX) 
        DECLARE @Rnk VARCHAR(MAX) 
        DECLARE @OldTablename SYSNAME 
    
        IF @GenerateDeleteScripts = 1 or @GenerateSelectScripts = 1  
        BEGIN 
    
              WHILE EXISTS ( SELECT 1 
                               FROM @fkeytbl 
                              WHERE Processed = 0 
                                AND level > 0 ) 
              BEGIN 
    
                SELECT @ProcessTablename = '' 
                SELECT @Sql                 = '' 
                SELECT @JoinConditionSQL = '' 
                SELECT @OldTablename     = '' 
    
    
                SELECT TOP 1 @ProcessTablename = ReferencingTablename 
                      ,@ProcessSchemaName  = ReferencingSchemaname 
                      ,@Rnk = RNK  
                  FROM @fkeytbl 
                 WHERE Processed = 0 
                  AND level > 0  
                 ORDER BY level DESC 
    
    
                SELECT @RnkSql ='SELECT ' + REPLACE (@rnk,'-',' UNION ALL SELECT ')  
    
                DELETE FROM @Jointables 
    
                INSERT INTO @Jointables 
                EXEC(@RnkSql) 
    
                IF @GenerateDeleteScripts = 1 
                    SELECT @Sql = 'DELETE [' + @ProcessSchemaName + '].[' + @ProcessTablename + ']' + CHAR(10) + ' FROM [' + @ProcessSchemaName + '].[' + @ProcessTablename + ']' + CHAR(10) 
    
                IF @GenerateSelectScripts = 1 
                    SELECT @Sql = 'SELECT  [' + @ProcessSchemaName + '].[' + @ProcessTablename + '].*' + CHAR(10) + ' FROM [' + @ProcessSchemaName + '].[' + @ProcessTablename + ']' + CHAR(10) 
    
                SELECT @JoinConditionSQL = @JoinConditionSQL  
                                               + CASE  
                                                 WHEN @OldTablename <> f.PrimarykeyTablename THEN  'JOIN ['  + f.PrimarykeySchemaname  + '].[' + f.PrimarykeyTablename + '] ' + CHAR(10) + ' ON ' 
                                                 ELSE ' AND '  
                                                 END 
                                               + ' ['  + f.PrimarykeySchemaname  + '].[' + f.PrimarykeyTablename + '].[' + f.PrimarykeyColumnname + '] =  ['  + f.ReferencingSchemaname  + '].[' + f.ReferencingTablename + '].[' + f.ReferencingColumnname + ']' + CHAR(10)  
                         , @OldTablename = CASE  
                                             WHEN @OldTablename <> f.PrimarykeyTablename THEN  f.PrimarykeyTablename 
                                             ELSE @OldTablename 
                                             END 
    
                      FROM @fkeytbl f 
                      JOIN @Jointables j 
                        ON f.Referencingobjectid  = j.Object_id 
                     WHERE charindex(f.rnk + '-',@Rnk + '-') <> 0 
                       AND F.level > 0 
                     ORDER BY J.ID DESC 
    
                SELECT @Sql = @Sql +  @JoinConditionSQL 
    
                IF LTRIM(RTRIM(@WhereClause)) <> ''  
                    SELECT @Sql = @Sql + ' WHERE (' + @WhereClause + ')' 
    
                PRINT @SQL 
                PRINT CHAR(10) 
    
                UPDATE @fkeytbl 
                   SET Processed = 1 
                 WHERE ReferencingTablename = @ProcessTablename 
                   AND rnk = @Rnk 
    
              END 
    
              IF @GenerateDeleteScripts = 1 
                SELECT @Sql = 'DELETE FROM [' + @Schemaname + '].[' + @Tablename + ']' 
    
              IF @GenerateSelectScripts = 1 
                SELECT @Sql = 'SELECT * FROM [' + @Schemaname + '].[' + @Tablename + ']' 
    
              IF LTRIM(RTRIM(@WhereClause)) <> ''  
                    SELECT @Sql = @Sql  + ' WHERE ' + @WhereClause 
    
             PRINT @SQL 
         END 
    
    SET NOCOUNT OFF 
    
    
    go 
    
  5. ==============================

    5.Microsoft Visio에 최고의 I의 한은 비록 내가이 자동으로 관계를 기반으로 생성하지 않습니다 알고 지금까지처럼, 우연히 만났다 아마.

    Microsoft Visio에 최고의 I의 한은 비록 내가이 자동으로 관계를 기반으로 생성하지 않습니다 알고 지금까지처럼, 우연히 만났다 아마.

    편집 : 당신이 http://office.microsoft.com/en-us/visio-help/reverse-engineering-an-existing-database-HA001182257.aspx 필요한 것을 줄 수, Visio의이 시도

  6. ==============================

    6.내 솔루션은 @marc_s 솔루션을 기반으로, 난 그냥 제약이 둘 이상의 열을 기반으로되는 경우에 열이 연결된 :

    내 솔루션은 @marc_s 솔루션을 기반으로, 난 그냥 제약이 둘 이상의 열을 기반으로되는 경우에 열이 연결된 :

    SELECT
       FK.[name] AS ForeignKeyConstraintName
      ,SCHEMA_NAME(FT.schema_id) + '.' + FT.[name] AS ForeignTable
      ,STUFF(ForeignColumns.ForeignColumns, 1, 2, '') AS ForeignColumns
      ,SCHEMA_NAME(RT.schema_id) + '.' + RT.[name] AS ReferencedTable
      ,STUFF(ReferencedColumns.ReferencedColumns, 1, 2, '') AS ReferencedColumns
    FROM
      sys.foreign_keys FK
      INNER JOIN sys.tables FT
      ON FT.object_id = FK.parent_object_id
      INNER JOIN sys.tables RT
      ON RT.object_id = FK.referenced_object_id
      CROSS APPLY
      (
        SELECT
          ', ' + iFC.[name] AS [text()]
        FROM
          sys.foreign_key_columns iFKC
          INNER JOIN sys.columns iFC
          ON iFC.object_id = iFKC.parent_object_id
            AND iFC.column_id = iFKC.parent_column_id
        WHERE
          iFKC.constraint_object_id = FK.object_id
        ORDER BY
          iFC.[name]
        FOR XML PATH('')
      ) ForeignColumns (ForeignColumns)
      CROSS APPLY
      (
        SELECT
          ', ' + iRC.[name]AS [text()]
        FROM
          sys.foreign_key_columns iFKC
          INNER JOIN sys.columns iRC
          ON iRC.object_id = iFKC.referenced_object_id
            AND iRC.column_id = iFKC.referenced_column_id
        WHERE
          iFKC.constraint_object_id = FK.object_id
        ORDER BY
          iRC.[name]
        FOR XML PATH('')
      ) ReferencedColumns (ReferencedColumns)
    
  7. ==============================

    7.

    select * from information_schema.REFERENTIAL_CONSTRAINTS where 
    UNIQUE_CONSTRAINT_SCHEMA = 'TABLE_NAME' 
    

    이 TABLE_NAME 및 REFERENCED_COLUMN_NAME에 열을 나열합니다.

  8. from https://stackoverflow.com/questions/8094156/know-relationships-between-all-the-tables-of-database-in-sql-server by cc-by-sa and MIT license