Oracle 資料庫啟動後至少擁有 SYS、SYSTEM、INTERNAL 三大核心帳號。本文說明其權限差異,並示範如何利用 Partition Exchange 在不匯出匯入的前提下,將表從一個 Schema 移動到另一個 Schema(實現修改 Table Owner)。
| 用戶 | 角色 | 權限 | 用途 |
|---|---|---|---|
| SYS | DBA | 最高,擁有 SYSDBA | 資料庫建立、啟動/關閉、核心維護 |
| SYSTEM | DBA | 次高,無 SYSDBA | 日常管理、建立使用者、監控 |
| INTERNAL | SYS 別名 | 等同 SYS | 舊版相容,連線字串 internal/oracle |
Oracle 無直指 ALTER TABLE ... OWNER TO ...,傳統做法是 EXP/IMP 或 CTAS,但大表耗時久、需鎖表。Partition Exchange 可在**秒級、無資料移動**下完成 Owner 變更(需 Enterprise Edition + Partitioning Option)。
-- 1. 建立目標使用者
CREATE USER test1 IDENTIFIED BY test1;
GRANT RESOURCE, CONNECT TO test1;
-- 2. 來源使用者建表並塞資料
CONN test/test
CREATE TABLE t1 (id NUMBER, name VARCHAR2(20));
INSERT INTO t1 VALUES (1, 'xx');
COMMIT;
GRANT ALL ON t1 TO test1;
-- 3. 目標使用者建立分區表(單一分區涵蓋所有值)
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)
);
-- 4. Exchange Partition:將 test.t1 瞬間變成 temp 的 part1
ALTER TABLE temp EXCHANGE PARTITION part1 WITH TABLE test.t1
INCLUDING INDEXES WITHOUT VALIDATION;
-- 5. 清理:drop temp 表,test1 即擁有原 t1 資料與結構
-- 原 test.t1 變成空表(part0),可 drop
DROP TABLE temp;
PARTITION BY RANGE 建立兩個分區,part0 為空殼,part1 承接實際資料。INCLUDING INDEXES 同步交換索引,WITHOUT VALIDATION 跳過資料檢查(需確保資料符合分區範圍)。WITHOUT VALIDATION 會導致查詢錯誤。| 方法 | 速度 | 鎖表時間 | 適用版本 | 備註 |
|---|---|---|---|---|
| Partition Exchange | 秒級 | 極短 | EE + Partitioning | 首選大表 |
| CTAS + RENAME | 依資料量 | 全程 | 所有版本 | 需重建索引/權限 |
| EXPDP/IMPDP REMAP_SCHEMA | 依資料量 | 匯入期間 | 10g+ | 跨資料庫/備份同步 |
| DBMS_REDEFINITION | 依資料量 | 短(線上) | 9i+ | 線上重組,可同步修改結構 |
掌握 Partition Exchange 技巧,即可在維護窗口極短的生產環境中,安全、快速地完成 Table Owner 變更。