在 Oracle 資料庫管理中,建立使用者並正確配置表空間是基礎且關鍵的操作。若未指定預設表空間,使用者將預設使用 SYSTEM 表空間,這會嚴重影響系統效能與穩定性。本文詳細說明建立使用者、授權、表空間管理的完整語法與實務範例。
建立使用者前,必須確認資料庫中已存在所需的永久表空間與暫存表空間(如 USERS、TEMPTS01)。若不存在,請先以 CREATE TABLESPACE 指令建立。
CREATE USER app_user IDENTIFIED BY password123
PROFILE DEFAULT
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMPTS01
ACCOUNT UNLOCK;
| 操作 | 語法範例 |
|---|---|
| 建立 | CREATE USER username IDENTIFIED BY password [DEFAULT TABLESPACE ts] [TEMPORARY TABLESPACE temp_ts] [ACCOUNT LOCK|UNLOCK]; |
| 修改密碼 | ALTER USER username IDENTIFIED BY new_password; |
| 修改預設表空間 | ALTER USER username DEFAULT TABLESPACE new_ts; |
| 刪除使用者 | DROP USER username [CASCADE]; |
常用系統權限包括:
CREATE SESSION:連線資料庫的基本權限,所有使用者皆需具備。CREATE TABLE、CREATE VIEW、CREATE PROCEDURE、CREATE SEQUENCE、CREATE SYNONYM 等物件建立權限。UNLIMITED TABLESPACE:允許在任意表空間無限量使用空間。SYSDBA、SYSOPER、ALTER SYSTEM、ALTER DATABASE 等。授權語法: GRANT privilege TO username [WITH ADMIN OPTION];
回收語法: REVOKE privilege FROM username;
針對特定資料庫物件(表、視圖、序列等)授予操作權限。
語法: GRANT object_priv ON object_name TO username [WITH GRANT OPTION] [WITH HIERARCHY OPTION];
例如:GRANT SELECT, INSERT ON scott.emp TO app_user;
CREATE TABLESPACE data01
DATAFILE '/oracle/oradata/db/DATA01.dbf' SIZE 500M
AUTOEXTEND ON NEXT 100M MAXSIZE 2G
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K;
AUTOEXTEND:啟用自動擴展,避免空間不足報錯。UNIFORM SIZE:指定區塊大小,提升分配效能。| 操作 | 指令 |
|---|---|
| 離線 | ALTER TABLESPACE ts_name OFFLINE [NORMAL|TEMPORARY|IMMEDIATE|FOR RECOVER]; |
| 上線 | ALTER TABLESPACE ts_name ONLINE; |
| 唯讀 | ALTER TABLESPACE ts_name READ ONLY; |
| 讀寫 | ALTER TABLESPACE ts_name READ WRITE; |
ALTER TABLESPACE ts_name ADD DATAFILE '/path/file.dbf' SIZE 1G;ALTER DATABASE DATAFILE '/path/file.dbf' RESIZE 5G;ALTER DATABASE DATAFILE '/path/file.dbf' AUTOEXTEND ON NEXT 100M MAXSIZE 10G;DROP TABLESPACE ts_name INCLUDING CONTENTS AND DATAFILES;
注意: 此操作會同時刪除表空間內所有物件與作業系統層級的資料檔,請謹慎執行。
CREATE UNDO TABLESPACE undotbs02
DATAFILE '/oracle/oradata/db/UNDOTBS02.dbf' SIZE 500M;
ALTER SYSTEM SET undo_tablespace = undotbs02;
同一時間僅能有一個 UNDO 表空間處於啟用狀態,切換需使用 ALTER SYSTEM SET。
CREATE TEMPORARY TABLESPACE temp_data
TEMPFILE '/oracle/oradata/db/TEMP_DATA.dbf' SIZE 500M
AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED;
SELECT
a.tablespace_name,
ROUND(a.bytes/1024/1024,2) AS total_mb,
ROUND(b.bytes/1024/1024,2) AS used_mb,
ROUND(c.bytes/1024/1024,2) AS free_mb,
ROUND(b.bytes*100/a.bytes,2) AS pct_used,
ROUND(c.bytes*100/a.bytes,2) AS pct_free
FROM
(SELECT tablespace_name, SUM(bytes) bytes FROM dba_data_files GROUP BY tablespace_name) a,
(SELECT tablespace_name, SUM(bytes) bytes FROM dba_segments GROUP BY tablespace_name) b,
(SELECT tablespace_name, SUM(bytes) bytes FROM dba_free_space GROUP BY tablespace_name) c
WHERE a.tablespace_name = b.tablespace_name
AND a.tablespace_name = c.tablespace_name
ORDER BY pct_used DESC;
本文整理自實務操作手冊,適用於 Oracle 10g 至 19c 版本。實際部署請依據企業規範與版本特性調整參數。