#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-й сделал это.