存储过程 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 STAGE 是 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;
我在用户 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 STAGE 是 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;