Oracle 模式用户无法在过程中创建表

Posted

技术标签:

【中文标题】Oracle 模式用户无法在过程中创建表【英文标题】:Oracle schema user cannot create table in procedure 【发布时间】:2018-05-25 06:08:29 【问题描述】:

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

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 工作表中没有相同的权限,并且当它执行一个过程时,该过程也在它自己的架构中。

【问题讨论】:

您必须指定以下内容: 1. 您是否使用同一用户在同一数据库/容器上运行此程序? 2. 如果用户是相同的 - 你确定语句通过并执行(在工作表中)? 3. 我看到INFOP_STAMMDATEN.PA_DELETE_FP 的第16 行发生了错误- 是包含过程pr_create_tmp_bp_table 的包吗? 4.最重要的——你的用户有CRATE TABLE权限吗? 【参考方案1】:

您的直接问题的答案是您得到ORA-01031: insufficient privileges,因为您的用户具有通过角色授予的 CREATE TABLE 权限:Oracle 安全模型强制执行一个规则,即我们不能使用通过 PL/SQL 中的角色授予的权限.因此,您需要您的 DBA 直接向您的用户授予 CREATE TABLE 权限。

你呢?

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

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

【讨论】:

好的,我尝试GRANT CREATE TABLE TO INFOP_STAMMDATEN; 作为 shema 用户。不幸的是,我又收到了ORA-01031: insufficient privileges 您使用的用户没有 WITH GRANT 选项,因此不允许将其 CREATE TABLE 权限传递给其他用户。这就是为什么我建议您需要让 DBA 参与进来。 @BetaRide 我不确定您所说的 GRANT CREATE TABLE TO INFOP_STAMMDATEN 是什么意思;作为架构用户架构用户是INFOP_STAMMDATEN吗?如果您正在尝试这样做,您不能只授予自己系统权限。 我在截断另一个用户的表时遇到了同样的问题。我授予用户 DROP ANY TABLE 权限,但它解决了问题。我仍然没有足够的权限 @Amir - 截断属于另一个用户的表是一个不同的问题。我建议您提出一个新问题,尽可能提供详细信息。可能这个问题已经在这个网站上得到了回答,但是如果没有更多关于你想要达到的目标的信息,就很难说清楚。

以上是关于Oracle 模式用户无法在过程中创建表的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 10g中如何创建表

Oracle 10g中如何创建表

如何在oracle10G中创建表空间

授予权限以在 oracle sql 过程中创建表

oracle 怎么在存储过程中创建一个临时表,在里面插入数据,再查找这个临时表的所有数据,最后drop这个表。

ORACLE中创建表空间,创建表,改动表,授权