簡體   English   中英

Oracle模式用戶無法在過程中創建表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM