PL/SQL: ORA-01031: 权限不足 6/1 PL/SQL: SQL 语句被忽略 GRANT

PL/SQL: ORA-01031: insufficient privileges 6/1 PL/SQL: SQL Statement ignored GRANT

Oracle Database 12c 标准版 12.2.0.1.0 - 64 位生产

我在尝试创建包时收到上述消息。 我可以用一个非常简单的过程和 select 语句来模拟。 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 从表格中。

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;

我授予select一个角色

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

嗯,你说的有点奇怪。通常我们将权限授予 users,而不是 procedures.

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 ...

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

感谢@Littlefoot

我使用了一个解决方法。我的程序相对简单,我想从我的“问题”table 中插入自定义 table。我希望这个由每小时的数据库工作调用。 因为我可以 select 并插入 SQL, 而不是 PL/SQL 程序,所以我使用了 SQL 脚本而不是数据库程序。

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

不理想。

PS 'execute immediate' 也不行。