カラム定義の整合性チェック用SQL
カラム定義の整合性チェック用SQL

概要 データベースの開発に伴って、表の構造は頻繁に修正される。だんだん、カラムの整合性がもてなくなる。このSQLは類似のカラムを一括でチェックし、問題になりそうなカラムを出力してくれる。
結果ですが、データタイプ、サイズを一カラムに集約する形で表現した。
そうでなければ、コンパクトに結果を確認できないから。
皆さんはニーズがあればどうぞdata_typeの定義と比較のところを修正してください。

-- -------------------------------------
-- FUS version 2.1 
-- Apache Licence
-- oracle-abc.wikidot.com
-- -------------------------------------
 
set lin 80
set pages 9999
column data_type format a25
 
-- 全体あいまい一致
select /*+ rule */
  p.table_name, p.column_name, p.data_type,  
  t.table_name, t.column_name, t.data_type
from 
(select 
  table_name, column_name, 
  data_type||'('||nvl(data_precision,data_length)||'.'||nvl(data_scale,'0')||')' data_type
  from user_tab_columns where table_name not like 'BIN$%') p 
join 
(select 
  table_name, column_name, 
  data_type||'('||nvl(data_precision,data_length)||'.'||nvl(data_scale,'0')||')' data_type
  from user_tab_columns where table_name not like 'BIN$%') t
on ((t.column_name like '%' || p.column_name || '%'
    or p.column_name like '%' || t.column_name || '%')
  and p.data_type <> t.data_type)
where p.table_name < t.table_name
order by p.column_name, p.table_name
 
-- 後方一致
select /*+ rule */
  p.table_name, p.column_name, p.data_type,  
  t.table_name, t.column_name, t.data_type
from 
(select 
  table_name, column_name, 
  data_type||'('||nvl(data_precision,data_length)||'.'||nvl(data_scale,'0')||')' data_type
  from user_tab_columns where table_name not like 'BIN$%') p 
join 
(select 
  table_name, column_name, 
  data_type||'('||nvl(data_precision,data_length)||'.'||nvl(data_scale,'0')||')' data_type
  from user_tab_columns where table_name not like 'BIN$%') t
on ((t.column_name like '%' || p.column_name
    or p.column_name like '%' || t.column_name)
  and p.data_type <> t.data_type)
where p.table_name < t.table_name
order by p.column_name, p.table_name
 
-- 前方一致(このネーミングスタイル使っている開発者が少ないと思うが。。。)
select /*+ rule */
  p.table_name, p.column_name, p.data_type,  
  t.table_name, t.column_name, t.data_type
from 
(select 
  table_name, column_name, 
  data_type||'('||nvl(data_precision,data_length)||'.'||nvl(data_scale,'0')||')' data_type
  from user_tab_columns where table_name not like 'BIN$%') p 
join 
(select 
  table_name, column_name, 
  data_type||'('||nvl(data_precision,data_length)||'.'||nvl(data_scale,'0')||')' data_type
  from user_tab_columns where table_name not like 'BIN$%') t
on ((t.column_name like p.column_name || '%'
    or p.column_name like t.column_name || '%')
  and p.data_type <> t.data_type)
where p.table_name < t.table_name
order by p.column_name, p.table_name
 
-- 完全一致
select /*+ rule */
  p.table_name, p.column_name, p.data_type,  
  t.table_name, t.column_name, t.data_type
from 
(select 
  table_name, column_name, 
  data_type||'('||nvl(data_precision,data_length)||'.'||nvl(data_scale,'0')||')' data_type
  from user_tab_columns where table_name not like 'BIN$%') p 
join 
(select 
  table_name, column_name, 
  data_type||'('||nvl(data_precision,data_length)||'.'||nvl(data_scale,'0')||')' data_type
  from user_tab_columns where table_name not like 'BIN$%') t
on ((t.column_name = p.column_name
    or p.column_name = t.column_name)
  and p.data_type <> t.data_type)
where p.table_name < t.table_name
order by p.column_name, p.table_name