1. 현상


  - DB12c 이상에서, 특정 Column 에 대한 rename column 혹은 drop column 시, ORA-54032 와 함께 변경이 안됨


SQL> alter table OWNER.AG_NB_RD_SBAS_DD_SUM rename column MRD_STAT_CD to REP_POL_STAT_CD ; 

수행 시,, 아래 Message 를 출력 

"ORA-54032: column to be renamed is used in a virtual column expression"

"ORA-54033: column to be modified is used in a virtual column expression"



2. 원인


  - 해당 컬럼이 virtual column 에 포함되어 있어서 변경이 안됨

  - DB12c 이상 에서는, extended statistics 기능을 위해, 사용자가 생성하지 않은 컬럼도 DB 엔진이 virtual column 으로 지정해 별도 생성, 관리

  - extended statistics 에 대해서 기술된 내용 : This feature enables to Oracle calculate statistics on a group of columns. It uses this information to improve row estimates. This is useful when there's a correlation between the values of two (or more) columns in a table.

  - SYS_OP_COMBINED_HASH 은 an undocumented feature 라고 합니다. The name implies Oracle is merging the arguments together to form a hash 라고 기술되어 있습니다.

  

  - 확인 방법

SQL> select OWNER, table_name, column_name, data_type, hidden_column, data_default

        from dba_tab_cols

        where table_name ='해당_TABLE_NAME' and virtual_column = 'YES'

  # data_default 에 해당 column 이 포함되어 있다면, ORA-54032, ORA-54033 와 함께 변경이 안됨


  - 확인 결과 (셈풀)

COLUMN_NAME                 DATA_DEFAULT        HIDDEN_COLUMN

------------------------------                 --------------------------------------   ---------------------

SYS_STUYPW88OE302TFVBNC6$MMQXE SYS_OP_COMBINED_HASH("X","Y") YES

Z                                                                                         NO

Y                                         NO

X                                         NO 

  # 위와 같이 조회 되는 경우, X 와 Y 의 2개 Column 은 SYS_OP_COMBINED_HASH 에 속한 virtual column 이 됩니다.



3. 조치방법


  3-A. 해당 extended statistics 컬러을 삭제


  - 아래 Package 를 통해 삭제 가능


SQL> exec dbms_stats.drop_extended_stats( ownname => 'OWNER', tabname => '해당_TABLE_NAME', extension => '("BASE_YM","MRD_STAT_CD","MRD_PROD_CD")' ) ;

  혹은

SQL> exec dbms_stats.drop_extended_stats(OWNER, '해당_TABLE_NAME', '(BASE_YM, MRD_STAT_CD, MRD_PROD_CD)');


  - 아래 Package 를 통해 생성 가능 (필요하다고 판단할 경우, DB 가 다시 생성)


SQL> exec dbms_stats.create_extended_stats( ownname => 'OWNER', tabname => '해당_TABLE_NAME', extension => '("BASE_YM","MRD_STAT_CD","MRD_PROD_CD")' ) ;


  3-B. 해당 Table 을 재생성 : 재생성 데 따른 제약은 없습니다. 


SQL> alter table OWNER.AG_NB_RD_SBAS_DD_SUM drop primary key cascade ;  

SQL> drop table OWNER.AG_NB_RD_SBAS_DD_SUM cascade constraints ;

 

SQL> create table OWNER.AG_NB_RD_SBAS_DD_SUM ( ------  생략  ) ;



ps. 이 내용은 다음 URL을 참조하였습니다 : https://blogs.oracle.com/sql/entry/ora_54033_and_the_hidden 

+ Recent posts