[英]Oracle schema user cannot create table in procedure
我正在嘗試在過程中創建一個臨時表:
PROCEDURE pr_create_tmp_bp_table(fp_id NUMBER) IS
tbl_name CONSTANT VARCHAR2(20) := 'BP_TO_DELETE';
BEGIN
-- sanity checks removed for readablity
EXECUTE IMMEDIATE
'CREATE GLOBAL TEMPORARY TABLE ' || tbl_name || ' ' ||
'ON COMMIT PRESERVE ROWS AS ' ||
'SELECT * FROM infop_stammdaten.bp';
END;
如果我將BEGIN.._END
塊復制到SQL工作表中,則一切正常。 因此,我認為用戶有權創建臨時表。 如果我從相同的SQL工作表執行該過程,則會得到
Fehlerbericht -
ORA-01031: Nicht ausreichende Berechtigungen
ORA-06512: in "INFOP_STAMMDATEN.PA_DELETE_FP", Zeile 16
ORA-06512: in Zeile 6
01031. 00000 - "insufficient privileges"
*Cause: An attempt was made to perform a database operation without
the necessary privileges.
*Action: Ask your database administrator or designated security
administrator to grant you the necessary privileges
第16行(Zeile 16)指向創建臨時表的EXECUTE IMMEDIATE語句。
對我來說,這看起來像用戶在sql工作表中沒有相同的權限,並且當它執行過程時,該過程也位於其自己的模式中。
眼前一個問題的答案是,您獲得ORA-01031: insufficient privileges
因為您的用戶具有通過角色授予的CREATE TABLE特權:Oracle安全模型強制執行以下規則:我們不能使用通過PL / SQL中的角色授予的特權。 因此,您需要DBA直接向用戶授予CREATE TABLE特權。
還是你
因為您要執行的操作在Oracle中沒有意義。 在Oracle中,全局臨時表是永久性結構。 只是其中的數據是臨時的。 因此,正確的解決方案是使用普通的DDL腳本(如任何其他數據庫對象)一次構建表。 然后,您可以根據需要插入全局臨時表。
您不是該站點上第一個犯此錯誤的人(請閱讀此相關主題 )。 通常是因為人們來自另一個數據庫,例如SQL Server,該數據庫具有稱為“臨時表”的結構,該結構實際上與Oracle的全局臨時表不同。 如果您的情況如此,那么您將對稱為專用臨時表的Oracle 18c新功能感興趣。 這些與SQL Server臨時表完全相似。 了解更多 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.