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

Oracle CREATE USER 完整語法指南:參數詳解、範例與最佳實務

     編輯:Oracle 資料庫基礎

標準語法圖

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 或 GUIDIDENTIFIED GLOBALLY AS 'cn=...'
DEFAULT TABLESPACE建議指定DATABASE DEFAULT (通常 USERS)物件建立預設表空間,避免使用 SYSTEM/SYSAUXDEFAULT 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 EDITIONS12c+ 選項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 existProfile 不存在建立 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## 前綴)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved