0

请假设:

用户A创建全局临时表gtt

用户A创建sp具有定义者权限的存储过程AUTHID DEFINER。为简单起见,假设这sp只是在 中插入一行gtt并从行中选择一个值gtt

用户A授予用户B execute.sp

需要向用户提供哪些额外的授权(如果有的话)A才能B成功B执行sp

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

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

抱歉,我目前无权访问我有足够权限自己尝试的 Oracle 实例。

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

使用 Oracle 19c 企业版。

预先感谢您帮助我了解此处涉及的特权。

4

1 回答 1

0

需要向用户 A 和 B 提供哪些额外的授权(如果有),以便 B 可以成功执行 sp?

没有任何。


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表的内容。

返回scott

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

no rows selected

SQL>

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

于 2022-03-05T21:10:13.743 回答