Выполнение Oracle сохраненный Proc как другой пользователь

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

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

Например: Пользователь типа A создает строку 'ВЫБОР * ОТ A.USERTABLE' - в то время как пользователь типа B создает строку 'ВЫБОР * ОТ B.USERTABLE'.

То, что я пытаюсь сделать, позволяют пользователю не, явно определяют их схему. Во фронтенде приложение .NET; я уже знаю, являются ли они типом A, B, или C. Я хочу, чтобы все три просто ввели 'ВЫБОР * ОТ USERTABLE'.

Проблема, которую я имею, состоит в том, что я не знаю, как сделать это. Мое приложение может только выполнить proc в схеме 'КОДА' - таким образом, я не могу только копировать код и позволить пользователю вызов 'A.ExecuteSQL'.

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

Какие-либо предложения?

9
задан OMG Ponies 4 March 2010 в 04:03
поделиться

2 ответа

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

ALTER SESSION SET CURRENT_SCHEMA = schema

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

10
ответ дан 4 December 2019 в 11:41
поделиться

Другой вариант - использовать прагму 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 - все, что вы можете избежать, не нарушая существующие код).

8
ответ дан 4 December 2019 в 11:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: