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

Oracle 動態 DDL 執行權限陷阱:為何角色授權失效與顯式授權解法

     編輯:關於SqlServer

核心問題:預存程序中的動態 DDL 權限檢查機制

在 Oracle PL/SQL 程序中使用 EXECUTE IMMEDIATE 執行動態 DDL(如 CREATE TABLE)時,常遇到 ORA-01031: insufficient privileges 錯誤。根本原因在於:預存物件(Procedure、Function、Package、Trigger、View)執行時僅啟用 PUBLIC 角色,不繼承使用者透過角色獲得的權限。

官方文件說明

「若權僅透過角色授予,則預期行為為拒絕存取。預存物件在物件擁有者的安全域中執行,除 PUBLIC 外不啟用任何角色。」

實測驗證流程

  1. 建立使用者 chris 並授予 DBA 角色(含 CREATE TABLE 權限)
  2. 直接登入 chris 執行 CREATE TABLE → 成功
  3. 建立 Procedure chris_cr_tbl 內含 EXECUTE IMMEDIATE 'CREATE TABLE ...'
  4. 執行 Procedure → 失敗,回報 ORA-01031
  5. 以系統管理員對 chris 顯式授權 GRANT CREATE TABLE TO chris
  6. 再次執行 Procedure → 成功

解決方案與最佳實務

  • 永遠使用顯式授權(GRANT ... TO user) 給預存程式擁有者所需的 DDL 權限
  • 避免依賴角色傳遞 DDL 權限給 PL/SQL 程式單元
  • 若需動態建立/修改結構,考慮使用 AUTHID CURRENT_USER 定義權限模型(需謹慎評估安全性)

此行為為 Oracle 設計機制,非 Bug,開發階段務必驗證動態 SQL 權限路徑。

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