CftClub.ru
Клуб специалистов ЦФТ-Банк

ошибка в фильтре на представлени для параметра операции

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Уроки ЦФТ-Банк для начинающих
Предыдущая тема :: Следующая тема  
Автор Сообщение
alx
Участник - экстремал


Вступление в Клуб: 29.06.2007
СообщениеЧт Окт 30, 2014 20:58   ошибка в фильтре на представлени для параметра операции Ответить с цитатой
Полезность: Нет оценки
Коллеги, уперся в такой затык:

В параметре операции используется представление для выбора экземпляра в поле на ЭФО и есть условие на него, в нем указываю вызов функции из библиотеки, параметром передаю ID из представления, а возвращаемый результат сравниваю с нужным значением

Z$SPR_OBJ_TMC_LIB.group_is(ID) = 'Нужное значение'

То есть по каждой строке вью эта функция вернёт какой-то свой результат. При тестировании IBS-ом работает, а пользователю выдается ошибка:

ORA-00904: : недопустимый идентификатор
SELECT /*+ FIRST_ROWS(1) */ ID, CLASS_ID, C_1, C_2, C_3, REF3, C_4, REF4, C_5, REF5, C_6, C_7, C_8, REF8, C_9, REF9, C_10, C_11, C_12, C_13, C_14, C_15, C_16, C_17, C_18, C_19, TO_CHAR(C_20) C_20, C_21, REF21, TO_CHAR(C_22) C_22, C_23, REF23, C_24, REF24, U_1, U_2, U_3 FROM $$$.VW_CRIT_TMC_GRUP_USER WHERE (Z$SPR_OBJ_TMC_LIB.group_is(ID) = 'Нужное значение') AND (ROWNUM <= ?) ORDER BY C_1

Если к данному представлению добавить столбец с таким же вызовом,
Z$SPR_OBJ_TMC_LIB.group_is(ID)
то и у пользователя работает, но не хочу трогать представление. Есть ли вариант решения такой хотелки, и что для IBS в этой ситуации отработало, а для простого операциониста - нет? Может быть в таком варианте использования фильтра есть явный косяк с моей стороны или в ядре ограничение, поэтому ошибка.

Доступ на библиотеку был дан, не помогло. Добавил в вызов схему IBS.

IBS.Z$SPR_OBJ_TMC_LIB.group_is(ID) тоже не помогло.

Объясню, почему так хочется - чтобы держать логику вычисления значения только в одном месте - в библиотеке, и не раскидывать по условиям фильтров в нескольких параметрах и операциях. В представлении уже есть какие-то свои ограничения на выборку, поэтому удобно его использовать, а уже по нему дополнительно прогнать свои вычисления. К тому же эта же функция из библиотеки вызывается и нормально работает у пользователей из других операций, но в теле.
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеПт Окт 31, 2014 06:04   Re: ошибка в фильтре на представлени для параметра операции Ответить с цитатой
Полезность: Нет оценки
alx пишет:
Коллеги, уперся в такой затык:

В параметре операции используется представление для выбора экземпляра в поле на ЭФО и есть условие на него, в нем указываю вызов функции из библиотеки, параметром передаю ID из представления, а возвращаемый результат сравниваю с нужным значением

Z$SPR_OBJ_TMC_LIB.group_is(ID) = 'Нужное значение'

То есть по каждой строке вью эта функция вернёт какой-то свой результат. При тестировании IBS-ом работает, а пользователю выдается ошибка:

ORA-00904: : недопустимый идентификатор
SELECT /*+ FIRST_ROWS(1) */ ID, CLASS_ID, C_1, C_2, C_3, REF3, C_4, REF4, C_5, REF5, C_6, C_7, C_8, REF8, C_9, REF9, C_10, C_11, C_12, C_13, C_14, C_15, C_16, C_17, C_18, C_19, TO_CHAR(C_20) C_20, C_21, REF21, TO_CHAR(C_22) C_22, C_23, REF23, C_24, REF24, U_1, U_2, U_3 FROM $$$.VW_CRIT_TMC_GRUP_USER WHERE (Z$SPR_OBJ_TMC_LIB.group_is(ID) = 'Нужное значение') AND (ROWNUM <= ?) ORDER BY C_1

Если к данному представлению добавить столбец с таким же вызовом,
Z$SPR_OBJ_TMC_LIB.group_is(ID)
то и у пользователя работает, но не хочу трогать представление. Есть ли вариант решения такой хотелки, и что для IBS в этой ситуации отработало, а для простого операциониста - нет? Может быть в таком варианте использования фильтра есть явный косяк с моей стороны или в ядре ограничение, поэтому ошибка.

Доступ на библиотеку был дан, не помогло. Добавил в вызов схему IBS.

IBS.Z$SPR_OBJ_TMC_LIB.group_is(ID) тоже не помогло.

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


Просто запомни.
То, что ты видишь под владельцем схемы, скорее всего, не увидишь под любым другим пользователем.

Под владельцем видны:
- представления
- таблицы
- пакеты операций
- пакеты интерфейсных пакетов к таблицам
- пакеты интерфейсных пакетов к операциям (за исключением библиотечных)

под любым другим видны только:
- представления
- пакеты интерфейсных пакетов к операциям (за исключением библиотечных)

И всё.

Любой вызов любой операции из АРМ Навигатор - на самом деле - вызов интерфейсного пакета к операции. Что-то типа U$12345.p();

поэтому твой вызов Z$SPR_OBJ_TMC_LIB.group_is(ID), к сожалению, не валиден. В операциях, скомпилированных под владельцем схемы, всё, что скомпилировано, имеет права владельца. А в данном случае формируется динамический SQL-запрос, и операция, естественно, не видна.

Пути решения следущие:
1. ты делаешь пакет (oracle) под владельцем, в котором делаешь функцию group_is, в которой делаешь перевызов Z$SPR_OBJ_TMC_LIB.group_is(), пакет используешь в фильтре, на пакет раздаёшь гранты нужному пользователю.

2. Ты делаешь ещё одно представление (RPT), в котором в полях описываешь id и посчитанный результат Z$SPR_OBJ_TMC_LIB.group_is, а в фильтре ставишь что-то типа
and (select p.group_is from VW_RPT_ p where p.id = id) = 'Значение'

3. можно придумать ещё.
alx
Участник - экстремал


Вступление в Клуб: 29.06.2007
СообщениеПт Окт 31, 2014 15:33    Ответить с цитатой
Полезность: Нет оценки
спасибо за науку!
получаются еще бОльшие костыли для простого с виду условия )
тогда обойдусь, придется запомнить, если нужно будет изменить алгоритм, что в нескольких местах править
ну или всё-таки вьюху запилю с таким столбцом, подумаю, как проще
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Уроки ЦФТ-Банк для начинающих Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru