在 Oracle PL/SQL 程序中使用 EXECUTE IMMEDIATE 執行動態 DDL(如 CREATE TABLE)時,常遇到 ORA-01031: insufficient privileges 錯誤。根本原因在於:預存物件(Procedure、Function、Package、Trigger、View)執行時僅啟用 PUBLIC 角色,不繼承使用者透過角色獲得的權限。
「若權僅透過角色授予,則預期行為為拒絕存取。預存物件在物件擁有者的安全域中執行,除 PUBLIC 外不啟用任何角色。」
chris 並授予 DBA 角色(含 CREATE TABLE 權限)chris 執行 CREATE TABLE → 成功chris_cr_tbl 內含 EXECUTE IMMEDIATE 'CREATE TABLE ...'chris 顯式授權 GRANT CREATE TABLE TO chrisAUTHID CURRENT_USER 定義權限模型(需謹慎評估安全性)此行為為 Oracle 設計機制,非 Bug,開發階段務必驗證動態 SQL 權限路徑。