2015-07-21 2 views
0

Я пытаюсь вызвать функцию внутри пакета, который возвращает определенный пользователем тип, присутствующий в другой схеме.вызывающая функция, возвращающая тип пользователя из другой схемы в Oracle

Функция и пакет декларации как ---

CREATE OR REPLACE PACKAGE PA_WEBHOOK 
    AUTHID CURRENT_USER 
IS 
    TYPE gcur_table_data IS REF CURSOR; 

    TYPE typ_tab_updated_ids IS TABLE OF orders.order_sid%TYPE; 
FUNCTION fn_order_customer_get (p_str_order_id IN orders.order_id%TYPE) RETURN gcur_table_data; 
END PA_WEBHOOK; 
/

Как ясно видно, что функция возвращает реф курсор в качестве вывода для выбранного количества строк.

Теперь для того, чтобы достичь этого, я последовал следующий steps--

1) создание роли -

CREATE ROLE ECOMMERCE_APP_ROLE; 

2) предоставление привилегии роли ---

GRANT EXECUTE ON PA_WEBHOOK TO ECOMMERCE_APP_ROLE; 

3) назначение роли пользовательской схеме

GRANT ECOMMERCE_APP_ROLE TO ECOMM_APP; 

4) создание синонима для пакета в другой схеме

Хотя я могу вызвать функцию из другой схемы, но я получаю нуль в наборе результатов, но всякий раз, когда я выполняю запрос, упомянутый в функции I могут видеть результаты.

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

ответ

1

Ваш пакет определяется с AUTHID CURRENT_USER поэтому при вызове PA_WEBHOOK.FN_ORDER_CUSTOMER_GET из исходной схемы она работает отлично, но когда вы вызываете его из схемы ECOMM_APP, он использует ECOMM_APP при выполнении, а не в привилегиях определяющей схемы, и использует схему ECOMM_APP во время разрешения имен вместо определяющей схемы, когда объекты не имеют полной квалификации.

Все это означает, что если PA_WEBHOOK.FN_ORDER_CUSTOMER_GET пытается вернуть указатель ref в таблицу ORDERS (не соответствует имени схемы владельца), он вернет refcursor в разные таблицы в зависимости от того, из какой схемы она вызвана. Если ваша схема имеет таблицу ORDERS, содержащую данные, вы получите данные назад, но если ECOMM_APP имеет таблицу ORDERS без данных, она не получит никаких данных. если ECOMM_APP не имеет указанной таблицы, функция может вызвать ошибку. Возможно, что функция имеет обработчик ошибок, который может маскировать эту ситуацию.

В качестве альтернативы, если PA_WEBHOOK.FN_ORDER_CUSTOMER_GET использует полностью квалифицированные ссылки на таблицы, то, возможно, на схеме ECOMM_APP нет выбора привилегий на них. Снова обработчик ошибок может маскировать отсутствие привилегий.

Не видя корпус упаковки, многие из этого догадываются. Вы можете прочитать на Invoker's and Definer's Rights в документах oracle для получения дополнительной информации.

+0

Проблема первоначально заключалась в самой функции, так как максимальное количество для курсора было достигнуто в системе. – Abhi

+0

Я уже предоставил обязательные привилегии, то есть выполнил в пакете, выберите/обновить/вставить/удалить в таблице, выбрать по seq и выполнить по определенному пользователю типу, следовательно, привилегии не были проблемой.Проблема связана с конфигурацией, где упомянутый максимальный размер курсора был действительно низким, что вызывало проблему в самой функции, узнайте об этом, удалив раздел обработки исключений из функции. – Abhi

+0

Да, но вы используете полностью квалифицированные ссылки на таблицы/объекты, например. 'schema.table_name' или неквалифицированные ссылки, например. 'Table_name'? В более позднем случае при доступе к той же схеме, которая владеет пакетом, тогда функция найдет объекты, на которые ссылаются, но при обращении к другой схеме она найдет только ссылки на объекты, если эта схема имеет локальный или глобальный синоним, указывающий на правильную объект или схема принадлежит объекту с тем же именем (и, надеюсь, такого же типа). Это часть утверждения 'AUTHID CURRENT_USER'. – Sentinel

Смежные вопросы