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' 也不行。
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' 也不行。