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
.
中行的值
用户 A
在 sp
.
上授予用户 B
execute
需要向用户 A
和 B
提供哪些额外的授权,以便 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.
到目前为止,GTT
和 SP
所有者一切正常。让我们看看受助人。
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>
请假设:
用户 A
创建全局临时文件 table gtt
.
用户 A
使用定义者权限 AUTHID DEFINER
创建了存储过程 sp
。为简单起见,假设此 sp
只是将一行插入 gtt
并且 select 是 gtt
.
用户 A
在 sp
.
B
execute
需要向用户 A
和 B
提供哪些额外的授权,以便 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.
到目前为止,GTT
和 SP
所有者一切正常。让我们看看受助人。
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>