0

我有一个名为 A 的包,A 有函数 doSomething();

用户 x 是 A 的所有者。用户 y 有一个同义词 testSyn,它指向 xA;

以 x 登录并执行函数 doSomething() 返回 true,但是当以用户 y 登录并执行 testSyn.doSomething() 之类的函数时,它对于相同的值返回 false。

有人可以解释为什么会这样吗?

4

2 回答 2

2

看一下过程的定义。如果是这样的PROCEDURE a AUTHID CURRENT_USER话,它将以当前用户的权限和名称解析执行。如果该过程使用将用户权限考虑在内的视图(例如user_objects),则可以解释不同的结果。


评论回复:你做错了区分。想象一下,您编写了一个过程,该过程object_nameuser_objects. 该程序归其所有schema_ownerschema_invoker有权执行。如果过程没有定义AUTHID CURRENT_USER,它将返回schema_owner模式中对象的对象名称。相同的过程将改为从模式AUTHID CURRENT_USER中返回一个对象名称。schema_invoker这与执行权限无关。

我不知道这是您问题的根源,但它是一个很好的候选者并且很容易检查(只需查看包规范中的过程定义)。

于 2011-09-06T11:57:51.370 回答
0

您可以执行该函数,但您可能没有访问该函数引用的所有对象的权限。对于初学者,我会尝试找出您的函数访问哪些数据库对象,并尝试从 sqlplus 之类的工具访问这些对象以进行验证

于 2011-09-06T13:05:58.687 回答