#title Microsoft SQL Server MetaData [[TableOfContents]] ==== 개요 ==== MetaData! 이거 골치 아프다. MS Office문서나 기타 워드프로세스, 스프레드시트 등으로 만들어 낸 문서는 쓸모가 거의 없다. 왜냐하면 최신성을 보장할 수 없기 때문이다. 만약 변경이 모니터링 되고, 관리 된다면 정말 쓸모 있을 것이다. 하지만 윗 사람들이 알아주질 않는게 현실이다. 제한된 인력으로 관리하기란 쉽지가 않다. 욕심쟁이 엔지니어라면 모를까 난 자신이 없다. 어쨌든 관리가 되려면 DB화 되어야 한다. DB화는 DBMS에 저장되어야 한다는 뜻이다. Microsoft SQL Server에서 이를 어떻게 관리할까? MetaData를 위한 데이터 모델을 만들까도 생각해 보았으나, 어쨌든 유연성이 떨어진다. 유연성이 있게 설계하면 되지 않겠느냐고 할 수도 있지만, 역시 손이 많이 가는 것이 사실이다. 여러 방면으로 방안을 찾아보았다. 결론은 '확장 속성'을 이용하는 것이다. 확장 속성은 아주 유연하기 때문에 MetaData로는 손색이 없다. MetaData Tool을 만들어도 될 듯하다. 중요한 것은 디지털화 된 문서(.docx, .hwp, .xlsx, .pptx 등)는 관리되기 힘들다는 것이다. 모든 개발/변경의 끝에는 문서화를 해야 하며, 문서화가 끝나기 전까지는 아무런 작업도 못한다고 제도화 한다면 모를까 시간이 지나면 관리되지 않는 것이 현실이다. 특히나 문서라는 것은 특정한 형식에 맞추어야 하는데, 이것도 문서화에 대한 반감을 사기도 한다. 그러므로 진정으로 Metadata를 관리하기 위해서는 Metadata는 데이터베이스 관리 시스템에 보관되고 관리되어야 한다. ==== 테이블 메타데이터 ==== {{{ SELECT 'EXEC sys.sp_addextendedproperty ' + CASE WHEN B.Seq = 1 THEN 'N''1. Source IP'', '''', ' WHEN B.Seq = 2 THEN 'N''2. Source DB'', '''', ' WHEN B.Seq = 3 THEN 'N''3. Source Schema'', '''', ' WHEN B.Seq = 4 THEN 'N''4. Source Table'', '''', ' WHEN B.Seq = 5 THEN 'N''5. ETL Rule'', '''', ' WHEN B.Seq = 6 THEN 'N''6. Descriptions'', '''', ' END + 'N''SCHEMA'', N''' + TABLE_SCHEMA + ''', ' + 'N''TABLE'', N''' + TABLE_NAME + '''' from information_schema.tables CROSS JOIN ( SELECT 1 Seq UNION ALL SELECT 2 Seq UNION ALL SELECT 3 Seq UNION ALL SELECT 4 Seq UNION ALL SELECT 5 Seq UNION ALL SELECT 6 ) B WHERE TABLE_NAME = '테이블명' }}} ==== 컬럼에 대한 메타데이터 ==== {{{ -- 테이블 컬럼의 확장속성을 이용한다. -- 소스 IP -- 소스 DB -- 소스 Schema -- 소스 테이블 -- 소스 컬럼 -- ETL Rule -- Value Rule SELECT 'EXEC sys.sp_addextendedproperty ' + CASE WHEN B.Seq = 1 THEN 'N''1. Source IP'', '''', ' WHEN B.Seq = 2 THEN 'N''2. Source DB'', '''', ' WHEN B.Seq = 3 THEN 'N''3. Source Schema'', '''', ' WHEN B.Seq = 4 THEN 'N''4. Source Table'', '''', ' WHEN B.Seq = 5 THEN 'N''5. Source Column'', '''', ' WHEN B.Seq = 6 THEN 'N''6. ETL Rule'', '''', ' WHEN B.Seq = 7 THEN 'N''7. Value Rule'', '''', ' END + 'N''SCHEMA'', N''' + TABLE_SCHEMA + ''', ' + 'N''TABLE'', N''' + TABLE_NAME + ''', ' + 'N''COLUMN'', N''' + COLUMN_NAME + '''' FROM INFORMATION_SCHEMA.COLUMNS CROSS JOIN ( SELECT 1 Seq UNION ALL SELECT 2 Seq UNION ALL SELECT 3 Seq UNION ALL SELECT 4 Seq UNION ALL SELECT 5 Seq UNION ALL SELECT 6 Seq UNION ALL SELECT 7) B --WHERE TABLE_NAME = '테이블명' }}} ==== 확장속성 조회 ==== {{{ select distinct s.name as [schema] , t.name as [table name] , c.name as [column name] , ep.name as [property name] , ep.value as [business definition] from sys.tables as t inner join sys.schemas as s on s.schema_id = t.schema_id inner join sys.columns as c on t.object_id = c.object_id inner join sys.extended_properties as ep on ep.major_id = t.object_id and ep.minor_id=c.column_id --where ep.name in ('1. Source IP') }}} ==== 참고할 만한 자료 ==== * [http://www.sqlservercentral.com/articles/BI/76106/ Managing Data Dictionaries in DW and DSS Database Applications]