2014-06-26 62 views
0

用PL/SQL我创建了一个实用程序功能:如何将权限授予功能上的只读用户?

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

功能效果很好至今。但仅限于创建它的用户。我也有一个名为“read”的用户只能在db中读取。他当然不能创建功能,因为他只读过权利。事情是他无法看到,存在像功能:

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的,旧的东西,在这个情况下,重要的)

回答

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; 
+0

通常情况下,你还可以创建一个同义词(公共或读的),因此,阅读可以使用它没有命名所有者。 –

+0

♥谢谢! ♥第二个人做到了。 – Bitterblue