首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 修改表擁有者實戰:跨 Schema 遷移表的兩種核心方法

     編輯:Oracle 資料庫基礎

場景背景

需將表 TEST.T1 遷移至 TEST1 Schema 下,Oracle 無直接 ALTER TABLE ... OWNER TO ... 指令,需採用間接手段。

方法一:授權 + 同義詞 + 重建 (適用小表/開發環境)

-- 原 Schema 操作
CREATE USER test1 IDENTIFIED BY test1;
GRANT RESOURCE, CONNECT TO test1;
GRANT ALL ON t1 TO test1;

-- 目標 Schema 操作
CONN test1/test1
CREATE TABLE t1 AS SELECT * FROM test.t1;
-- 再補建索引、約束、授權...

缺點:大表耗時、需手動同步索引約束、產生雙倍暫存空間。

方法二:分區交換技術 (零停機、極速、元資料級操作)

核心原理:建立單分區暫存表,利用 ALTER TABLE ... EXCHANGE PARTITION 瞬間交換 Segment 指標,不移動實際資料區塊,秒級完成遷移。

完整操作腳本

-- 1. 目標 Schema 建立分區暫存表
CONN test1/test1
CREATE TABLE temp (id NUMBER, name VARCHAR2(20))
PARTITION BY RANGE (id)
(PARTITION part0 VALUES LESS THAN (-1),
 PARTITION part1 VALUES LESS THAN (MAXVALUE));

-- 2. 建立一個空的非分區表 (結構同源表)
CREATE TABLE t1 (id NUMBER, name VARCHAR2(20));

-- 3. 核心交換指令 (需含 INDEXES 以同步索引)
ALTER TABLE temp EXCHANGE PARTITION part1 WITH TABLE test.t1
INCLUDING INDEXES WITHOUT VALIDATION;

-- 4. 清理暫存表
DROP TABLE temp;

關鍵參數解析

  • INCLUDING INDEXES:同步交換索引 Segment,否則索引失效成為 UNUSABLE。
  • WITHOUT VALIDATION:跳過資料檢查 (分區鍵範圍驗證),極大加速。前提是確信資料符合分區定義。
  • 分區鍵選擇:用無業務意義的數值欄位 (如 id) 並設 MAXVALUE 涵蓋所有資料。

適用條件與限制

  1. 源表與目標表結構完全一致 (欄位、型態、順序)。
  2. 源表不可有外鍵被參照 (需先刪除 FK 再交換)。
  3. 需 ALTER TABLE 權限與 DROP ANY TABLE (或擁有者)。
  4. 跨 Schema 交換需 EXCHANGE PARTITION ... WITH TABLE schema.table 語法 (10g+ 支援)。

生產環境建議流程

  1. 維護窗口鎖定源表 (或閒時操作)。
  2. 建立分區暫存表於目標 Schema。
  3. 執行 EXCHANGE (含 INDEXES, WITHOUT VALIDATION)。
  4. 驗證資料筆數、索引狀態 (USER_INDEXES.STATUS = VALID)。
  5. 重建外鍵、觸發器、同義詞、授權。
  6. 更新應用連線池指向新 Schema。

此法為大表跨 Schema 遷移的黃金標準,廣泛用於 EBS 升級、多租戶架構調整、資料歸檔分層。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved