[SQL] SQL Server의 데이터베이스의 모든 테이블 사이의 관계를 알고
SQLSQL Server의 데이터베이스의 모든 테이블 사이의 관계를 알고
내 데이터베이스의 테이블이 서로 (즉 PK / FK / UK)에 관련된 따라서 내가 SQL 서버 내 모든 테이블의 데이터베이스 다이어그램을 생성하는 방법을 모두 알고 싶습니다. 작성된 다이어그램을 쉽게 판독 않았고, 다른 쪽의 표를 참조하는 (때로는 가로 세로) 이동했다.
이 많은 테이블 사이의 관계를 알고에 올 때 짧은 SQL의 DB를 다이어그램에서 UI 친절하지 않습니다.
내 (단순) 질문 : DB 그림은 그러나 "좋은"방법으로 무슨 짓을 할 수있는 데이터베이스 다이어그램과 같은 뭔가인가?
해결법
-
==============================
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.또는 당신은 schemacrawler 볼 수 있습니다
또는 당신은 schemacrawler 볼 수 있습니다
-
==============================
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.이 저장 프로시 저는 관계의 계층 적 트리를 제공합니다. 윈스 테크넷에서이 문서 기준으로합니다. 또한 선택적으로 읽거나 모든 관련 데이터를 삭제하는 당신에게 쿼리를 제공 할 것입니다.
이 저장 프로시 저는 관계의 계층 적 트리를 제공합니다. 윈스 테크넷에서이 문서 기준으로합니다. 또한 선택적으로 읽거나 모든 관련 데이터를 삭제하는 당신에게 쿼리를 제공 할 것입니다.
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.Microsoft Visio에 최고의 I의 한은 비록 내가이 자동으로 관계를 기반으로 생성하지 않습니다 알고 지금까지처럼, 우연히 만났다 아마.
Microsoft Visio에 최고의 I의 한은 비록 내가이 자동으로 관계를 기반으로 생성하지 않습니다 알고 지금까지처럼, 우연히 만났다 아마.
편집 : 당신이 http://office.microsoft.com/en-us/visio-help/reverse-engineering-an-existing-database-HA001182257.aspx 필요한 것을 줄 수, Visio의이 시도
-
==============================
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.
select * from information_schema.REFERENTIAL_CONSTRAINTS where UNIQUE_CONSTRAINT_SCHEMA = 'TABLE_NAME'
이 TABLE_NAME 및 REFERENCED_COLUMN_NAME에 열을 나열합니다.
from https://stackoverflow.com/questions/8094156/know-relationships-between-all-the-tables-of-database-in-sql-server by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 인덱스의 키 컬럼으로 사용하기 위해 유효하지 않은 유형이다 (0) | 2020.05.08 |
---|---|
[SQL] 차 인덱스 번호를 다시 지정하는 방법 (0) | 2020.05.08 |
[SQL] SQL 성능 : WHERE WHERE (ROW_NUMBER) 대 (0) | 2020.05.08 |
[SQL] 어떻게 GROUP BY를 사용하여 각 그룹의 최신 기록을 얻으려면? [복제] (0) | 2020.05.08 |
[SQL] 가장 최근의 기록을 검색하는 SQL 쿼리를 작성 (0) | 2020.05.08 |