使用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,旧的,以防万一)
答案 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;