需求:允許特定用戶查看某些預存程式的原始碼定義,但嚴禁執行、修改、刪除。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權限的用戶理論上可對程序進行遠端除錯(設定中斷點、檢查變數),雖無法修改程式碼,但可觀察執行時狀態。若極度敏感,可考慮:
- 建立唯讀 VIEW 包裝
ALL_SOURCE並授予SELECT權限。- 使用
DBMS_METADATA.GET_DDL透過函數回傳定義,授予該函數EXECUTE權限。
授予物件 DEBUG 權限 是 Oracle 內建、最簡單的「唯讀程序定義」方案。雖略感繞路,卻無需額外物件,符合最小權限原則。若有安全疑慮,可搭配 VIEW 或包裝函數進一步隔離。