代码之家  ›  专栏  ›  技术社区  ›  BetaRide

Oracle架构用户无法在过程中创建表

  •  1
  • BetaRide  · 技术社区  · 6 年前

    我正在尝试在过程中创建临时表:

    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)指向创建临时表的立即执行语句。

    在我看来,用户在sql工作表中没有相同的权限,当它执行一个过程时,该过程也在它自己的模式中。

    1 回复  |  直到 6 年前
        1
  •  4
  •   APC    6 年前

    你眼前问题的答案是 ORA-01031: insufficient privileges 因为您的用户拥有通过角色授予的创建表权限:Oracle安全模型强制执行一条规则,即我们不能使用通过PL/SQL中的角色授予的权限。因此,需要DBA直接向用户授予创建表权限。

    或者你呢?

    因为您试图做的事情在Oracle中没有意义。在Oracle中,全局临时表是 永久的 构筑物;只是其中的数据是暂时的。因此,正确的解决方案是像任何其他数据库对象一样,使用普通DDL脚本构建一次表。然后,您可以根据需要插入到全局临时表中。

    您不是此网站上第一个犯此错误的人( read this pertinent thread )。这通常是因为人们来自另一个数据库,例如SQL Server,它有一个称为“临时表”的构造,实际上与Oracle的全局临时表不同。如果这是您的场景,那么您将对Oracle 18c的一个称为私有临时表的新功能感兴趣。这些表与SQL Server临时表完全类似。 Find out more