許多開發者以為 GRANT RESOURCE TO user 即包含建表權限,實際上:
RESOURCE 僅包含 CREATE CLUSTER, CREATE INDEXTYPE, CREATE OPERATOR, CREATE PROCEDURE, CREATE SEQUENCE, CREATE TABLE, CREATE TRIGGER, CREATE TYPE 等 **舊版本** 權限 (Oracle 10g 及之前)。RESOURCE **移除了 CREATE TABLE**、**CREATE VIEW** 等核心物件權限,僅保留 PL/SQL 相關權限。UNLIMITED TABLESPACE 系統權限也不在 RESOURCE 內,需單獨授予。-- 開發/測試環境
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW, CREATE SEQUENCE, CREATE PROCEDURE, CREATE TRIGGER, CREATE TYPE, CREATE SYNONYM, UNLIMITED TABLESPACE TO dev_user;
-- 生產環境 (最小權限原則)
GRANT CREATE SESSION TO app_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON schema.table TO app_user; -- 物件級
-- 若需動態建表 (罕見),再單獨 GRANT CREATE TABLE
CREATE TABLE 系統權限:SELECT * FROM user_sys_privs WHERE privilege = 'CREATE TABLE';SELECT * FROM user_ts_quotas; 若配額為 0 或無預設表空間,建表會報 ORA-01950。CREATE TABLE 在 **定義者權限** 的預存程序/觸發器中**不生效**,需直接授予使用者或使用 AUTHID CURRENT_USER。DBA_SYS_PRIVS、DBA_TAB_PRIVS,回收過度授權。