ошибка в фильтре на представлени для параметра операции
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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   |
|
Полезность: Нет оценки
|
спасибо за науку!
получаются еще бОльшие костыли для простого с виду условия )
тогда обойдусь, придется запомнить, если нужно будет изменить алгоритм, что в нескольких местах править
ну или всё-таки вьюху запилю с таким столбцом, подумаю, как проще |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|