繁体   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