2013-08-07 4 views
-1

안녕하세요 dba_tab_cols 쿼리를 사용하여 기본 키와 고유 키를 검색 할 수 있습니까?Oracle dba_tab_cols query

다음 필드를 모두 검색 할 수있는 쿼리가 있습니까?

  • 열 이름
  • 데이터 형식
  • 기본 키
  • 널/NOT NULL
  • 고유 키
  • 기본값
  • 추가

답변

1

기본 및 고유 키 하나 이상의 c에 걸쳐있을 수있다. olumn, 그래서 그들은 dba_tab_columns에 속하지 않을 것입니다. 해당 정보를 얻으려면 dba_constraintsdba_cons_columns을 확인해야합니다.

어쩌면, 출발점입니다 :

select owner, table_name, column_name, data_type, primary_key, 
    nullable, unique_key, data_default 
from (
    select dtc.owner, dtc.table_name, dtc.column_id, dtc.column_name, 
    dtc.data_type, dtc.nullable, dtc.data_default, 
    case when dc.constraint_type = 'P' and dcc.column_name = dtc.column_name 
     then dc.constraint_name end as primary_key, 
    case when dc.constraint_type = 'U' and dcc.column_name = dtc.column_name 
     then dc.constraint_name end as unique_key, 
    row_number() over (partition by dtc.owner, dtc.table_name, dtc.column_id 
     order by null) as rn 
    from dba_tab_columns dtc 
    left join dba_constraints dc 
    on dc.owner = dtc.owner 
    and dc.table_name = dtc.table_name 
    and dc.constraint_type in ('P', 'U') 
    left join dba_cons_columns dcc 
    on dcc.owner = dc.owner 
    and dcc.constraint_name = dc.constraint_name 
    and dcc.table_name = dc.table_name 
    and dcc.column_name = dtc.column_name 
    where dtc.owner = '<owner>' 
    and dtc.table_name = '<table_name>' 
) 
where rn = 1 
order by owner, table_name, column_id; 

난 당신이 하나 개 이상의 제약 조건이있는 테이블에 대한 중복을 얻을 것 때문에 row_number 값을 생성하는 하위 쿼리와 함께이 일을했습니다; 기본값 인 long (열 data_default)을 원하므로 distinct 또는 group by을 사용할 수 없습니다. 조금은 기분이 좋지 않지만, 당신이 필요로하는 것을 얻기 위해 그것을 할 수 있다고 확신합니다.

not null 버전을 복제하는 체크 제약 조건을 설정할 수도 있습니다 (권장하지는 않지만). 고유 색인은 고유 제한으로 표시되지 않으므로 dba_indexesdba_ind_columns을 통해 그 중 하나를 찾고 싶을 수도 있습니다. 그러나 고유 제한을 백업하는 데 사용되는 색인은 둘 다에 표시됩니다.

당신이하려는 의도에 따라이 정보를 얻으려면 dbms_metadata.get_ddl을 볼 수도 있습니다. 왜 다른 곳에서 스키마를 다시 만들려고하는 것이 아닌 다른 곳에서 유용하게 사용할 수 있을지 모르겠지만 더 나은 도구가 있습니다.