在架构(Oracle 11g数据库)中,我可以运行(即用户有权从dba_tables中选择):
select count(*) from dba_tables where table_name = 'XXX' and owner = 'YYY';
但是当我尝试在同一模式中创建一个函数时,我得到了#34; PL / SQL:ORA-00942:表或视图不存在":
CREATE OR REPLACE FUNCTION chk_table (p_owner IN varchar2, p_table_name IN varchar2) RETURN number IS
v_count integer;
BEGIN
v_count := 0;
select count(*) into v_count
from dba_tables
where table_name = p_table_name
and owner = p_owner
;
return v_count;
END chk_table;
/
FUNCTION CHK_TABLE的错误: 9/8 PL / SQL:ORA-00942:表或视图不存在
任何帮助将不胜感激。
答案 0 :(得分:1)
使用动态SQL和调用者的权限来解决此问题。另一种方法是直接向您的帐户授予对DBA_TABLES的访问权限。
create or replace function chk_table(p_owner in varchar2, p_table_name in varchar2)
return number authid current_user is
v_count integer;
begin
v_count := 0;
execute immediate '
select count(*)
from dba_tables
where table_name = :p_table_name
and owner = :p_owner'
into v_count
using p_table_name, p_owner;
return v_count;
end chk_table;
/
编译的PL / SQL无权访问通过角色授予所有者的对象。动态SQL避免了编译时权限检查。调用者的权限authid current_user
将在调用时使用调用者的权限,包括角色权限。
特权取决于您的要求。就目前而言,此功能不会向用户授予任何其他权限。如果您想要它为呼叫者提供额外的权限,那么请保留您的功能并直接授予您对帐户的SELECT访问权限。