2014-06-26 63 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