標準語法圖
CREATE USER username IDENTIFIED {BY password | EXTERNALLY | GLOBALLY AS 'DN'}
[DEFAULT TABLESPACE tablespace]
[TEMPORARY TABLESPACE tablespace]
[QUOTA {size [K|M|G|T] | UNLIMITED} ON tablespace [, ...]]
[PROFILE profile_name]
[PASSWORD EXPIRE]
[ACCOUNT {LOCK | UNLOCK}]
[ENABLE EDITIONS]; -- 12c+ Edition-based Redefinition
參數完整對照表
| 子句 | 必要性 | 預設值 | 說明 | 範例 |
username | 必要 | - | 1-30 字元,字母開頭,可含 $ # _,不區分大小寫(除非雙引號) | app_user, "My_User" |
IDENTIFIED BY | 資料庫認證必選 | - | 密碼區分大小寫(11g+),建議雙引號包含特殊字元 | IDENTIFIED BY "P@ssw0rd!" |
IDENTIFIED EXTERNALLY | 外部認證必選 | - | OS/LDAP/Kerberos 驗證,用戶名需符合外部身分 (如 OPS$prefix) | IDENTIFIED EXTERNALLY |
IDENTIFIED GLOBALLY | 全域認證必選 | - | OES/OID 企業目錄,指定 DN 或 GUID | IDENTIFIED GLOBALLY AS 'cn=...' |
DEFAULT TABLESPACE | 建議指定 | DATABASE DEFAULT (通常 USERS) | 物件建立預設表空間,避免使用 SYSTEM/SYSAUX | DEFAULT TABLESPACE app_data |
TEMPORARY TABLESPACE | 建議指定 | DATABASE DEFAULT (通常 TEMP) | 排序、雜湊、臨時表操作空間 | TEMPORARY TABLESPACE temp |
QUOTA | 必要 (非 DBA) | 0 (無配額) | 限制使用者在表空間的空間用量,UNLIMITED 移除限制 | QUOTA 100M ON app_data |
PROFILE | 建議指定 | DEFAULT | 密碼策略、資源限制 (CPU、連線數、邏輯讀) | PROFILE secure_profile |
PASSWORD EXPIRE | 選項 | FALSE | 強制首次登入修改密碼 | PASSWORD EXPIRE |
ACCOUNT LOCK/UNLOCK | 選項 | UNLOCK | 建立時即鎖定,防止未授權存取 | ACCOUNT LOCK |
ENABLE EDITIONS | 12c+ 選項 | FALSE | 啟用 Edition-based Redefinition,支援線上應用升級 | ENABLE EDITIONS |
實戰範例
範例 1:標準應用使用者(生產環境建議)
CREATE USER app_user IDENTIFIED BY "Str0ngP@ssw0rd_2024!"
DEFAULT TABLESPACE app_data
TEMPORARY TABLESPACE temp
QUOTA 500M ON app_data
QUOTA 100M ON app_index
PROFILE secure_profile
ACCOUNT UNLOCK;
-- 授予基本連線與建表權限
GRANT CREATE SESSION, CREATE TABLE, CREATE SEQUENCE, CREATE VIEW, CREATE PROCEDURE TO app_user;
範例 2:唯讀報表使用者
CREATE USER report_user IDENTIFIED BY "R3p0rt_R3ad0nly!"
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
QUOTA 0 ON users -- 無建表空間
PROFILE readonly_profile
ACCOUNT UNLOCK;
GRANT CREATE SESSION TO report_user;
GRANT SELECT ON schema_owner.table1 TO report_user;
GRANT SELECT ON schema_owner.table2 TO report_user;
-- 或授予角色
GRANT report_read_role TO report_user;
範例 3:外部認證 DBA 免密維護帳號
-- Linux: OS 用戶 oracle
CREATE USER ops$oracle IDENTIFIED EXTERNALLY
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp;
GRANT SYSDBA TO ops$oracle; -- 或 SYSOPER
-- Windows: 域用戶 CORP\dbadmin
CREATE USER "CORP\DBADMIN" IDENTIFIED EXTERNALLY;
GRANT SYSDBA TO "CORP\DBADMIN";
範例 4:全域認證企業使用者
CREATE USER "cn=jane_dev,ou=engineering,dc=corp,dc=com"
IDENTIFIED GLOBALLY AS 'cn=jane_dev,ou=engineering,dc=corp,dc=com'
DEFAULT TABLESPACE app_data
TEMPORARY TABLESPACE temp;
-- 權限透過企業角色管理 (OEM/OID),不直接 GRANT
範例 5:批次建立測試使用者(PL/SQL 腳本)
BEGIN
FOR i IN 1..10 LOOP
EXECUTE IMMEDIATE 'CREATE USER test_user' || i || ' IDENTIFIED BY "Test' || i || '_Pass!"
DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp QUOTA 10M ON users';
EXECUTE IMMEDIATE 'GRANT CREATE SESSION TO test_user' || i;
END LOOP;
END;
/
-- 批次清除
BEGIN
FOR i IN 1..10 LOOP
EXECUTE IMMEDIATE 'DROP USER test_user' || i || ' CASCADE';
END LOOP;
END;
/
常見錯誤與解決
| 錯誤 | 原因 | 解決 |
ORA-01920: user name conflicts with another user or role | 名稱衝突 | 更換名稱或刪除衝突物件 |
ORA-01950: no privileges on tablespace 'USERS' | 無 QUOTA | 加上 QUOTA UNLIMITED ON users 或指定大小 |
ORA-00959: tablespace 'XYZ' does not exist | 表空間不存在 | 先建立表空間或指定現有表空間 |
ORA-02379: profile 'X' does not exist | Profile 不存在 | 建立 Profile 或使用 DEFAULT |
ORA-28003: password verification failed | 密碼不符合驗證函數 | 使用符合複雜度的密碼 |
ORA-01031: insufficient privileges | 無 CREATE USER 權限 | 以 SYS/SYSTEM/DBA 執行 |
最佳實務檢核表
- [ ] 使用有意義的命名規範:
app_<模組>_<角色> (如 app_oms_rw)
- [ ] 密碼符合複雜度:長度≥12、大小寫、數字、特殊字元、無字典詞
- [ ] 明確指定
DEFAULT TABLESPACE、TEMPORARY TABLESPACE,避免用 SYSTEM
- [ ] 設定合理
QUOTA,防止單一使用者佔滿表空間
- [ ] 指派適當
PROFILE,套用密碼與資源策略
- [ ] 建立時
ACCOUNT LOCK,授權完成後再 UNLOCK
- [ ] 避免直接 GRANT 系統權限,改用角色
- [ ] 文件化:用途、擁有者、聯絡人、審核日期
- [ ] 12c+ 考慮
ENABLE EDITIONS 支援熱部署
查詢使用者定義資訊
-- 完整建立 DDL
SELECT DBMS_METADATA.GET_DDL('USER', 'APP_USER') FROM DUAL;
-- 關鍵屬性
SELECT username, default_tablespace, temporary_tablespace, profile,
account_status, lock_date, expiry_date, created
FROM dba_users WHERE username = 'APP_USER';
-- 配額
SELECT * FROM dba_ts_quotas WHERE username = 'APP_USER';
-- 角色與權限
SELECT * FROM dba_role_privs WHERE grantee = 'APP_USER';
SELECT * FROM dba_sys_privs WHERE grantee = 'APP_USER';
SELECT * FROM dba_tab_privs WHERE grantee = 'APP_USER';
12c/18c/19c 新增特性
NO AUTHENTICATION:無認證使用者(僅供 Proxy 連線)
PASSWORD ROLLOVER TIME:密碼平滑輪換期(19c+)
INACTIVE_ACCOUNT_TIME:閒置自動鎖定(Profile 參數,19c+)
- PDB 本地使用者 vs 共用使用者 (
C## 前綴)