An attempt was made to online redefine a table that is either a clustered table, AQ table, temporary table, IOT overflow table or table with FGA/RLS enabled.
Invalid operation on online redefinition interim table
"string"."string".
Security Model
Execute is granted to execute_catalog_role
The following privileges must be granted to the user:
ALTER ANY TABLE
CREATE ANY TABLE
DROP ANY TABLE
LOCK ANY TABLE
SELECT ANY TABLE
The following privileges may be required too:
CREATE ANY INDEX
CREATE ANY TRIGGER
ABORT_REDEF_TABLE
Cleans Up Errors From The Redefinition
Process
dbms_redefinition.abort_redef_table(
uname IN VARCHAR2,
orig_table IN VARCHAR2,
int_table IN VARCHAR2,
part_name IN VARCHAR2 := NULL);
See demo: below
CAN_REDEF_TABLE
Determines if a given table can be redefined online
dbms_redefinition.can_redef_table(
uname IN VARCHAR2,
tname IN VARCHAR2,
options_flag IN BINARY_INTEGER := 1,
part_name IN VARCHAR2 := NULL);
-- see constants above
See demo: below
COPY_TABLE_DEPENDENTS
(copy_mvlog added in 11g)
Copies the dependant objects
of the original table to the interim table
dbms_redefinition.copy_table_dependents(
uname IN VARCHAR2,
orig_table IN VARCHAR2,
int_table IN VARCHAR2,
copy_indexes IN PLS_INTEGER := 1,
copy_triggers IN BOOLEAN := TRUE,
copy_constraints IN BOOLEAN := TRUE,
copy_privileges IN BOOLEAN := TRUE,
ignore_errors IN BOOLEAN := FALSE,
num_errors OUT PLS_INTEGER,
copy_statistics IN BOOLEAN := FALSE
copy_mvlog IN BOOLEAN := FALSE);
See demo: below
FINISH_REDEF_TABLE
Registers a dependent object (index, trigger or constraint)
dbms_redefinition.finish_redef_table(
uname IN VARCHAR2,
orig_table IN VARCHAR2,
int_table IN VARCHAR2,
part_name IN VARCHAR2 := NULL);
See demo: below
REGISTER_DEPENDENT_OBJECT
Completes The Redefinition Process
dbms_redefinition.register_dependent_object(
uname IN VARCHAR2, -- schema name
orig_table IN VARCHAR2, -- table to redefine
int_table IN VARCHAR2, -- interim table
dep_type IN PLS_INTEGER, -- type of dependent object
dep_owner IN VARCHAR2, -- owner of dependent object
dep_orig_name IN VARCHAR2, -- name of orig dependent object
dep_int_name IN VARCHAR2); -- name of interim dependent obj.
See demo: below
START_REDEF_TABLE
Starts The Redefinition Process
dbms_redefinition.start_redef_table(
uname IN VARCHAR2, -- schema name
orig_table IN VARCHAR2, -- table to redefine
int_table IN VARCHAR2, -- interim table
col_mapping IN VARCHAR2 := NULL, -- column mapping
options_flag IN BINARY_INTEGER := 1, -- redefinition type
orderby_cols IN VARCHAR2 := NULL, -- col list & ASC/DESC
part_name IN VARCHAR2 := NULL);
See demo: below
SYNC_INTERIM_TABLE
Maintains Synchronization Between The Original And Interim Table
dbms_redefinition.sync_interim_table(
uname IN VARCHAR2, -- schema name
orig_table IN VARCHAR2, -- original table
int_table IN VARCHAR2, -- interim table
part_name IN VARCHAR2 := NULL);
See demo: below
UNREGISTER_DEPENDENT_OBJECT
Unregisters a dependent
object
dbms_redefinition.unregister_dependent_object(
uname IN VARCHAR2,
orig_table IN VARCHAR2,
int_table IN VARCHAR2,
dep_type IN PLS_INTEGER,
dep_owner IN VARCHAR2,
dep_orig_name IN VARCHAR2,
dep_int_name IN VARCHAR2);
GRANT create session TO uwclass;
GRANT create materialized view TO uwclass;
GRANT create table TO uwclass;
GRANT create trigger TO uwclass;
GRANT create view TO uwclass;
GRANT execute ON dbms_redefinition TO uwclass;
GRANT alter any table TO uwclass;
GRANT create any table TO uwclass;
GRANT drop any table TO uwclass;
GRANT lock any table TO uwclass;
GRANT select any table TO uwclass;
Demo Tables
CREATE TABLE dept (
deptno NUMBER(2),
dname VARCHAR2(14),
loc VARCHAR2(13));
ALTER TABLE dept
ADD CONSTRAINT pk_dept
PRIMARY KEY (deptno);
CREATE TABLE emp (
empno NUMBER(15),
ename VARCHAR2(10),
job VARCHAR2(9),
mgr NUMBER(4),
hiredate DATE,
sal NUMBER(7,2),
comm NUMBER(7,2),
deptno NUMBER(2));
ALTER TABLE emp
ADD CONSTRAINT pk_emp
PRIMARY KEY (empno);
/*
If the table is not a candidate for online redefinition, an error
message is raised
*/
exec dbms_redefinition.can_redef_table('UWCLASS','EMP',
dbms_redefinition.cons_use_pk);
-- the insert to show how DML issued while
-- redefinition is in progress is handled
INSERT INTO emp VALUES
(9999,'MORGAN','IT',7839,TO_DATE('01-JAN-2005'),2950,NULL,10);
COMMIT;
SELECT new.salary, old.sal
FROM emp new, int_emp old
WHERE new.empno = old.empno;
SELECT table_name, trigger_name
FROM user_triggers;
SELECT trigger_body from user_triggers
WHERE table_name = 'EMP';
DBMS_REDEFINITION Demo
This demo was provide by:
Kevin Kennedy, Oracle DBA
kevin.kennedy@nsriusa.com
whenever sqlerror exit 1
BEGIN
dbms_redefinition.can_redef_table('GDS',
'BL_STATUS',
dbms_redefinition.cons_use_pk);
END;
/
whenever sqlerror continue
DROP TABLE gds.bl_status_int PURGE;
whenever sqlerror exit 1
CREATE TABLE gds.bl_status_int (
BL_ID NUMBER(12) NOT NULL,
STAT_CODE VARCHAR2(2 BYTE) NOT NULL,
BL_STAT_SEQ_NUM NUMBER(12) NOT NULL,
UPD_DATE DATE NOT NULL,
LST_UPD_DATE DATE DEFAULT SYSDATE NOT NULL,
VERSION_NO NUMBER(12) NOT NULL)
TABLESPACE data01
PARTITION BY RANGE (BL_ID) (
PARTITION P01 VALUES LESS THAN (1750001) TABLESPACE data01,
PARTITION P10 VALUES LESS THAN (2500001) TABLESPACE data02,
PARTITION P11 VALUES LESS THAN (2750001) TABLESPACE data03,
PARTITION P12 VALUES LESS THAN (3000001) TABLESPACE data04,
PARTITION P15 VALUES LESS THAN (3250001) TABLESPACE data05,
PARTITION P16 VALUES LESS THAN (3500001) TABLESPACE data06,
PARTITION P17 VALUES LESS THAN (3750001) TABLESPACE data07,
PARTITION P18 VALUES LESS THAN (4000001) TABLESPACE data08,
PARTITION P19 VALUES LESS THAN (4250001) TABLESPACE data01,
PARTITION P20 VALUES LESS THAN (4500001) TABLESPACE data02,
PARTITION P21 VALUES LESS THAN (4750001) TABLESPACE data03,
PARTITION P22 VALUES LESS THAN (5000001) TABLESPACE data04,
PARTITION P23 VALUES LESS THAN (5250001) TABLESPACE data05,
PARTITION P24 VALUES LESS THAN (5500001) TABLESPACE data06,
PARTITION P25 VALUES LESS THAN (5750001) TABLESPACE data07,
PARTITION PMAX VALUES LESS THAN (MAXVALUE) TABLESPACE data08);
CREATE UNIQUE INDEX gds.xpkbl_status_int
ON gds.bl_status_int(bl_stat_seq_num)
TABLESPACE data09;
ALTER TABLE gds.bl_status_int
ADD CONSTRAINT xpkbl_status_int
PRIMARY KEY (bl_stat_seq_num);
BEGIN
dbms_redefinition.start_redef_table('GDS',
'BL_STATUS',
'BL_STATUS_INT');
END;
/