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

Oracle 權限精細控管:僅授予「檢視預存程序定義」而禁止執行與修改

     編輯:Oracle 教學

Oracle 權限精細控管:僅授予「檢視預存程序定義」而禁止執行與修改

需求:允許特定用戶查看某些預存程式的原始碼定義,但嚴禁執行、修改、刪除。Oracle 物件權限僅有 EXECUTE 與 DEBUG 兩種,看似無解,實則可善用 DEBUG 權限達到「唯讀原始碼」目的。

權限架構釐清

權限類別範例適用層級
系統權限CREATE PROCEDURE, EXECUTE ANY PROCEDURE用戶/角色
物件權限EXECUTE, DEBUG ON procedure_name具體物件

查詢 SYSTEM_PRIVILEGE_MAP 可見系統權限含:CREATE PROCEDURE、CREATE ANY PROCEDURE、ALTER ANY PROCEDURE、DROP ANY PROCEDURE、EXECUTE ANY PROCEDURE、DEBUG ANY PROCEDURE。但物件層級僅有 EXECUTE、DEBUG。

實測驗證流程

-- 1. 建立測試程序與用戶
CREATE OR REPLACE PROCEDURE escmuser.proc_test AS
BEGIN DBMS_OUTPUT.PUT_LINE('It is only test'); END;
/
CREATE USER temp IDENTIFIED BY temp;
GRANT CONNECT, RESOURCE TO temp;

-- 2. 授予 ALL 權限觀察物件權限
GRANT ALL ON proc_test TO temp;
SELECT * FROM user_tab_privs_made WHERE grantee = 'TEMP';
/* 結果:
GRANTEE  TABLE_NAME  GRANTOR   PRIVILEGE
TEMP     PROC_TEST   ESCMUSER  DEBUG
TEMP     PROC_TEST   ESCMUSER  EXECUTE
*/

-- 3. 回收權限,僅授予 DEBUG
REVOKE ALL ON proc_test FROM temp;
GRANT DEBUG ON proc_test TO temp;

-- 4. 驗證效果
-- temp 執行 -> ORA-06550: insufficient privilege
-- temp 修改 -> ORA-01031: insufficient privileges
-- temp 查詢 ALL_SOURCE -> 成功看到原始碼
SELECT * FROM all_source WHERE name = 'PROC_TEST';

核心原理

  • DEBUG 權限允許使用者讀取 ALL_SOURCE、USER_SOURCE 等原始碼視圖,並可在 PL/SQL Developer 等工具中檢視定義。
  • 缺少 EXECUTE 權限時,EXEC proc_test 會報 PLS-00904: insufficient privilege。
  • 缺少 ALTER ANY PROCEDURE 系統權限與物件 DEBUG 不包含修改權限,故無法 CREATE OR REPLACE。

注意事項與替代方案

副作用: 擁有 DEBUG 權限的用戶理論上可對程序進行遠端除錯(設定中斷點、檢查變數),雖無法修改程式碼,但可觀察執行時狀態。若極度敏感,可考慮:

  1. 建立唯讀 VIEW 包裝 ALL_SOURCE 並授予 SELECT 權限。
  2. 使用 DBMS_METADATA.GET_DDL 透過函數回傳定義,授予該函數 EXECUTE 權限。

總結

授予物件 DEBUG 權限 是 Oracle 內建、最簡單的「唯讀程序定義」方案。雖略感繞路,卻無需額外物件,符合最小權限原則。若有安全疑慮,可搭配 VIEW 或包裝函數進一步隔離。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved