【问题标题】:PL/SQL: ORA-01031: insufficient privileges 6/1 PL/SQL: SQL Statement ignored GRANTPL/SQL:ORA-01031:权限不足 6/1 PL/SQL:SQL 语句被忽略 GRANT
【发布时间】:2021-09-22 09:15:11
【问题描述】:

Oracle Database 12c Standard Edition Release 12.2.0.1.0 - 64bit Production

我在尝试创建包时收到上述消息。 我可以用一个非常简单的过程和选择语句来模拟。 My understanding is that have SQL select access for a user does not translate to PL/SQL (package) access for the same user, and that an option is to use roles.这对我不起作用。

这一切都是由同一个用户完成的(不是 apex_180100)。

显示问题:

此 SQL 有效。这没有意义,但证明我可以从表格中选择。

SELECT 1
FROM   apex_180100.wwv_flow_activity_log l,
           apex_180100.wwv_flow_worksheet_rpts r
WHERE  l.ir_report_id IS NOT NULL
AND l.flow_id = 100
AND l.worksheet_id = r.worksheet_id
AND l.ir_report_id = r.id
AND l.flow_id = r.flow_id
AND l.step_id = r.page_id;

我将选择权授予一个角色

GRANT SELECT ON apex_180100.wwv_flow_worksheet_rpts TO PRIV_FULL_TABLE;
GRANT SELECT ON apex_180100.wwv_flow_activity_log  TO PRIV_FULL_TABLE;

我将我的角色授予我的程序(最终我将授予我的包)

GRANT PRIV_FULL_TABLE TO PROCEDURE p_test;

我在创建这个简单的示例过程时遇到错误。

create OR REPLACE procedure p_test is
V_TEST NUMBER;
begin


SELECT 1
INTO V_TEST
FROM   apex_180100.wwv_flow_activity_log l,
           apex_180100.wwv_flow_worksheet_rpts r
    WHERE  l.ir_report_id IS NOT NULL
    AND l.flow_id = 100
    AND l.worksheet_id = r.worksheet_id
    AND l.ir_report_id = r.id
    AND l.flow_id = r.flow_id
    AND l.step_id = r.page_id;

end;

PL/SQL: ORA-01031: insufficient privileges compilation error

【问题讨论】:

  • 你确定你有足够的权限来创建一个过程吗?通常,对于您无权从中选择的表或视图,Oracle 会说“对象不存在”
  • 是的,我可以运行以下命令。创建 OR REPLACE 过程 p_test 是 V_TEST NUMBER;开始 SELECT 1 INTO V_TEST FROM dual ;结束;

标签: oracle plsql plsql-package


【解决方案1】:

嗯,你说的有点奇怪。通常我们授予用户权限,而不是程序

SQL> create procedure p_test as begin
  2  null;
  3  end;
  4  /

Procedure created.

SQL> create role priv_full_table;

Role created.

SQL> grant priv_full_table to procedure p_test;
grant priv_full_table to procedure p_test
                                        *
ERROR at line 1:
ORA-00991: only MAC privileges may be granted to procedures


SQL>

除此之外,如果我对您的理解正确,问题正是您认为可以解决的问题:授予角色的权限在 named 存储过程中不起作用。 p_test命名过程

create OR REPLACE procedure p_test is ...

这意味着您必须直接将这些权限授予将要使用它们的用户。

【讨论】:

  • 我没有收到您的最后一个错误。我可以毫无问题地将角色授予该过程。
  • 啊哈,甲骨文 12c。这可能是我的问题(我在 11g 上)。尽管如此,直接向用户授予权限(而不是通过角色)怎么样?
  • sqlplus / as sysdba grant select on apex_180100.wwv_flow_worksheet_rpts to wms;将 apex_180100.wwv_flow_activity_log 上的选择授予 wms;创建或替换...这可行(谢谢@Littlefoot)。但是,由于我们没有 sysdba,因此在我们的许多生产站点中几乎不可能进行后勤工作。了解如何使其与我拥有的特权一起工作真的很棒。我不明白关于命名过程与存储过程的评论。我可以用动态 SQL 或视图作为解决方法吗?
  • 一个存储过程被命名,它有它的名字。它不同于匿名 PL/SQL 块(以 DECLARE ... BEGIN ... executable statements here ... END 开头的块。在命名的 PL/SQL 过程中,通过角色获得的授权不起作用,而且 - 据我所知 - 你不能“修复" 以任何其他方式,但通过直接向将使用它们的用户授予权限。
【解决方案2】:

感谢@Littlefoot

我使用了一种解决方法。我的程序相对简单,我想从我的“问题”表中插入自定义表。我希望通过每小时的数据库工作来调用它。 因为我可以在 SQL 中选择和插入,不是 PL/SQL 过程,所以我使用 SQL 脚本而不是数据库过程。

即我将我的包转换为一系列 SQL 语句。我将此 sql 脚本存储在服务器上并作为 DBA 作业可执行文件运行。

不理想。

PS“立即执行”也不起作用。

【讨论】:

    猜你喜欢
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    相关资源
    最近更新 更多