为什么此查询因调用者权限而失败?

FOR*_*RAN 4 oracle

我以 sysdba 身份连接到 oracle 并运行它

但是为什么在使用调用者权限调用时它会失败?那是 p_user 调用。

这是代码:

alter session set current_schema=x;
CREATE or replace package p_definer as
    procedure d(name_ varchar2);
end;
/
CREATE or replace package p_user authid current_user as
    procedure d(name_ varchar2);
end;
/
CREATE or replace package body p_definer as
    procedure d(name_ varchar2) as
    begin
        execute immediate 'drop procedure '||name_;
    end;
end;
/
CREATE or replace package body p_user as
    procedure d(name_ varchar2) as
    begin
        execute immediate 'drop procedure '||name_;
    end;
end;
/
create or replace procedure f_foo as
BEGIN
    dbms_output.put_line('hello world');
END;
/
Run Code Online (Sandbox Code Playgroud)

这是电话

SQL> call p_user.d('f_foo');
call p_user.d('f_foo')
     *
ERROR at line 1:
ORA-06598: insufficient INHERIT PRIVILEGES privilege
ORA-06512: at "G_GS.P_USER", line 2
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?

SQL>
SQL> call p_definer.d('f_foo');

Call completed.
Run Code Online (Sandbox Code Playgroud)

Bal*_*app 5

因为这是一个新的 12c 安全功能。

用户 x 创建了一个无害的包,每个人都开始使用它,即使是具有更高权限的用户,如 SYS。

现在用户 x 知道 SYS 经常使用这个包,所以用户 x 可以随时用一些恶意代码替换这个包的内容,并在数据库中做任何事情,知道这些代码迟早会被 SYS 运行。

12c 通过这个新功能防止了这种情况:

继承特权和继承任何特权特权

但如果 SYS 信任 x,则可以执行以下操作:

grant inherit privileges on user sys to x;
Run Code Online (Sandbox Code Playgroud)

这将允许 x 在运行上述代码时继承 SYS 的权限。