【问题标题】:How to grant priviledges to a read only user on a function?如何将权限授予只读用户的功能?
【发布时间】:2014-06-26 09:25:13
【问题描述】:

使用 PL/SQL 我创建了一个 util 函数:

create or replace function DOSOMETHING(article varchar) return varchar is ...
begin
    ...
end;

到目前为止,该功能运行良好。但仅适用于创建它的用户。我还有一个名为“read”的用户,他只能在数据库中读取。而且他当然不能创建函数,因为他有只读权限。问题是他看不到这个函数的存在:

SELECT * FROM ALL_OBJECTS WHERE (OBJECT_TYPE = 'FUNCTION')

>>> This <<< 似乎可以解决这个问题。所以我可以说“读取”可以将此函数用于选择语句等?正确的 ?这就是我想要的。我尝试了以下方法,但都没有奏效。我该怎么做或做不同的事情?

begin GRANT SELECT ON DOSOMETHING TO READ; end;
begin execute immediate('GRANT SELECT ON DOSOMETHING TO READ'); end;

第一个错误信息:

[ODBC driver for Oracle][Oracle]ORA-06550: line 1, column 7:
PLS-00103: Encountered the symbol "GRANT" when expecting one of the following:

   begin declare exit for goto if loop mod null pragma raise
   return select update while <an identifier>
   <a double-quoted delimited-identifier> <a bind variable> <<
   close current delete fetch lock insert open rollback
   savepoint set sql execute commit forall
   <a single-quoted SQL string>

(Oracle 版本是 8i,旧的东西,以防万一)

【问题讨论】:

    标签: sql oracle plsql privileges


    【解决方案1】:

    你已经接近了。对于过程,您需要EXECUTE 权限而不是SELECT

    GRANT EXECUTE ON dosomething TO READ;
    

    将其作为 SQL 语句运行,或者

       begin execute immediate 'GRANT EXECUTE ON dosomething TO READ';  end;
    

    将其作为 PL/SQL 块运行。

    当您作为READ 用户使用该函数时,您必须在其名称前加上所有者:

    SELECT <owner>.dosomething('abc') FROM dual;
    

    【讨论】:

    • 通常,您还可以创建一个同义词(PUBLIC 或 READ's),以便 READ 可以在不命名所有者的情况下使用它。
    • ♥ 谢谢! ♥ 第二个做到了。
    猜你喜欢
    • 2017-04-07
    • 2019-10-03
    • 2014-07-26
    • 2023-04-02
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    相关资源
    最近更新 更多