我如何看待Oracle视图中的数据,就像我通过应用程序看到的那样?

时间:2010-05-03 21:31:06

标签: oracle settings sqlplus

当我与我的应用程序用户一起浏览Oracle应用程序并且有正确的责任时,我会看到数据 我使用“记录历史”菜单查看应用程序使用的表/视图 所以,我得到PA_EXPEND_ITEMS_ADJUST2_V

当我在sqlplus会话中与apps用户连接时,

SELECT * FROM PA_EXPEND_ITEMS_ADJUST2_V

给了我0行。

我猜有些东西与apps有误配置,但是什么?

如何在sqlplus会话中使用apps用户查看PA_EXPEND_ITEMS_ADJUST2_V的行?

如何通过应用程序看到Oracle视图中的数据?

4 个答案:

答案 0 :(得分:2)

这里可能发生了一些行级安全问题。可能基于视图,可能是内置的RLS / FGAC / VPD(或者他们用该版本提供的任何首字母缩略词)。这就是数据库在幕后重写查询以添加过滤器的地方。

通常基于SYS_CONTEXT值。

答案 1 :(得分:1)

您需要使用与应用程序使用的用户相同的用户(或具有相同权限/角色的用户)登录oracle。

您需要与您的DBA交谈。

答案 2 :(得分:1)

在Oracle Applications中,您必须执行APPS.FND_GLOBAL.apps_initialize过程才能在SQL * Plus会话中拥有相同的上下文。我使用以下脚本启动会话:

SET SERVEROUTPUT ON
DECLARE
   l_user_id   NUMBER;
   l_resp_id   NUMBER;
   l_app_id    NUMBER;
   l_resp_name VARCHAR2(100) := '<Name of your responsibility>';
   l_login VARCHAR2(30) := '<USERLOGIN>'
BEGIN
   SELECT user_id INTO l_user_id FROM fnd_user WHERE user_name = l_login;
   SELECT application_id, responsibility_id
     INTO l_app_id, l_resp_id
     FROM fnd_responsibility_vl
    WHERE responsibility_name = l_resp_name;
   apps.fnd_global.apps_initialize(l_user_id, l_resp_id, l_app_id);
   dbms_output.put_line('l_user_id = '||l_user_id);
   dbms_output.put_line('l_resp_id = '||l_resp_id);
   dbms_output.put_line('l_app_id = '||l_app_id);
END;
/

答案 3 :(得分:0)

另一种可能性(除了可能涉及的行级安全性)是视图基于一个或多个全局临时表 - 这意味着除非您在同一会话中查询,否则您将看不到数据插入它。

或许,应用程序在完成后删除数据;)