|
09.02.2010, 12:11 | #1 |
Участник
|
Что делает RLS с связанными запросами в отчете
Доброго времени суток всем.
Столкнулся с проблемой RLS. Имеется простой отчет, в ds у которого указан query по таблице CustTable. По этой таблице есть ограничения по RLS. В initQuery записано: X++: qbds.addRange(fieldnum(CustInvoiceTable, RecId)).value(queryValue(_recId)); до применения RLS было вот так: Код: SELECT * FROM CustInvoiceTable WHERE ((RecId = 5637168581)) JOIN * FROM CustInvoiceLine WHERE CustInvoiceTable.RecId = CustInvoiceLine.ParentRecId Код: SELECT * FROM CustInvoiceTable WHERE ((((5637168581) ...... DAX 4.0 |
|
09.02.2010, 14:46 | #2 |
Участник
|
Че-то не очень ясно пока, где что.
РЛС на КастТабле? Из нее строится подзапрос через отдельную кверю? РЛС работает как фильтр записей, их как будто нет в таблице, на другую логику не влияет. То есть, если в КастТабл 10 записей, а после РЛС 2, то отработает по двум Нужно видеть, код, и к чему применен метод использования РЛС (для квери он по умолчанию вкл, для селекта выкл - есть методы вкл/выкл) |
|
09.02.2010, 17:11 | #3 |
Участник
|
Да.
Цитата:
Из нее строится подзапрос через отдельную кверю?
Главное, что при инициализации отчета на CustTable накладывается Range программным путём. RecId для значения берется из аргументов отчета: X++: qbds = this.query().datasourceTable(TableNum(CustInvoiceTable)); qbds.addRange(fieldnum(CustInvoiceTable, RecId)).value(queryValue(_recId)); Цитата:
РЛС работает как фильтр записей, их как будто нет в таблице, на другую логику не влияет.
То есть, если в КастТабл 10 записей, а после РЛС 2, то отработает по двум Цитата:
Нужно видеть, код, и к чему применен метод использования РЛС
Цитата:
(для квери он по умолчанию вкл, для селекта выкл - есть методы вкл/выкл)
Где покопать? Последний раз редактировалось Prophetic; 09.02.2010 в 17:19. |
|
09.02.2010, 18:49 | #4 |
Участник
|
Это стандартный отчет? Он с карточки клиента вызывается?
Как связан клиент с таблицей накладных по рекид? (с чего эта связь вообще есть) Если РЛС на клиента и он виден, то в отчет попадут все строки по нему, на накладных же нет рлс? Куда копать - вырубить рлс, проверить, что без него все ок Изучить состав рлса - там может быть чит, когда на рекИд вешают условие по ИЛИ, потому РекИд и перекрыт |
|
|
За это сообщение автора поблагодарили: Prophetic (1). |
11.02.2010, 14:16 | #5 |
Участник
|
Цитата:
Сообщение от BOAL
Это стандартный отчет? Он с карточки клиента вызывается?
Как связан клиент с таблицей накладных по рекид? (с чего эта связь вообще есть) Если РЛС на клиента и он виден, то в отчет попадут все строки по нему, на накладных же нет рлс? Куда копать - вырубить рлс, проверить, что без него все ок Изучить состав рлса - там может быть чит, когда на рекИд вешают условие по ИЛИ, потому РекИд и перекрыт Если RLS не включено, то все работает. Вот как выглядит запрос после применения RLS (я еще добавил пустой Range в Query запроса, а в методе init добавляется значение этого Range): X++: SELECT * FROM CustInvoiceTable WHERE (((CustInvoiceTable.JuridicalPersonId!="XXXXXXXX") && (CustInvoiceTable.JuridicalPersonId!="XXXXXXXX")) OR (RecId = 5637147356)) JOIN * FROM CustInvoiceLine WHERE CustInvoiceTable.RecId = CustInvoiceLine.ParentRecId |
|
12.02.2010, 09:46 | #6 |
Участник
|
нет у меня общего понимания все равно.
нет исходного кода, который генерит этот запрос в итоге, нет запроса самого РЛС, чтоб понять, чему и как он мешает. Я обычно проверяю не просмотром запроса в переводе для сиквела, а просмотром самой Квери (в виде дерева запроса). |
|
12.02.2010, 10:56 | #7 |
Участник
|
я так понимаю не устраивает вас то, что к условиям RLS на JuridicalPersonId ваше условие на RecId добавилось через OR. По логики, нужно бы через AND. Так?
1) Почему это произошло? По всей видимости для реализации RLS, система использует расширенный синтаксис задания range, причём добаляет это условие в range по RecId. Т.е когда вы добавляете своё собственно условие на RecId, в нём уже сидит условие от RLS. Но дело в том, что если последовательно добавлять range на одно и тоже поле, то условия будут добавляться через ИЛИ. Так устроен range. 2) Что делать? Можно попробовать следующее: Вариант №1. Для позиционирования на нужной записи использовать какой-нибудь другой ключ, не RecId. Вариант №2. Для добавления своего условия по RecId использовать расширенный синтаксис, но добавлять это условие не на RecId, а на какое-нибудь другое поле. Вариант №3. Для добавления своего условия по RecId не добавлять новый range, а изменить существующий. Те вместо addRange использовать findRange. P.S.: Опередили |
|
|
За это сообщение автора поблагодарили: Prophetic (1). |
12.02.2010, 10:43 | #8 |
Administrator
|
Итак, по пунктам.
1. Берем чела, у которого нет в правах рлса (Admin). Он смотрит отчет - у него должно все быть как надо (проверка на то, что нет проблем в самом отчете) 2. Берем чела, которого есть RLS и у которого есть проблемы в отчете. Смотрим запрос в RLS и запрос в отчете. Исходя из правила: - 2 Range, наложенных на одно и тоже поле дают условие по ИЛИ - 2 Range, наложенных на разные поля дают условие по И в результирующем запросе, который будет отправлен в БД - делаем выводы - что у нас наложилось. 3. В вашем случае смотрим RLS на таблицу CustInvoiceTable по полям JuridicalPersonId и RecId. Если RLS по какому-то из этих полей наложен, то в результате у Вас выполнится условие ИЛИ - по значению из RLS и по значению из кода
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: Prophetic (1). |