在 Oracle XE 18c 新建帳號 CREATE USER 出現 "ORA-64096 invalid common user or role name",胡亂爬文設好帳號密碼,卻又 "ORA-01017 invalid username/password;logon denied" 無法登入卡關半小時,最後學會新觀念,CDB 與 PDB。

Oracle 12c 起導入了所謂的 Multitenant Environment 多租用戶環境觀念,允許一個 Container Database (CDB) 承載多個 Pluggable Database (PDB)。當你使用 SYSTEM 登入資料庫 CREATE USER 時,若沒有將容器(Container)切換到 PDB,便會出現「ORA-65096: 無效的通用使用者或角色名稱 / 65096. 00000 - "invalid common user or role name"」

首先我們要找出 PDB 的名稱,使用指令 show pdbs 可得知目前 XE 上有兩個 Container,PDB$SEED (唯讀) 與 XEPDB1 (可讀寫),使用 show con_name 可得知我們目前是在 CDB$ROOT 容器:

新使用者只能建在 PDB 上,故要先 ALTER SESSION SET CONTAINER=XEPDB1 進行切換,接著即可依過去的做法建立使用者:

alter session set container=XEPDB1;
create user ORAL identified by "the_password" default tablespace USERS; 
grant connect,resource,unlimited tablespace to oralab;

建好使用者,使用 SQLPlus 或 SQL Developer 登入時會卡在帳號密碼怎麼都不對!

關鍵在上圖 2 所指的 SID,要連 PDB 時,SID 要改為 PDB 名稱,以 XE 為例為 XEPDB1,修改 SID 為 XEPDB1 後即可成功。同理推到 TNSNAMES.ORA,日常使用的 XE 名稱應指向 SID=XEPDB1,需要進行系統管理建帳號時才連 SID=XE,故我將 TNSNAMES.ORA 做了調整,將 XE 的 SID 設為 XEPDB1,另外設了 XESYS 指向 SID=XE:

XE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = my-xe-host)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XEPDB1)
    )
  )  
XESYS =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = my-xe-host)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )


Comments

Be the first to post a comment

Post a comment