ORACLE 从 ALL_SOURCE 中选择在例程内执行时产生空结果
ORACLE Selecting from ALL_SOURCE yields empty result when executed from within routine
我有一个例程,其任务是从 ALL_SOURCE 中提取代码。这是使用以下游标完成的:
CURSOR w_cur ( p_name VARCHAR2 , p_type VARCHAR2) IS
SELECT text , line
FROM ALL_SOURCE
WHERE UPPER(TYPE) = UPPER(p_type)
AND UPPER(NAME) = UPPER(p_name)
AND UPPER(OWNER) = UPPER(NVL(G_Owner_to_User,USER))
ORDER BY line
;
我正在从具有 DBA 和 SYS 权限的用户执行此例程。
尝试提取 "PACKAGE" 的 "BODY" 时,如果包属于同一个用户 运行 程序,我会得到正确的结果。另一方面,如果我尝试提取属于另一个用户的包的 "BODY",我会得到一个空结果。
有趣的是,当 运行 以上 "SELECT" 来自 SQL 开发人员(同一用户)时,我确实得到了预期的代码。
这看起来像是 "PRIVILEGE" 相关的东西,但我不知道为什么我会得到不同的结果以及缺少哪个权限。
感谢您的评论。
费尔南多。
使用 AUTHID CURRENT_USER
创建过程,Oracle 将使用调用者的角色来确定访问权限。默认值为 AUTHID DEFINER
,不包括通过角色授予的权限(除了像 PUBLIC 这样的特殊角色)。
这些函数显示了 ALL_SOURCE
的调用者和定义者权限之间的区别。
create or replace function count_source_invoker return number authid current_user is
v_count number;
begin
select count(*) into v_count from all_source;
return v_count;
end;
/
create or replace function count_source_definer return number authid definer is
v_count number;
begin
select count(*) into v_count from all_source;
return v_count;
end;
/
select
(select count(*) from all_source) real_count,
count_source_invoker,
count_source_definer
from dual;
结果:
REAL_COUNT COUNT_SOURCE_INVOKER COUNT_SOURCE_DEFINER
---------- -------------------- --------------------
333677 333677 142871
我有一个例程,其任务是从 ALL_SOURCE 中提取代码。这是使用以下游标完成的:
CURSOR w_cur ( p_name VARCHAR2 , p_type VARCHAR2) IS
SELECT text , line
FROM ALL_SOURCE
WHERE UPPER(TYPE) = UPPER(p_type)
AND UPPER(NAME) = UPPER(p_name)
AND UPPER(OWNER) = UPPER(NVL(G_Owner_to_User,USER))
ORDER BY line
;
我正在从具有 DBA 和 SYS 权限的用户执行此例程。 尝试提取 "PACKAGE" 的 "BODY" 时,如果包属于同一个用户 运行 程序,我会得到正确的结果。另一方面,如果我尝试提取属于另一个用户的包的 "BODY",我会得到一个空结果。
有趣的是,当 运行 以上 "SELECT" 来自 SQL 开发人员(同一用户)时,我确实得到了预期的代码。
这看起来像是 "PRIVILEGE" 相关的东西,但我不知道为什么我会得到不同的结果以及缺少哪个权限。
感谢您的评论。
费尔南多。
使用 AUTHID CURRENT_USER
创建过程,Oracle 将使用调用者的角色来确定访问权限。默认值为 AUTHID DEFINER
,不包括通过角色授予的权限(除了像 PUBLIC 这样的特殊角色)。
这些函数显示了 ALL_SOURCE
的调用者和定义者权限之间的区别。
create or replace function count_source_invoker return number authid current_user is
v_count number;
begin
select count(*) into v_count from all_source;
return v_count;
end;
/
create or replace function count_source_definer return number authid definer is
v_count number;
begin
select count(*) into v_count from all_source;
return v_count;
end;
/
select
(select count(*) from all_source) real_count,
count_source_invoker,
count_source_definer
from dual;
结果:
REAL_COUNT COUNT_SOURCE_INVOKER COUNT_SOURCE_DEFINER
---------- -------------------- --------------------
333677 333677 142871