首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Oracle 權限體系澄清:RESOURCE 角色不包含 CREATE TABLE

     編輯:程式設計綜合問答

常見誤解

許多開發者以為 GRANT RESOURCE TO user 即包含建表權限,實際上:

  • RESOURCE 僅包含 CREATE CLUSTER, CREATE INDEXTYPE, CREATE OPERATOR, CREATE PROCEDURE, CREATE SEQUENCE, CREATE TABLE, CREATE TRIGGER, CREATE TYPE 等 **舊版本** 權限 (Oracle 10g 及之前)。
  • **Oracle 11g 起**,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

排查「有權限卻無法建表」

  1. 確認是否具備 CREATE TABLE 系統權限:SELECT * FROM user_sys_privs WHERE privilege = 'CREATE TABLE';
  2. 確認預設表空間與配額:SELECT * FROM user_ts_quotas; 若配額為 0 或無預設表空間,建表會報 ORA-01950。
  3. 檢查是否透過角色獲得權限:CREATE TABLE 在 **定義者權限** 的預存程序/觸發器中**不生效**,需直接授予使用者或使用 AUTHID CURRENT_USER。

最佳實踐

  • **不依賴 RESOURCE/CONNECT 角色**,顯式授予所需系統權限。
  • 建立「權限腳本」納入版本控制,環境一致性部署。
  • 定期審計 DBA_SYS_PRIVS、DBA_TAB_PRIVS,回收過度授權。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved