λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Database

[Oracle] DB12c μ—μ„œ ORA-54032, ORA-54033 컬럼 이름변경 및 μ‚­μ œκ°€ μ•ˆλ˜λŠ” ν˜„μƒ

by μ•„λ¦¬κ°€λ˜πŸ™‚ 2023. 3. 14.

1. ν˜„μƒ

  - DB12c μ΄μƒμ—μ„œ, νŠΉμ • Column 에 λŒ€ν•œ rename column ν˜Ήμ€ drop column μ‹œ, ORA-54032 or ORA-54033 μ—λŸ¬ λ©”μ‹œμ§€ 좜λ ₯

SQL> alter table OWNER.USER_MST rename column USR_ID to USER_ID; 
>μ•„λž˜ λ©”μ‹œμ§€ 좜λ ₯ 
"ORA-54032: column to be renamed is used in a virtual column expression"
"ORA-54032: 이름을 λ°”κΏ€ 열이 가상 μ—΄ ν‘œν˜„μ‹μ—μ„œ μ‚¬μš©λ˜μ—ˆμŠ΅λ‹ˆλ‹€."
"ORA-54033: column to be modified is used in a virtual column expression"
"ORA-54033: 이름을 λ°”κΏ€ 열이 가상 μ—΄ ν‘œν˜„μ‹μ—μ„œ μ‚¬μš©λ˜μ—ˆμŠ΅λ‹ˆλ‹€."

 

2. 원인

  - ν•΄λ‹Ή 컬럼이 virtual column으둜 λ§Œλ“€μ–΄μ Έ 있음. μ‚¬μš©μžκ°€ λͺ…μ‹œμ μœΌλ‘œ μ•ˆλ§Œλ“€μ—ˆλ”λΌλ„ 12c 버전뢀터 μƒˆλ‘œ 생긴 κΈ°λŠ₯인 extended statistics κΈ°λŠ₯ 쀑에 ν•˜λ‚˜κ°€ λ‹€μˆ˜μ˜ column에 λŒ€ν•œ SQL optimizer statisticsλ₯Ό (μžλ™μœΌλ‘œ) 생성 μˆ˜μ§‘ν•˜λŠ” κ²ƒμœΌλ‘œ 이 κΈ°λŠ₯ λ•Œλ¬Έμ— 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 λ©”μ‹œμ§€μ™€ ν•¨κ»˜ λ³€κ²½ λ˜μ§€ μ•ŠμŒ.

 


 

3. μ‘°μΉ˜λ°©λ²•

  3-1. ν•΄λ‹Ή extended statistics μ»¬λŸΌμ„ μ‚­μ œ

 

  - μ•„λž˜ 쿼리λ₯Ό 톡해 μ‚­μ œ κ°€λŠ₯

SQL> exec dbms_stats.drop_extended_stats( ownname => 'OWNER', tabname => '[TABLE_NAME]', extension => '("USER_NM","USER_PWD","USR_ID")' ) ;

 

SQL> exec dbms_stats.drop_extended_stats(OWNER, '[TABLE_NAME]', '(USER_NM, USER_PWD, USR_ID)');

 

  - μ•„λž˜ 쿼리λ₯Ό 톡해 생성 κ°€λŠ₯ (ν•„μš”ν•˜λ‹€κ³  νŒλ‹¨ν•  경우, DB κ°€ λ‹€μ‹œ 생성)

SQL> exec dbms_stats.create_extended_stats( ownname => 'OWNER', tabname => '[TABLE_NAME]', extension => '("USER_NM","USER_PWD","USR_ID")' ) ;

 

  3-2. ν•΄λ‹Ή Table 을 μž¬μƒμ„± 

SQL> alter table OWNER.USER_MST drop primary key cascade ;  
SQL> drop table OWNER.USER_MST cascade constraints ;


SQL> create table OWNER.USER_MST ( ---- ) ;

 

λŒ“κΈ€