본문 바로가기
dev/webDev

테이블 명세서 자동 생성 프로그램. ( MS-SQL, ASP )

by Kelvin™ 2012. 1. 6.

1. 만든 이유
    INFORMATION_SCHEMA.COLUMNS 의 존재를 알게된 후 그냥 만들어 놓으면 편할 것 같아서.
    원래 테이블 명세서라는게 프로젝트 개발 전에 모두 완료되어 하지만.. 현실은 그렇지 않음.. 쿨럭.

2. 주의점
    화일 소스에 DB 접속정보가 있으니 보안에 조심조심..
    
3. 장점
   현재 DB 의 DB 명세서를 한방에 만들 수 있다.

4. 단점
    ms-sql 에서만 테스트 했슴. 다른 DB 는 모름.

5. 사용방법
    접속 정보 입력하고 실행만 하면 됨.

6. 사용된 쿼리구문..
select   
    t_columns.table_catalog,  
    t_columns.table_name,  
    t_columns.column_name,    
    t_columns.ordinal_position,  
    t_columns.column_default,    
    t_columns.is_nullable, 
    t_columns.data_type, 
    t_columns.character_maximum_length,  
    t_columns.is_nullable, 
    case when t_columns.column_name=isnull(t_column_usage.column_name,'') and t_table_const.constraint_type='PRIMARY KEY' then 'Y' else ' ' end as PK, 
    case when t_columns.column_name=isnull(t_column_usage.column_name,'') and t_table_const.constraint_type='FOREIGN KEY' then 'Y' else ' ' end as FK, 
    case when t_columns.column_name=isnull(t_column_usage.column_name,'') and t_table_const.constraint_type='FOREIGN KEY' then 
(SELECT 
PK_Table  = PK.TABLE_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 and C.CONSTRAINT_NAME=t_table_const.CONSTRAINT_NAME
)
    else ' ' end as FK_table ,
    case when t_columns.column_name=isnull(t_column_usage.column_name,'') and t_table_const.constraint_type='FOREIGN KEY' then 
(SELECT 
PK_Column = PT.COLUMN_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 and C.CONSTRAINT_NAME=t_table_const.CONSTRAINT_NAME
)
    else ' ' end as FK_column

  FROM 
    INFORMATION_SCHEMA.COLUMNS t_columns left outer join INFORMATION_SCHEMA.KEY_COLUMN_USAGE t_column_usage 
      on t_columns.TABLE_NAME+t_columns.column_name=t_column_usage.TABLE_NAME+t_column_usage.column_name  
    left outer join INFORMATION_SCHEMA.TABLE_CONSTRAINTS t_table_const 
      on t_column_usage.constraint_name=t_table_const.constraint_name 
  order by   
     t_columns.table_name,t_columns.ordinal_position 


7. 소스.


db_information.txt





FK 부분 정보 추가.