什么是调用程序';s对Oracle PL/SQL函数的权限?
第一个结果缓存使用限制-未在具有调用方权限的模块或匿名块中定义 “调用方权利”是什么意思?这是否意味着user_procedures.AUTHID不应该是此函数的“定义者”?执行Oracle PL/SQL代码时的调用者和定义者权限 您正在解释的规则限制存储在数据库缓存中的某些类型的PL/SQL代码的使用。包含的PL/SQL代码类型为以下代码段:什么是调用程序';s对Oracle PL/SQL函数的权限?,oracle,plsql,Oracle,Plsql,第一个结果缓存使用限制-未在具有调用方权限的模块或匿名块中定义 “调用方权利”是什么意思?这是否意味着user_procedures.AUTHID不应该是此函数的“定义者”?执行Oracle PL/SQL代码时的调用者和定义者权限 您正在解释的规则限制存储在数据库缓存中的某些类型的PL/SQL代码的使用。包含的PL/SQL代码类型为以下代码段: 匿名块(即,这些是通过SQL Plus或其他一些输入运行的代码片段,实际上不是数据库中持久对象(如存储过程、函数或包)的一部分) 使用调用方权限定义的:
匿名块
(即,这些是通过SQL Plus或其他一些输入运行的代码片段,实际上不是数据库中持久对象(如存储过程、函数或包)的一部分):(请参见下面的说明)
调用方
意味着无论执行PL/SQL对象的是什么用户
帐户,该过程都以该用户帐户的权限而不是定义方(对象所有者)的常规权限运行
Tom Kyte在他的Ask Tom网站上发表了关于定义者与调用者权利的文章
上述参考中最值得注意的注释是以下代码示例块:
In the above, if user1 created:
create or replace procedure proc1
authid current_user
as
begin
for x in ( select * from my_table ) loop
null;
end loop;
end;
/
在下一行:authid current_user
,这是用于设置调用方权限的注释。参考中的表my_表
有多种可能性:
- 在定义者和调用者相同的情况下执行
PROC1
(即OWNER
或USER1
)时,此表将为:USER1.MY_表
- 当过程
PROC1
的OWNER
以外的调用方或用户执行PROC1
(即USER2
)时,此表可以是以下可能的目标之一:
- 名为MY_table的
PUBLIC
拥有的表
- 私有或公有的
同义词
,用于名为MY\u table
- 属于
USER2
(即USER2.MY_TABLE
)的本地表,其名称与MY_TABLE
相同
如果上述情况属实,那么与过程USER1.PROC1
相关的引用存在大量歧义。根据调用用户标识的上下文和别名指针(同义词
)的可访问性/存在性,实际使用的物理表是不同的
结果是,鉴于内部引用的变量性质,对于启用了调用方权限的过程,缓存值的有用性值得怀疑