表空間、用戶、權限是 Oracle 資料庫對象管理的「鐵三角」。規範的創建腳本、合理的存儲參數、最小權限原則,能避免 80% 的空間管理與權限審計問題。本文提供生產就緒的標準化腳本、參數解析與權限模型建議。
-- 大表空間: 自動擴展、本地管理、自動段空間管理 (ASSM)
CREATE BIGFILE TABLESPACE ts_data_large
DATAFILE '/u01/oradata/ORCL/ts_data_large_01.dbf' SIZE 10G
AUTOEXTEND ON NEXT 2G MAXSIZE 100G
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
SEGMENT SPACE MANAGEMENT AUTO
FLASHBACK ON;
-- 標準表空間: 多數據文件分散 I/O
CREATE TABLESPACE ts_data_std
DATAFILE
'/u01/oradata/ORCL/ts_data_std_01.dbf' SIZE 5G,
'/u02/oradata/ORCL/ts_data_std_02.dbf' SIZE 5G
AUTOEXTEND ON NEXT 1G MAXSIZE 20G
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M
SEGMENT SPACE MANAGEMENT AUTO;
-- 索引專用表空間 (建議獨立存儲設備)
CREATE TABLESPACE ts_idx
DATAFILE '/u03/oradata/ORCL/ts_idx_01.dbf' SIZE 3G
AUTOEXTEND ON NEXT 512M MAXSIZE 10G
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 512K
SEGMENT SPACE MANAGEMENT AUTO;
CREATE TEMPORARY TABLESPACE temp_std
TEMPFILE '/u01/oradata/ORCL/temp_std_01.dbf' SIZE 2G
AUTOEXTEND ON NEXT 512M MAXSIZE 10G
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
CREATE UNDO TABLESPACE undotbs1
DATAFILE '/u01/oradata/ORCL/undotbs1_01.dbf' SIZE 5G
AUTOEXTEND ON NEXT 1G MAXSIZE 20G
RETENTION GUARANTEE; -- 核心業務庫建議開啟
-- 標準業務用戶
CREATE USER app_user IDENTIFIED BY "ComplexP@ssw0rd!"
DEFAULT TABLESPACE ts_data_std
TEMPORARY TABLESPACE temp_std
QUOTA UNLIMITED ON ts_data_std
QUOTA UNLIMITED ON ts_idx
QUOTA 100M ON temp_std
PROFILE app_profile -- 密碼策略、資源限制
ACCOUNT UNLOCK;
-- 唯讀報表用戶
CREATE USER rpt_user IDENTIFIED BY "ReadOnly#2024"
DEFAULT TABLESPACE ts_data_std
TEMPORARY TABLESPACE temp_std
QUOTA 0 ON ts_data_std -- 無寫入配額
QUOTA 0 ON ts_idx
PROFILE read_only_profile
ACCOUNT UNLOCK;
-- DBA 維護角色 (僅授予運維賬號)
GRANT DBA TO dba_user;
-- 應用開發角色 (開發/測試環境)
GRANT CONNECT, RESOURCE, CREATE VIEW, CREATE SYNONYM, CREATE SEQUENCE TO dev_role;
-- 生產應用運行角色 (最小權限)
CREATE ROLE app_runtime_role;
GRANT CREATE SESSION TO app_runtime_role;
-- 對象權限通過對象授予,不授予系統級 CREATE TABLE 等
-- 方案 A: 通過存儲過程/包封裝業務邏輯,僅授予 EXECUTE (最高安全)
GRANT EXECUTE ON pkg_order_mgmt TO app_runtime_role;
-- 方案 B: 直接表權限 (需審計合規)
GRANT SELECT, INSERT, UPDATE, DELETE ON orders TO app_runtime_role;
GRANT SELECT ON customers TO app_runtime_role;
GRANT SELECT, INSERT ON order_items TO app_runtime_role;
-- 只讀角色
GRANT SELECT ON orders TO read_only_role;
GRANT SELECT ON customers TO read_only_role;
| 過度授權 | 風險 | 正確做法 |
|---|---|---|
| GRANT RESOURCE TO app_user | 包含 UNLIMITED TABLESPACE、CREATE TABLE 等,繞過配額控制 | 顯式授予 CREATE SESSION + 對象權限 + 配額 |
| GRANT DBA TO developer | 擁有所有系統權限,可刪除數據文件、關庫 | 開發環境用自定義 dev_role,生產嚴禁 |
| GRANT ALL ON table TO user | 包含 DROP、ALTER、INDEX、REFERENCES 等危險權限 | 按需授予 SELECT/INSERT/UPDATE/DELETE |
| QUOTA UNLIMITED ON SYSTEM | 業務對象誤建在 SYSTEM 表空間,導致字典擴容風險 | 業務用戶 QUOTA 0 ON SYSTEM |
-- 1. 確認用戶屬性
SELECT username, default_tablespace, temporary_tablespace, profile, account_status
FROM dba_users WHERE username = 'APP_USER';
-- 2. 確認配額
SELECT tablespace_name, max_bytes/1024/1024 MAX_MB
FROM dba_ts_quotas WHERE username = 'APP_USER';
-- 3. 確認系統權限
SELECT * FROM dba_sys_privs WHERE grantee = 'APP_USER';
-- 4. 確認角色權限
SELECT granted_role, admin_option, default_role
FROM dba_role_privs WHERE grantee = 'APP_USER';
-- 5. 確認對象權限
SELECT owner, table_name, privilege, grantor, grantable
FROM dba_tab_privs WHERE grantee = 'APP_USER';
DBA_TAB_PRIVS、DBA_SYS_PRIVS、DBA_ROLE_PRIVS將本文腳本納入資料庫建庫標準化交付清單,配合自動化巡檢腳本,即可構建合規、安全、可維護的資料庫權限體系。