db/postgreSQL

postgreSQL 에서 테이블 형상 scan

너도 2019. 11. 18. 15:24
-- 컬럼 정보 조회.. 
with info as ( 
  select '%%' table_catalog 
        ,'%%' table_schema 
        ,'%' table_name 
  from dual 
) 
,t_cmmt as ( 
SELECT ps.schemaname as table_schema 
      ,PS.RELNAME as table_name  
      ,PD.DESCRIPTION AS TABLE_COMMENT   
   FROM PG_STAT_USER_TABLES PS             
        inner join PG_DESCRIPTION      PD  
        on PS.RELID   = PD.OBJOID          
 WHERE  1=1                                
 and    ps.schemaname = (select table_schema from info)        
 and    PS.RELNAME    like '%'||(select table_name from info)||'%'          
 AND    PD.OBJSUBID  = 0  
) 
,t_col as( 
select tc.table_catalog                                            
       , tc.table_schema                                             
       , tc.table_name            table_name                         
       , tc.column_name           column_name                        
       , udt_name                 column_type                        
       , character_maximum_length column_length                      
       , ordinal_position         column_position                    
  from information_schema.columns tc                                 
  where 1=1                                                          
  and   tc.table_catalog  = (select table_catalog from info)                               
  and   tc.table_schema   = (select table_schema from info)    
  and   tc.table_name like '%'||(select table_name from info)||'%' 
) 
,pk as ( 
  select tcnst.constraint_catalog                                    
    ,tcnst.table_schema                                          
    ,tcnst.table_name                                            
        ,ccu.column_name                                             
  from   information_schema.TABLE_CONSTRAINTS tcnst                  
         inner join information_schema.key_column_usage  ccu  
         on   tcnst.constraint_catalog = ccu.constraint_catalog      
         and tcnst.table_schema = ccu.table_schema                   
         and tcnst.table_name = ccu.table_name                       
  where  tcnst.constraint_catalog = (select table_catalog from info)                         
  and    tcnst.table_schema = (select table_schema from info)                        
  and    tcnst.table_name like '%'||(select table_name from info)||'%'                        
  and    constraint_type = 'PRIMARY KEY'   
) 
,col_cmt as ( 
select schemaname  
      ,relname table_name 
      ,pd.objsubid posi 
      ,description col_comment 
from PG_DESCRIPTION PD 
     inner join PG_STAT_ALL_TABLES PS  
     on pd.objoid = PS.relid 
where  PS.schemaname = (select table_schema from info) 
and    ps.relname like '%'||(select table_name from info)||'%' 
) 
select  t_cmmt.table_name  
,t_cmmt.TABLE_COMMENT   
,t_col.column_name 
,t_col.column_type 
,t_col.column_length leng 
,t_col.column_position p 
,case when pk.column_name is null then '' else 'Y' end pk 
,col_cmt.col_comment 
from t_cmmt 
     inner join t_col 
     on t_cmmt.table_schema =t_col.table_schema 
     and t_cmmt.table_name =t_col.table_name 
     left outer join pk 
     on t_col.table_schema =pk.table_schema 
     and t_col.table_name =pk.table_name 
     and t_col.column_name = pk.column_name 
     inner join col_cmt 
     on t_col.table_schema =col_cmt.schemaname 
     and t_col.table_name =col_cmt.table_name 
     and t_col.column_position = col_cmt.posi 
order by 1,2, column_position