我有一个名为 A 的包,A 有函数 doSomething();
用户 x 是 A 的所有者。用户 y 有一个同义词 testSyn,它指向 xA;
以 x 登录并执行函数 doSomething() 返回 true,但是当以用户 y 登录并执行 testSyn.doSomething() 之类的函数时,它对于相同的值返回 false。
有人可以解释为什么会这样吗?
看一下过程的定义。如果是这样的PROCEDURE a AUTHID CURRENT_USER
话,它将以当前用户的权限和名称解析执行。如果该过程使用将用户权限考虑在内的视图(例如user_objects
),则可以解释不同的结果。
评论回复:你做错了区分。想象一下,您编写了一个过程,该过程object_name
从user_objects
. 该程序归其所有schema_owner
并schema_invoker
有权执行。如果过程没有定义AUTHID CURRENT_USER
,它将返回schema_owner
模式中对象的对象名称。相同的过程将改为从模式AUTHID CURRENT_USER
中返回一个对象名称。schema_invoker
这与执行权限无关。
我不知道这是您问题的根源,但它是一个很好的候选者并且很容易检查(只需查看包规范中的过程定义)。
您可以执行该函数,但您可能没有访问该函数引用的所有对象的权限。对于初学者,我会尝试找出您的函数访问哪些数据库对象,并尝试从 sqlplus 之类的工具访问这些对象以进行验证