Как предоставить привилегии пользователю, доступному только для чтения, для функции?

#sql #oracle #plsql #privileges

#sql #Oracle #plsql #привилегии

Вопрос:

С помощью 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, старая версия, на случай, если это имеет значение)

Ответ №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;
 

Комментарии:

1. Обычно вы также создаете синоним (ОБЩЕДОСТУПНЫЙ или для ЧТЕНИЯ), чтобы READ мог использовать его, не называя владельца.

2. ♥ Спасибо! ♥ 2-й сделал это.