【问题标题】:How to access a public synonym in a function如何访问函数中的公共同义词
【发布时间】:2015-01-26 00:11:20
【问题描述】:

在一个模式(Oracle 11g 数据库)中,我可以运行(即用户有权从 dba_tables 中选择):

select count(*) from dba_tables where table_name = 'XXX' and owner = 'YYY';

但是当我尝试在同一架构中创建函数时,我得到“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: 表或视图不存在

我们将不胜感激。

【问题讨论】:

    标签: oracle function plsql synonym


    【解决方案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 访问权限。

    【讨论】:

      猜你喜欢
      • 2016-01-09
      • 1970-01-01
      • 2016-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      • 2011-12-23
      相关资源
      最近更新 更多