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

Oracle 精確授權:僅授予查看存儲過程定義權限,禁止執行與修改

     編輯:Oracle 教學

權限模型釐清

  • 系統權限:執行特定資料庫動作(CREATE PROCEDURE, ALTER ANY PROCEDURE 等)
  • 物件權限:操作特定物件(EXECUTE, DEBUG 等)

查看定義屬於**物件權限**範疇。

存儲過程物件權限實測

環境準備

-- ESCMUSER 建立測試程序
CREATE OR REPLACE PROCEDURE ESCMUSER.PROC_TEST AS
BEGIN DBMS_OUTPUT.PUT_LINE('It is only test'); END;

-- SYSTEM 建立測試用戶
CREATE USER temp IDENTIFIED BY temp;
GRANT CONNECT, RESOURCE TO temp;

授予所有物件權限後查詢

GRANT ALL ON PROC_TEST TO temp;

SELECT * FROM USER_TAB_PRIVS_MADE WHERE GRANTEE = 'TEMP';

結果顯示存儲過程**僅有兩種物件權限**:

  • EXECUTE:執行權限
  • DEBUG:除錯權限

關鍵發現:DEBUG 權限 = 僅查看定義

  1. 回收所有權限:REVOKE ALL ON PROC_TEST FROM temp;
  2. 僅授予 DEBUG:GRANT DEBUG ON PROC_TEST TO temp;
  3. 嘗試執行 → 報錯 PLS-00904: insufficient privilege to access object
  4. 嘗試修改 → 報錯 ORA-01031: insufficient privileges
  5. 但可透過 ALL_SOURCE 查看定義:
    SELECT * FROM ALL_SOURCE WHERE NAME = 'PROC_TEST';

結論與操作指南

**僅授予 DEBUG 物件權限**即可實現「可查看定義、不可執行、不可修改」的精確控制。

操作步驟

-- 1. 回收現有權限
REVOKE ALL ON schema.proc_name FROM target_user;

-- 2. 僅授予 DEBUG
GRANT DEBUG ON schema.proc_name TO target_user;

補充說明

  • 此機制利用 DEBUG 權限允許讀取原始碼但不允許執行的特性
  • 較為「側門」用法,正式環境建議配合程式碼審查流程管理
  • 若需完全隔離,可建立專用只讀帳號並授予 SELECT_CATALOG_ROLE 查詢 DBA_SOURCE
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved