2010-06-01 3 views
3

Oracle 9i에서 ALL_TAB_COLS 뷰를 조회하면 UNUSED로 표시된 열과 '활성'테이블 열이 나열됩니다. 명시 적으로 열이 UNUSED인지 여부 또는 테이블에 사용되지 않는 열을 나열하는 뷰가 있는지 여부를 나타내는 필드가없는 것 같습니다. 사용하지 않는 열이 무엇인지 쉽게 알 수 있도록 어떻게 ALL_TAB_COLS에서 필터링 할 수 있습니까?ALL_TAB_COLS에서 어떤 열이 사용되지 않았는지 어떻게 알 수 있습니까?

답변

2

ALL_TAB_COLS 대신 ALL_TAB_COLUMNS를 사용해보십시오. Oracle 11.2에서 사용되지 않는 열은 ALL_TAB_COLS (이름은 바뀌 었음)에 표시되지만 ALL_TAB_COLUMNS에는 표시되지 않습니다.

alter table t1 set unused column c2; 

그럼 I 참조 :

select column_name from all_tab_cols where owner='ME' and table_name='T1'; 

COLUMN_NAME 
----------- 
C1 
SYS_C00002_10060107:25:40$ 

select column_name from all_tab_columns where owner='ME' and table_name='T1'; 

COLUMN_NAME 
----------- 
C1 
+0

불행히도, all_tab_cols에 필요한 정보 (숨겨진 데이터 유형 및 LOB 열, 기능 색인의 숨겨진 가상 열 ...)가 있습니다. – thecoop

+0

사용하지 않는 열 이름 형식이 동일해야합니다 (sys_c00002_10060107 : 25 : 40 $ ')? – thecoop

+0

미안하지만, 나는 잘 모르겠다. –

1

ALL_TAB_COLUMNS 정의에 유일한 필터는 그 다음 미사용 C2 설정

create table t1 (c1 varchar2(30), c2 varchar2(30); 

:

은이 같은 테이블을 작성 "where hidden_column = 'NO'"이므로 UNUSED 열이 HIDDEN_COLUMN 필드에 플래그로 표시됩니다.

데이터 정의보기를 보면 열이 UNUSED가되면 COL $ .PROPERTY가 32800 (비트 2^5 및 2^15)으로 설정됩니다. 2^5는 숨겨진 열을 표시하는 데 사용되므로 2^15는 UNUSED 일 수 있습니다. 필요한 것 (예 : this)과 같이 작동해야하는 것을 기반으로 ALL_TAB_COLS의 사용자 정의 버전을 작성할 수 있습니다.

CREATE OR REPLACE FORCE VIEW all_tab_cols_rev (owner, 
               table_name, 
               column_name, 
               data_type, 
               data_type_mod, 
               data_type_owner, 
               data_length, 
               data_precision, 
               data_scale, 
               nullable, 
               column_id, 
               default_length, 
               data_default, 
               num_distinct, 
               low_value, 
               high_value, 
               density, 
               num_nulls, 
               num_buckets, 
               last_analyzed, 
               sample_size, 
               character_set_name, 
               char_col_decl_length, 
               global_stats, 
               user_stats, 
               avg_col_len, 
               char_length, 
               char_used, 
               v80_fmt_image, 
               data_upgraded, 
               hidden_column, 
               virtual_column, 
               segment_column_id, 
               internal_column_id, 
               histogram, 
               qualified_col_name, 
               unused_column) 
AS 
    SELECT u.NAME, 
      o.NAME, 
      c.NAME, 
      DECODE (c.type#, 
        1, DECODE (c.CHARSETFORM, 2, 'NVARCHAR2', 'VARCHAR2'), 
        2, DECODE (c.scale, NULL, DECODE (c.precision#, NULL, 'NUMBER', 'FLOAT'), 'NUMBER'), 
        8, 'LONG', 
        9, DECODE (c.CHARSETFORM, 2, 'NCHAR VARYING', 'VARCHAR'), 
        12, 'DATE', 
        23, 'RAW', 
        24, 'LONG RAW', 
        58, NVL2 (ac.synobj#, (SELECT o.NAME 
              FROM obj$ o 
              WHERE o.obj# = ac.synobj#), ot.NAME), 
        69, 'ROWID', 
        96, DECODE (c.CHARSETFORM, 2, 'NCHAR', 'CHAR'), 
        100, 'BINARY_FLOAT', 
        101, 'BINARY_DOUBLE', 
        105, 'MLSLABEL', 
        106, 'MLSLABEL', 
        111, NVL2 (ac.synobj#, (SELECT o.NAME 
              FROM obj$ o 
              WHERE o.obj# = ac.synobj#), ot.NAME), 
        112, DECODE (c.CHARSETFORM, 2, 'NCLOB', 'CLOB'), 
        113, 'BLOB', 
        114, 'BFILE', 
        115, 'CFILE', 
        121, NVL2 (ac.synobj#, (SELECT o.NAME 
              FROM obj$ o 
              WHERE o.obj# = ac.synobj#), ot.NAME), 
        122, NVL2 (ac.synobj#, (SELECT o.NAME 
              FROM obj$ o 
              WHERE o.obj# = ac.synobj#), ot.NAME), 
        123, NVL2 (ac.synobj#, (SELECT o.NAME 
              FROM obj$ o 
              WHERE o.obj# = ac.synobj#), ot.NAME), 
        178, 'TIME(' || c.scale || ')', 
        179, 'TIME(' || c.scale || ')' || ' WITH TIME ZONE', 
        180, 'TIMESTAMP(' || c.scale || ')', 
        181, 'TIMESTAMP(' || c.scale || ')' || ' WITH TIME ZONE', 
        231, 'TIMESTAMP(' || c.scale || ')' || ' WITH LOCAL TIME ZONE', 
        182, 'INTERVAL YEAR(' || c.precision# || ') TO MONTH', 
        183, 'INTERVAL DAY(' || c.precision# || ') TO SECOND(' || c.scale || ')', 
        208, 'UROWID', 
        'UNDEFINED'), 
      DECODE (c.type#, 111, 'REF'), 
      NVL2 (ac.synobj#, (SELECT u.NAME 
           FROM user$ u, obj$ o 
           WHERE o.owner# = u.user# 
           AND o.obj# = ac.synobj#), ut.NAME), 
      c.LENGTH, 
      c.precision#, 
      c.scale, 
      DECODE (SIGN (c.null$), -1, 'D', 0, 'Y', 'N'), 
      DECODE (c.col#, 0, TO_NUMBER (NULL), c.col#), 
      c.deflength, 
      c.default$, 
      h.distcnt, 
      h.lowval, 
      h.hival, 
      h.density, 
      h.null_cnt, 
      CASE 
      WHEN NVL (h.distcnt, 0) = 0 
       THEN h.distcnt 
      WHEN h.row_cnt = 0 
       THEN 1 
      WHEN ( h.bucket_cnt > 255 
        OR ( h.bucket_cnt > h.distcnt 
         AND h.row_cnt = h.distcnt 
         AND h.density * h.bucket_cnt <= 1)) 
       THEN h.row_cnt 
      ELSE h.bucket_cnt 
      END, 
      h.timestamp#, 
      h.sample_size, 
      DECODE (c.CHARSETFORM, 
        1, 'CHAR_CS', 
        2, 'NCHAR_CS', 
        3, NLS_CHARSET_NAME (c.CHARSETID), 
        4, 'ARG:' || c.CHARSETID), 
      DECODE (c.CHARSETID, 0, TO_NUMBER (NULL), NLS_CHARSET_DECL_LEN (c.LENGTH, c.CHARSETID)), 
      DECODE (BITAND (h.spare2, 2), 2, 'YES', 'NO'), 
      DECODE (BITAND (h.spare2, 1), 1, 'YES', 'NO'), 
      h.avgcln, 
      c.spare3, 
      DECODE (c.type#, 
        1, DECODE (BITAND (c.property, 8388608), 0, 'B', 'C'), 
        96, DECODE (BITAND (c.property, 8388608), 0, 'B', 'C'), 
        NULL), 
      DECODE (BITAND (ac.flags, 128), 128, 'YES', 'NO'), 
      DECODE (o.status, 
        1, DECODE (BITAND (ac.flags, 256), 256, 'NO', 'YES'), 
        DECODE (BITAND (ac.flags, 2), 
          2, 'NO', 
          DECODE (BITAND (ac.flags, 4), 4, 'NO', DECODE (BITAND (ac.flags, 8), 8, 'NO', 'N/A')))), 
      DECODE (c.property, 0, 'NO', DECODE (BITAND (c.property, 32), 32, 'YES', 'NO')), 
      DECODE (c.property, 0, 'NO', DECODE (BITAND (c.property, 8), 8, 'YES', 'NO')), 
      DECODE (c.segcol#, 0, TO_NUMBER (NULL), c.segcol#), 
      c.intcol#, 
      CASE 
      WHEN NVL (h.row_cnt, 0) = 0 
       THEN 'NONE' 
      WHEN ( h.bucket_cnt > 255 
        OR ( h.bucket_cnt > h.distcnt 
         AND h.row_cnt = h.distcnt 
         AND h.density * h.bucket_cnt <= 1)) 
       THEN 'FREQUENCY' 
      ELSE 'HEIGHT BALANCED' 
      END, 
      DECODE (BITAND (c.property, 1024), 
        1024, (SELECT DECODE (BITAND (cl.property, 1), 1, rc.NAME, cl.NAME) 
          FROM SYS.col$ cl, attrcol$ rc 
          WHERE cl.intcol# = c.intcol# - 1 
          AND cl.obj# = c.obj# 
          AND c.obj# = rc.obj#(+) 
          AND cl.intcol# = rc.intcol#(+)), 
        DECODE (BITAND (c.property, 1), 0, c.NAME, (SELECT tc.NAME 
                   FROM SYS.attrcol$ tc 
                   WHERE c.obj# = tc.obj# 
                   AND c.intcol# = tc.intcol#))), 
      DECODE (c.property, 0, 'NO', DECODE (BITAND (c.property, 32768), 32768, 'YES', 'NO')) 
    FROM SYS.col$ c, SYS.obj$ o, SYS.hist_head$ h, SYS.user$ u, SYS.coltype$ ac, SYS.obj$ ot, SYS.user$ ut 
    WHERE o.obj# = c.obj# 
     AND o.owner# = u.user# 
     AND c.obj# = h.obj#(+) 
     AND c.intcol# = h.intcol#(+) 
     AND c.obj# = ac.obj#(+) 
     AND c.intcol# = ac.intcol#(+) 
     AND ac.toid = ot.oid$(+) 
     AND ot.type#(+) = 13 
     AND ot.owner# = ut.user#(+) 
     AND ( o.type# IN (3, 4) /* cluster, view */ 
      OR ( o.type# = 2 /* tables, excluding iot - overflow and nested tables */ 
       AND NOT EXISTS (
         SELECT NULL 
          FROM SYS.tab$ t 
          WHERE t.obj# = o.obj# 
          AND ( BITAND (t.property, 512) = 512 
           OR BITAND (t.property, 8192) = 8192)))) 
     AND ( o.owner# = USERENV ('SCHEMAID') 
      OR o.obj# IN (SELECT obj# 
          FROM SYS.objauth$ 
          WHERE grantee# IN (SELECT kzsrorol 
               FROM x$kzsro)) 
      OR /* user has system privileges */ 
       EXISTS (
       SELECT NULL 
        FROM v$enabledprivs 
        WHERE priv_number IN 
          (-45 /* LOCK ANY TABLE */, 
          -47 /* SELECT ANY TABLE */, 
          -48 /* INSERT ANY TABLE */, 
          -49 /* UPDATE ANY TABLE */, 
          -50 /* DELETE ANY TABLE */))); 

I는 그 다음 SELECT에게 ANY DICTIONARY 권한을 가진 별도의 고정 스키마에 뷰를 넣어 것 그것을 위해 공용 동의어를 만들 수 있습니다. 이렇게하면 모든 사용자가 권한이있는 테이블에 대해서만 UNUSED_COLUMN 열을 볼 수 있습니다.

+0

불행하게도 다른 숨겨진 열이 있습니다 (색인 된 가상 열, LOB 열 ...) – thecoop

관련 문제