Oracle 12c 引入多租戶架構:容器資料庫 (CDB) 可掛載多個可插拔資料庫 (PDB)。實例與資料庫由 1:1 變為 1:N。此架構改變了使用者建立、權限管理、表空間分配的規則。本文釐清常見困惑:C## 前綴、Common User vs Local User、表空間跨容器可見性。
C## 或 c## 開頭 (參數 COMMON_USER_PREFIX 控制,預設 C##)。可跨所有容器存取。C## 前綴。僅存在於該 PDB。C## 前綴,在 Root 建立,元資料鏡像至所有 PDB (Metadata Link) 或資料共享 (Data Link/Extended Data Link)。在 CDB$ROOT 建立 Common User 指定預設表空間時,該表空間必須存在於 CDB$ROOT 且同名表空間必須存在於所有目標 PDB 中 (或至少種子庫 PDB$SEED 中),否則報錯 ORA-65048 / ORA-00959。
原因:Common User 的預設表空間在每個容器中都必須可用。建立 Common User 時,Oracle 會嘗試在所有 PDB 中同步建立該使用者的元資料連結,並驗證表空間存在性。
CREATE USER c##admin IDENTIFIED BY admin DEFAULT TABLESPACE users; GRANT DBA TO c##admin; -- 成功。表空間 USERS 存在於 CDB$ROOT。
-- 在 CDB$ROOT CREATE TABLESPACE test DATAFILE '/u01/test.dbf' SIZE 100M; CREATE USER c##test IDENTIFIED BY test DEFAULT TABLESPACE test; -- 錯誤:ORA-65048: common user c##test cannot be created because tablespace test does not exist in PDBORCL.
-- 切換至 PDB ALTER SESSION SET CONTAINER = PDBORCL; CREATE TABLESPACE test DATAFILE '/u01/pdb_test.dbf' SIZE 100M; -- 切回 CDB$ROOT ALTER SESSION SET CONTAINER = CDB$ROOT; CREATE USER c##test IDENTIFIED BY test DEFAULT TABLESPACE test; -- 成功。CDB$ROOT 與 PDBORCL 均有 TEST 表空間 (雖然檔案路徑、大小可不同)。