如何为函数上的只读用户授予权限?

时间:2014-06-26 09:25:13

标签: sql oracle plsql privileges

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

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

到目前为止,该功能运作良好。但仅适用于创建它的用户。我还有一个名为“read”的用户只能在db中读取。他当然不能创造功能,因为他只读权利。事情是他无法看到函数存在如下:

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

>>> This <<<似乎可以解决这个问题。所以我可以说“read”可能会将此函数用于select语句等?对 ?这就是我想要的。我尝试了以下,但没有一个工作。我该怎么做或以不同的方式做到这一点?

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,旧的,以防万一)

1 个答案:

答案 0 :(得分:3)

你很亲密。对于过程,您需要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;