Oracle 通过定义者权限存储过程使用全局临时 Table 的权限

Oracle Privileges to Use Global Temporary Table via Definer's Rights Stored Procedure

请假设:

用户 A 创建全局临时文件 table gtt.

用户 A 使用定义者权限 AUTHID DEFINER 创建了存储过程 sp。为简单起见,假设此 sp 只是将一行插入 gtt 并且 select 是 gtt.

中行的值

用户 Asp.

上授予用户 B execute

需要向用户 AB 提供哪些额外的授权,以便 B 可以成功执行 sp

我听说当使用全局临时 table 时(例如插入数据),使用全局临时 table 的用户需要 create table 权限才能创建实例会话内存中的全局临时 table(即使全局临时 table 本身已经创建)。真的吗?我假设授予 select 并插入全局临时 table 就足够了。

因为 sp 是由 A 定义的,这是否意味着 A 需要 create any table,所以可以插入数据行并从中 selected用户 B 的会话内存?

抱歉,我目前无法访问 Oracle 实例,但我没有足够的权限亲自尝试此操作。

请注意,我不是试图在存储过程中创建全局临时table。

使用 Oracle 19c 企业版。

提前感谢您帮助我理解这里涉及的权限。

What additional grants, if any, need to be given to users A and B so that B can successfully execute sp?

None.


SQL> show user
USER is "SCOTT"
SQL> create global temporary table gtt (name varchar2(20));

Table created.

SQL> create or replace procedure sp
  2    authid definer
  3  as
  4  begin
  5    insert into gtt (name) values (user);
  6  end;
  7  /

Procedure created.

SQL> exec sp;

PL/SQL procedure successfully completed.

SQL> select * from gtt;

NAME
--------------------
SCOTT

SQL> grant execute on sp to mike;

Grant succeeded.

到目前为止,GTTSP 所有者一切正常。让我们看看受助人。

SQL> connect mike/lion
Connected.
SQL> exec scott.sp;

PL/SQL procedure successfully completed.

SQL> select * From scott.gtt;
select * From scott.gtt
                    *
ERROR at line 1:
ORA-00942: table or view does not exist

对;正如我所说,不需要其他特权 - 存储过程有效(即没有失败),但是 - 由于 scott 没有授予任何额外的特权,mike 无法检查 gtt table的内容。

返回scott:

SQL> connect scott/tiger
Connected.
SQL> select * From scott.gtt;

no rows selected

SQL>

但是当然;那是一个全局临时 table - scott 只能看到它自己的数据(现在丢失了)。


[编辑:回答您作为评论发布的问题]

mike 拥有 create table 权限;现在没有了:

SQL> connect sys as sysdba
Enter password:
Connected.
SQL> revoke create table from mike;

Revoke succeeded.

这段代码是上面的copy/paste:

SQL> connect scott/tiger
Connected.
SQL> create global temporary table gtt (name varchar2(20));

Table created.

SQL> create or replace procedure sp
  2    authid definer
  3  as
  4  begin
  5    insert into gtt (name) values (user);
  6  end;
  7  /

Procedure created.

SQL> exec sp;

PL/SQL procedure successfully completed.

SQL> select * from gtt;

NAME
--------------------
SCOTT

SQL> grant execute on sp to mike;

Grant succeeded.

此外,scott 现在将 gtt 上的 select 授予 mike

SQL> grant select on gtt to mike;

Grant succeeded.

mike现在看到了什么?

SQL> connect mike/lion
Connected.
SQL> exec scott.sp;

PL/SQL procedure successfully completed.

SQL> select * from scott.gtt;

NAME
--------------------
MIKE

SQL>