如何访问函数中的公共同义词

时间:2015-01-26 00:11:21

标签: oracle function plsql synonym

在架构(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:表或视图不存在

任何帮助将不胜感激。

1 个答案:

答案 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访问权限。