存储过程 ORACLE 的 INHERIT PRIVILEGES 不足

Insufficient INHERIT PRIVILEGES for a stored procedure ORACLE

我在用户 META 中有一个存储过程。此 SP t运行在用户 STAGE 中分类 table。

CREATE PROCEDURE META.sp_truncate_tablex
  AUTHID CURRENT_USER
as
BEGIN
EXECUTE IMMEDIATE 'TRUNCATE TABLE STAGE.Tablex';
END;

当我 运行 SP 我得到 RA-06598: insufficient INHERIT PRIVILEGES.

我试过让这两个用户都成为DBA。 这意味着如果我 运行 SELECT grantee

WHERE  granted_role = 'DBA'
ORDER BY grantee;

这表明 META dn ST​​AGE 是 DBA。 我也试过:GRANT INHERIT PRIVILEGES ON USER STAGE TO META; 但我在 Oracle 18 中仍然遇到同样的错误。

你的问题是这个子句:

  AUTHID CURRENT_USER

这意味着执行该过程的用户使用他们自己的权限。因此,非 META 的用户不能 运行 该过程,除非他们具有 DROP ANY TABLE 权限,在这种情况下,他们不需要 运行 该过程,因为他们可以 t运行无论如何都要 table。

解决方案是用

声明过程
  AUTHID DEFINER

现在该过程以其所有者 - META - 可能拥有目标 table 的特权执行。除了他们没有。 table 实际上归 STAGE 所有。所以STAGE也需要拥有这个程序。

事实上,DEFINER 权限是默认权限,因此我们不需要明确定义它们,除非为了清楚起见。

CREATE PROCEDURE STAGE.sp_truncate_tablex
AS
BEGIN
  EXECUTE IMMEDIATE 'TRUNCATE TABLE STAGE.Tablex';
END;