使用者擁有 DBA 角色,但在儲存程序中執行 EXECUTE IMMEDIATE 'CREATE TABLE ...' 仍報 ORA-01031: insufficient privileges。原因:定義者權限程序預設停用角色,僅啟用直接授予的系統/物件權限。
-- 修改前:定義者權限,角色失效
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 的薄包裝程序。BEQUEATH CURRENT_USER 於 View 實現類似效果。若不想改變權限模型,需逐一授予系統權限:
GRANT CREATE TABLE TO app_user;
GRANT CREATE SEQUENCE TO app_user;
-- ...
但維護成本高,易遺漏。