天天看點

分區表更新時報ORA-14402的錯誤

【說明】在進行對oralce的分區表的分區字段進行update操作的時候,就會報ORA-14402的錯誤,這種情況通過開啟表的行移動來避免錯誤的發生;

【場景模拟】

1、建立分區表SCOTT.EMP_BAK

CREATE TABLE EMP_BAK

(

EMPNO NUMBER(4),

ENAME VARCHAR2(10 BYTE),

JOB VARCHAR2(9 BYTE),

MGR NUMBER(4),

HIREDATE DATE,

SAL NUMBER(7,2),

COMM NUMBER(7,2),

DEPTNO NUMBER(2),

DLVL NUMBER(2)

)

LOGGING

PARTITION BY LIST (DLVL)

SUBPARTITION BY LIST (DEPTNO)

PARTITION EMP_P1 VALUES (1)

( SUBPARTITION EMP1_SUB1 VALUES (10) TABLESPACE USERS,

SUBPARTITION EMP1_SUB2 VALUES (20) TABLESPACE USERS,

SUBPARTITION EMP1_SUB3 VALUES (30) TABLESPACE USERS ),

PARTITION EMP_P2 VALUES (2)

( SUBPARTITION EMP2_SUB1 VALUES (10) TABLESPACE USERS,

SUBPARTITION EMP2_SUB2 VALUES (20) TABLESPACE USERS,

SUBPARTITION EMP2_SUB3 VALUES (30) TABLESPACE USERS )

2、模拟報錯:對DEPTNO進行UPDATE的操作

SQL> update SCOTT.EMP_BAK SET DEPTNO=20 WHERE EMPNO=7782;

ORA-14402: updating partition key column would cause a partition change

3、啟動行遷移

SQL> alter table scott.EMP_BAK enable row movement;

4、重新執行操作

1 row updated.

5、關閉行遷移

SQL> alter table scott.EMP_BAK disable row movement;

報錯的了解:

分區表某一行更新時,如果更新的是分區列,并且更新後的列值不屬于原來的這個分區,update的操作就相當于把這行從這個分區中delete掉,并加到更新後所屬的分區。等同于delete+insert的操作;

在進行update操作的時候,相應行的rowid的值是會跟着變化的,如果沒有開啟row movement那麼肯定就更新不了。   

【建議】在進行分區表操作的時候,需要跟業務進行溝通,作為分區條件的列,盡量不能改變;