10g線上重定義新特性——關聯物件自動重新命名(一)
9i的線上重定義存在一個問題,執行完線上重定義後,表的名稱雖然保持不變,但是索引、約束、觸發器等關聯物件的名稱會發生變化,有時候這會帶來一定的問題,而要在事後手工修改,會比較麻煩。
10g的線上重定義解決這個問題。如果物件是利用COPY_TABLE_DEPENDENTS建立的,那麼這些關聯的物件在重定義操作完成後,自動改為原始的名稱。如果是手工建立的關聯物件,則可以利用REGISTER_DEPENDENT_OBJECT過程,所有執行了REGISTER_DEPENDENT_OBJECT過程的關聯物件,都會在重定義操作完成後自動重新命名。
這篇文章來看COPY_TABLE_DEPENDENTS的例子。
首先看看9i下的例子:
SQL> SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
PL/SQL Release 9.2.0.4.0 - Production
CORE 9.2.0.3.0 Production
TNS for 32-bit Windows: Version 9.2.0.4.0 - Production
NLSRTL Version 9.2.0.4.0 - Production
SQL> CREATE TABLE T AS SELECT ROWNUM ID, A.* FROM USER_OBJECTS A;
表已建立。
SQL> ALTER TABLE T ADD CONSTRAINT PK_T PRIMARY KEY (ID);
表已更改。
SQL> ALTER TABLE T ADD CHECK (ID > 0);
表已更改。
SQL> CREATE INDEX IND_T_NAME ON T (OBJECT_NAME);
索引已建立。
SQL> CREATE OR REPLACE TRIGGER TRI_T
2 BEFORE INSERT ON T
3 FOR EACH ROW
4 BEGIN
5 NULL;
6 END;
7 /
觸發器已建立
SQL> CREATE TABLE T_INTER
2 PARTITION BY HASH (ID)
3 PARTITIONS 4
4 AS SELECT ROWNUM ID, A.*
5 FROM USER_OBJECTS A
6 WHERE 1 = 2;
表已建立。
SQL> ALTER TABLE T_INTER ADD CONSTRAINT PK_T_INTER PRIMARY KEY (ID);
表已更改。
SQL> ALTER TABLE T_INTER ADD CHECK (ID > 0) DISABLE;
表已更改。
SQL> CREATE INDEX IND_T_INTER_NAME ON T_INTER (OBJECT_NAME);
索引已建立。
SQL> CREATE OR REPLACE TRIGGER TRI_T_INTER
2 BEFORE INSERT ON T_INTER
3 FOR EACH ROW
4 BEGIN
5 NULL;
6 END;
7 /
觸發器已建立
SQL> SET SERVEROUT ON SIZE 1000000
SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T')
PL/SQL 過程已成功完成。
SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'T', 'T_INTER')
PL/SQL 過程已成功完成。
SQL> SELECT TABLE_NAME, INDEX_NAME
2 FROM USER_INDEXES
3 WHERE TABLE_NAME IN ('T', 'T_INTER');
TABLE_NAME INDEX_NAME
------------------------------ ------------------------------
T_INTER IND_T_INTER_NAME
T IND_T_NAME
T PK_T
T_INTER PK_T_INTER
SQL> SELECT TABLE_NAME, CONSTRAINT_NAME
2 FROM USER_CONSTRAINTS
3 WHERE TABLE_NAME IN ('T', 'T_INTER');
TABLE_NAME CONSTRAINT_NAME
------------------------------ ------------------------------
T PK_T
T SYS_C002990
T_INTER PK_T_INTER
T_INTER SYS_C002992
SQL> SELECT TABLE_NAME, TRIGGER_NAME
2 FROM USER_TRIGGERS
3 WHERE TABLE_NAME IN ('T', 'T_INTER');
TABLE_NAME TRIGGER_NAME
------------------------------ ------------------------------
T TRI_T
T_INTER TRI_T_INTER
SQL> EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE(USER, 'T', 'T_INTER')
PL/SQL 過程已成功完成。
SQL> SELECT TABLE_NAME, INDEX_NAME
2 FROM USER_INDEXES
3 WHERE TABLE_NAME IN ('T', 'T_INTER');
TABLE_NAME INDEX_NAME
------------------------------ ------------------------------
T IND_T_INTER_NAME
T_INTER IND_T_NAME
T_INTER PK_T
T PK_T_INTER
SQL> SELECT TABLE_NAME, CONSTRAINT_NAME
2 FROM USER_CONSTRAINTS
3 WHERE TABLE_NAME IN ('T', 'T_INTER');
TABLE_NAME CONSTRAINT_NAME
------------------------------ ------------------------------
T PK_T_INTER
T SYS_C002992
T_INTER PK_T
T_INTER SYS_C002990
SQL> SELECT TABLE_NAME, TRIGGER_NAME
2 FROM USER_TRIGGERS
3 WHERE TABLE_NAME IN ('T', 'T_INTER');
TABLE_NAME TRIGGER_NAME
------------------------------ ------------------------------
T_INTER TRI_T
T TRI_T_INTER
SQL> DROP TABLE T_INTER;
表已刪除。
可以看到,執行完重定義操作後,所有的關聯物件的名稱都與原來不一樣了。
再看看10g使用COPY_TABLE_DEPENDENTS的例子,執行完線上重定義,新生成的表對應的這些物件的名稱是否能與原表一致:
SQL> SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
SQL> CREATE TABLE T AS SELECT ROWNUM ID, A.* FROM USER_OBJECTS A;
表已建立。
SQL> ALTER TABLE T ADD CONSTRAINT PK_T PRIMARY KEY (ID);
表已更改。
SQL> ALTER TABLE T ADD CHECK (ID > 0);
表已更改。
SQL> CREATE INDEX IND_T_NAME ON T (OBJECT_NAME);
索引已建立。
SQL> CREATE OR REPLACE TRIGGER TRI_T
2 BEFORE INSERT ON T
3 FOR EACH ROW
4 BEGIN
5 NULL;
6 END;
7 /
觸發器已建立
SQL> CREATE TABLE T_INTER
2 PARTITION BY HASH (ID)
3 PARTITIONS 4
4 AS SELECT ROWNUM ID, A.*
5 FROM USER_OBJECTS A
6 WHERE 1 = 2;
表已建立。
SQL> SET SERVEROUT ON SIZE 1000000
SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T')
PL/SQL 過程已成功完成。
SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'T', 'T_INTER')
PL/SQL 過程已成功完成。
SQL> VAR V_NUM NUMBER
SQL> BEGIN
2 DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(USER, 'T', 'T_INTER',
3 DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, :V_NUM, TRUE);
4 END;
5 /
PL/SQL 過程已成功完成。
SQL> PRINT V_NUM
V_NUM
----------
0
SQL> SELECT TABLE_NAME, INDEX_NAME
2 FROM USER_INDEXES
3 WHERE TABLE_NAME IN ('T', 'T_INTER');
TABLE_NAME INDEX_NAME
------------------------------ ------------------------------
T_INTER TMP$$_PK_T0
T_INTER TMP$$_IND_T_NAME0
T PK_T
T IND_T_NAME
SQL> SELECT TABLE_NAME, CONSTRAINT_NAME
2 FROM USER_CONSTRAINTS
3 WHERE TABLE_NAME IN ('T', 'T_INTER');
TABLE_NAME CONSTRAINT_NAME
------------------------------ ------------------------------
T PK_T
T SYS_C0011881
T_INTER TMP$$_SYS_C00118810
T_INTER TMP$$_PK_T0
SQL> SELECT TABLE_NAME, TRIGGER_NAME
2 FROM USER_TRIGGERS
3 WHERE TABLE_NAME IN ('T', 'T_INTER');
TABLE_NAME TRIGGER_NAME
------------------------------ ------------------------------
T TRI_T
T_INTER TMP$$_TRI_T0
SQL> EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE(USER, 'T', 'T_INTER')
PL/SQL 過程已成功完成。
線上重定義操作已經完成,再次檢查表上的索引、約束和觸發器的名稱:
SQL> SELECT TABLE_NAME, INDEX_NAME
2 FROM USER_INDEXES
3 WHERE TABLE_NAME IN ('T', 'T_INTER');
TABLE_NAME INDEX_NAME
------------------------------ -------------------------
T PK_T
T IND_T_NAME
T_INTER TMP$$_PK_T0
T_INTER TMP$$_IND_T_NAME0
SQL> SELECT TABLE_NAME, CONSTRAINT_NAME
2 FROM USER_CONSTRAINTS
3 WHERE TABLE_NAME IN ('T', 'T_INTER');
TABLE_NAME CONSTRAINT_NAME
------------------------------ -------------------------
T SYS_C0011881
T PK_T
T_INTER TMP$$_PK_T0
T_INTER TMP$$_SYS_C00118810
SQL> SELECT TABLE_NAME, TRIGGER_NAME
2 FROM USER_TRIGGERS
3 WHERE TABLE_NAME IN ('T', 'T_INTER');
TABLE_NAME TRIGGER_NAME
------------------------------ -------------------------
T_INTER TMP$$_TRI_T0
T TRI_T
SQL> SELECT TABLE_NAME, PARTITION_NAME
2 FROM USER_TAB_PARTITIONS
3 WHERE TABLE_NAME = 'T';
TABLE_NAME PARTITION_NAME
------------------------------ -----------------
T SYS_P161
T SYS_P162
T SYS_P163
T SYS_P164
SQL> DROP TABLE T_INTER PURGE;
表已刪除。
可以看到,利用COPY_TABLE_DEPENDENTS過程不但方面,而且執行完重定義操作後,所有的關聯物件名稱都不會發生變化,這確實是10g上一個很方便的改進。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-607585/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 10g線上重定義新特性——關聯物件自動重新命名(二)物件
- 10g線上重定義新特性——對單獨的分割槽進行線上重定義
- Online Redefinition線上重定義(三)--多表關聯重定義案例
- 9i新特性之——線上表格重定義研究在(轉)
- 10g新特性——表空間重新命名
- Oracle表的線上重定義(一)Oracle
- oracle 線上重定義Oracle
- Oracle線上重定義Oracle
- 10G新特性筆記之自動管理筆記
- Online Redefinition線上重定義(一)
- oracle 表線上重定義Oracle
- oracle表線上重定義Oracle
- 【Oracle】線上重定義表Oracle
- oracle 12c 新特性之一:線上重新命名資料檔案Oracle
- Oracle的線上重定義(轉)Oracle
- 10g 新特性 Recyclebin 空間的自動清理(zt)
- Oracle12C新特性-線上重新命名遷移資料檔案(一)Oracle
- DBMS_REDEFINITION(線上重定義一個重要bug)
- oracle線上重定義表步驟Oracle
- dbms_redefinition線上重定義表
- 物化檢視prebuilt和線上重定義UI
- Oracle線上重定義之DBMS_REDEFINITIONOracle
- Oracle中重建表的線上重定義Oracle
- 資料庫表的線上重定義資料庫
- 利用DBMS_REDEFINITION線上重定義表
- 線上重定義表ORACLE 11GOracle
- 【redefinition】線上重定義概覽與使用
- 10G新特性系列:禁止在AWR後自動執行ADDM
- 10g 新特性
- Oracle 12.2使用手動建立與註冊依賴物件來執行聯機重定義Oracle物件
- Oracle Online Redefinition線上重定義(上)Oracle
- Oracle Online Redefinition線上重定義(中)Oracle
- Oracle Online Redefinition線上重定義(下)Oracle
- 【TABLE】oracle表線上重定義注意事項Oracle
- oracle實驗記錄 (線上重定義表)Oracle
- Oracle使用聯機重定義來給表增加新列與分割槽Oracle
- 在oracle 9i下線上重定義表Oracle
- 普通錶轉換分割槽表-線上重定義