Выполнение хранимого процесса Oracle как другого пользователя - PullRequest
9 голосов
/ 04 марта 2010

Я в основном начинающий оракул, так что простите, если это глупый вопрос ...

У меня есть схема с именем 'CODE' с сохраненным процессом, который выполняет произвольный SQL (сейчас, пожалуйста, игнорируйте потенциальные проблемы безопасности, связанные с этим). Переданный SQL выберет данные; но все данные находятся либо в схеме A, B, либо в C - но SQL будет когда-либо выбирать только из ОДНОЙ схемы за один раз.

Например: пользователь типа A создает строку «SELECT * FROM A.USERTABLE» - в то время как пользователь типа B создает строку «SELECT * FROM B.USERTABLE».

Я пытаюсь разрешить пользователю не указывать свою схему явно. Во внешнем приложении .net; Я уже знаю, относятся ли они к типу A, B или C. Я хочу, чтобы все три просто введите «SELECT * FROM USERTABLE».

Проблема в том, что я не знаю, как это сделать. Мое приложение может выполнять proc только в схеме «CODE», поэтому я не могу просто продублировать код и позволить пользователю A вызвать «A.ExecuteSQL».

Я пробовал несколько вещей; но пока ничего не получалось. Я хочу, чтобы процесс ExecuteSQL оставался в схеме CODE; но когда передается 'USERTABLE', мне нужно знать, что иногда это означает A.USERNAME, а иногда B.USERNAME.

Есть предложения?

Ответы [ 2 ]

10 голосов
/ 04 марта 2010

Использование:

ALTER SESSION SET CURRENT_SCHEMA = schema

Это эквивалентно синтаксису EXECUTE AS SQL Server .

7 голосов
/ 28 июня 2010

Другой вариант - использование прагмы AUTHID CURRENT_USER.

Если вы добавите эти два ключевых слова сразу после имени вашего пакета, процедуры, функции или типа, оно будет выполняться с привилегиями исполняющего пользователя, а не со схемой CODE. Это переопределяет поведение по умолчанию AUTHID DEFINER (привилегии схемы / пользователя, скомпилировавшего код)

т.е.

CREATE FUNCTION examplefunc
    (pSqlStatement IN VARCHAR2)
RETURN INTEGER
  AUTHID CURRENT_USER
AS 
   lResult INTEGER;
BEGIN
    EXECUTE IMMEDIATE pSqlStatement INTO lResult;
    RETURN lResult;
END examplefunc;

Обратите внимание, что для функций и процедур, находящихся внутри пакета, прагма может применяться только на уровне пакета. Вы не можете устанавливать права для каждой функции.

Это должно привести к выполнению любого SQL внутри функции, пакета и т. Д. С привилегиями пользователя.

Я использовал это для управления аналогичной подпрограммой «динамически запускать любой старый бит SQL» - по крайней мере вы не позволите «обычному» пользователю использовать вашу хранимую процедуру для удаления таблицы или установки. дополнительный код в схеме CODE.

(Это может также стоить - если вы этого еще не сделали - добавить некоторую проверку для исключения определенных ключевых слов - т.е. должен начинаться с SELECT, не должен содержать встроенные блоки pl / sql - все, что вы можете обойтись без нарушения существующих код).

...