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

Oracle 儲存程序中啟用角色權限

     編輯:Oracle 資料庫基礎

問題現象

使用者擁有 DBA 角色,但在儲存程序中執行 EXECUTE IMMEDIATE 'CREATE TABLE ...' 仍報 ORA-01031: insufficient privileges。原因:定義者權限程序預設停用角色,僅啟用直接授予的系統/物件權限。

解決方案:AUTHID CURRENT_USER

-- 修改前:定義者權限,角色失效
CREATE OR REPLACE PROCEDURE p_create_table IS
BEGIN
  EXECUTE IMMEDIATE 'CREATE TABLE test_tbl (id NUMBER)';
END;
/

-- 修改後:呼叫者權限,角色生效
CREATE OR REPLACE PROCEDURE p_create_table
AUTHID CURRENT_USER IS
BEGIN
  EXECUTE IMMEDIATE 'CREATE TABLE test_tbl (id NUMBER)';
END;
/

驗證結果

SQL> EXEC p_create_table;
PL/SQL procedure successfully completed.

原理對比

特性DEFINER RIGHTS (預設)INVOKER RIGHTS (AUTHID CURRENT_USER)
權限檢查編譯時依擁有者權限執行時依呼叫者權限
角色啟用否是
物件解析編譯時靜態解析執行時動態解析
適用場景封裝核心邏輯、保護資料需呼叫者權限的動態操作

注意事項

  • AUTHID CURRENT_USER 會導致程序內未限定 Schema 的物件引用依呼叫者 Schema 解析,需謹慎設計。
  • 若需同時兼顧封裝性與角色權限,可將敏感操作拆分為 AUTHID CURRENT_USER 的薄包裝程序。
  • 12c+ 可搭配 BEQUEATH CURRENT_USER 於 View 實現類似效果。

替代方案:顯式授權

若不想改變權限模型,需逐一授予系統權限:

GRANT CREATE TABLE TO app_user;
GRANT CREATE SEQUENCE TO app_user;
-- ...

但維護成本高,易遺漏。

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