AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: База знаний и проекты
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.04.2007, 13:49   #1  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Интеграция с Reporting Services в 4.0, ужасы SysSRSTablePermissions
Хотел бы поделиться изысканиями с коллегами.

После часов настройки MS SQL 2005 Reporting Services я сумел сделать в Report Builder простенький отчет матричного вида, показывающий, сколько времени отработали рабочие в разбивке по станкам. Для отчета была сформирована модель SMDL с таблицей ProdRouteTrans из перспективы Production.

Запустив полученный отчет, я был неприятно раздосадован тем, что в нем стояли одни нули, хотя проводки в БД были на месте. Возникло подозрение, что модель SMDL использует не таблицы, а ссылается на какие-то специальные view. Кроме того, я сделал наблюдение, что модели экспортируются из DAX все за раз без учета компаний. Сам SMDL - это здоровенный файл XML, для которого я не нашел графического редактора. Тем не менее, фильтр по компании в SMDL определенно отсутствовал.

Запустив SQL Server Profiler, я выделил собственно запрос, который идет к базе данных (извините за немецкие имена, модель SMDL была экспортирована с языком de-at):
X++:
SET DATEFIRST 1
SELECT
    CAST(1 AS BIT) [c0_is_agg],
    CAST(1 AS BIT) [c1_is_agg],
    CAST(2 AS INT) [agg_row_count],
    [PRODROUTETRANSWITHUSERIDS].[SummeGutmenge_Sum] [SummeGutmenge_Sum],
    [PRODROUTETRANSWITHUSERIDS].[SummeStunden_Sum] [SummeStunden_Sum],
    [PRODROUTETRANSWITHUSERIDS].[Mitarbeiter] [Mitarbeiter],
    [PRODROUTETRANSWITHUSERIDS].[Ressource] [Ressource]
FROM
    (
        SELECT
            SUM([PRODROUTETRANSWITHUSERIDS].[QTYGOOD]) [SummeGutmenge_Sum],
            SUM([PRODROUTETRANSWITHUSERIDS].[HOURS]) [SummeStunden_Sum],
            [PRODROUTETRANSWITHUSERIDS].[EMPLID] [Mitarbeiter],
            [PRODROUTETRANSWITHUSERIDS].[WRKCTRID] [Ressource]
        FROM
            [DBO].[PRODROUTETRANSWITHUSERIDS] [PRODROUTETRANSWITHUSERIDS]
        WHERE
            [PRODROUTETRANSWITHUSERIDS].[WindowsID] = 'MF\evggla'
        GROUP BY
            [PRODROUTETRANSWITHUSERIDS].[EMPLID], [PRODROUTETRANSWITHUSERIDS].[WRKCTRID]
    ) [PRODROUTETRANSWITHUSERIDS]
ORDER BY
    [Mitarbeiter], [Ressource]
Из этого запроса видно: (1) обращение идет не к таблице ProdRouteTrans, а к представалению PRODROUTETRANSWITHUSERIDS; (2) нет фильтра по компании; (3) есть фильтр по пользователю Windows

Определение самого представления, автоматически сформированного Аксаптой в момент экспорта моделей, вызывает ужас:

X++:
SELECT     FINALLIST.WINDOWSID, dbo.PRODROUTETRANS.DATAAREAID, dbo.PRODROUTETRANS.RECVERSION, dbo.PRODROUTETRANS.RECID, 
                      CASE WHEN DBO.FIELDVISIBLE(FIELDMASKSTRING, 1) > 0 THEN PRODID ELSE NULL END AS PRODID, 
                      CASE WHEN DBO.FIELDVISIBLE(FIELDMASKSTRING, 2) > 0 THEN OPRNUM ELSE NULL END AS OPRNUM, 
                      CASE WHEN DBO.FIELDVISIBLE(FIELDMASKSTRING, 3) > 0 THEN JOBID ELSE NULL END AS JOBID, 
                      CASE WHEN DBO.FIELDVISIBLE(FIELDMASKSTRING, 4) > 0 THEN JOBTYPE ELSE NULL END AS JOBTYPE, 
 ...
FROM         (SELECT DISTINCT 
                                              USERDOMAINLIST.WINDOWSID, VIRTUALDOMAINLIST.COMPANY_ID, dbo.FIELDMASK(261, USERDOMAINLIST.USERINFO_USERID, 
                                              VIRTUALDOMAINLIST.COMPANY_ID) AS FIELDMASKSTRING, USERDOMAINLIST.USERINFO_USERID
                       FROM          (SELECT     dbo.VIRTUALDATAAREALIST.VIRTUALDATAAREA AS COMPANY_ID, dbo.COMPANYDOMAINLIST.DOMAINID
                                               FROM          dbo.VIRTUALDATAAREALIST INNER JOIN
                                                                      dbo.COMPANYDOMAINLIST ON dbo.COMPANYDOMAINLIST.COMPANYID = dbo.VIRTUALDATAAREALIST.ID
                                               WHERE      (dbo.VIRTUALDATAAREALIST.VIRTUALDATAAREA IN
                                                                          (SELECT     DATAAREAID
                                                                            FROM          dbo.PRODROUTETRANS))
                                               UNION
                                               SELECT     COMPANYID AS COMPANY_ID, DOMAINID
                                               FROM         dbo.COMPANYDOMAINLIST
                                               WHERE     (COMPANYID IN
                                                                         (SELECT     DATAAREAID
                                                                           FROM          dbo.PRODROUTETRANS))) AS VIRTUALDOMAINLIST INNER JOIN
                                                  (SELECT DISTINCT 
                                                                           dbo.WINDOWSID(dbo.USERINFO.NETWORKDOMAIN, dbo.USERINFO.NETWORKALIAS) AS WINDOWSID, TPERMS.DOMAINID, 
                                                                           dbo.USERGROUPLIST.GROUPID, dbo.USERINFO.ID AS USERINFO_USERID
                                                    FROM          dbo.USERGROUPLIST INNER JOIN
                                                                           dbo.USERINFO ON dbo.USERINFO.ID = dbo.USERGROUPLIST.USERID AND dbo.USERINFO.ENABLE = 1 INNER JOIN
                                                                               (SELECT     DOMAINID, GROUPID
                                                                                 FROM          dbo.SYSSRSTABLEPERMISSIONS AS A
                                                                                 WHERE      (TABID = 261)) AS TPERMS ON dbo.USERGROUPLIST.GROUPID = TPERMS.GROUPID OR 
                                                                           dbo.USERGROUPLIST.GROUPID = 'ADMIN') AS USERDOMAINLIST ON 
                                              USERDOMAINLIST.DOMAINID = VIRTUALDOMAINLIST.DOMAINID OR VIRTUALDOMAINLIST.DOMAINID = 'ADMIN' AND 
                                              USERDOMAINLIST.GROUPID = 'ADMIN') AS FINALLIST INNER JOIN
                      dbo.PRODROUTETRANS ON dbo.PRODROUTETRANS.DATAAREAID = FINALLIST.COMPANY_ID
Ключевая таблица здесь - это SYSSRSTABLEPERMISSIONS, которая была пустой! Неудивительно, что запрос не возвращал данных.

Системная для Аксапта таблица SYSSRSTABLEPERMISSIONS содержит представление всех прав доступа к полям и таблицам в Аксапта в разрезе доменов и групп. При этом таблица строится в методе Classes\xAccessRightsList\saveSecurityRights при принудительном задании прав доступа. Поскольку мой пользователь "MF\evggla" принадлежал только группе Admin, для этой группы в таблице записей не было.

После того, как я создал новую группу пользователей Test, Аксапта заполнила таблицу:
Нажмите на изображение для увеличения
Название: SysSRS.GIF
Просмотров: 392
Размер:	15.7 Кб
ID:	2587

Представление PRODROUTETRANSWITHUSERIDS стало возвращать данные:
Нажмите на изображение для увеличения
Название: ViewProdRouteTrans.GIF
Просмотров: 403
Размер:	21.5 Кб
ID:	2589

Отчет выдал результаты... просуммированные по всем компаниям в базе.

Выводы:
  1. DAX пытается вынудить Reporting Services учитывать собственные права доступа
  2. Если пользователь принадлежит только группе Admin, он не видит ничего
  3. Если вы создали новое поле, то данные не будут показаны даже при условии, что модели SMDL экспортированы заново, поскольку таблица SYSSRSTABLEPERMISSIONS не обновлена
  4. Если пользователь имеет права на домен, в который входит несколько компаний, отчеты показывают по умолчанию суммы по всем компаниям
  5. Если это так, то предотвратить это можно фильтром по компании в самом отчете
  6. Становится более понятно, почему пользователи DAX обязательно должны соответствовать пользователям Windows
  7. Reporting Services - это еще один способ обойти RLS

Последний раз редактировалось EVGL; 25.04.2007 в 14:01.
За это сообщение автора поблагодарили: belugin (9), Logger (5), gl00mie (4), driller (1).
Старый 25.04.2007, 14:38   #2  
slava09 is offline
slava09
Участник
Аватар для slava09
MCBMSS
Дети Юза
1C
 
1,642 / 237 (11) ++++++
Регистрация: 06.03.2003
Адрес: Украина, Киев
Я слышал, что в 5-ке RS будет поддерживать RLS
__________________
С уважением Шатохин Святослав.
За это сообщение автора поблагодарили: belugin (5).
Старый 26.04.2007, 10:39   #3  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Цитата:
Сообщение от slava09 Посмотреть сообщение
Я слышал, что в 5-ке RS будет поддерживать RLS
Интеграцией RLS в Active Directory ?
Старый 26.04.2007, 10:55   #4  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
ActiveDirectory - UserLogin - RLS - ReportServer.

Я видел - работает. Изумлению моему не было предела. Обещают в 5ке. И настройки OLAP-кубов больше не будет - определение куба будет в "перспективах", т.е. настройка куба - это модификация. Не знаю, оставят ди эту концепцию в 5ке.

С Уважением,
Георгий
За это сообщение автора поблагодарили: belugin (5).
Старый 26.04.2007, 11:14   #5  
Recoilme is offline
Recoilme
злыдень
Аватар для Recoilme
Злыдни
 
895 / 192 (8) ++++++
Регистрация: 18.06.2003
А я дурак, не стал в свое время париться, пытаться нарисовать и продавать набор внешних отчетов на reporting services для аксапта. Подумал в майкрософт все сами сделают по уму и мега круто ))
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/
Старый 26.04.2007, 11:22   #6  
Recoilme is offline
Recoilme
злыдень
Аватар для Recoilme
Злыдни
 
895 / 192 (8) ++++++
Регистрация: 18.06.2003
Цитата:
Сообщение от George Nordic Посмотреть сообщение
И настройки OLAP-кубов больше не будет - определение куба будет в "перспективах", т.е. настройка куба - это модификация.
??? а что такое "перспектива"
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/
Старый 26.04.2007, 11:31   #7  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
В 4ке. DataDictionary - Perspectives
Старый 26.04.2007, 12:49   #8  
slava09 is offline
slava09
Участник
Аватар для slava09
MCBMSS
Дети Юза
1C
 
1,642 / 237 (11) ++++++
Регистрация: 06.03.2003
Адрес: Украина, Киев
Цитата:
Сообщение от George Nordic Посмотреть сообщение
В 4ке. DataDictionary - Perspectives
Во дела. А я перепутал с OLAP2005ми Perspectives, которые витрины данных. Кстати, интересная штука.
__________________
С уважением Шатохин Святослав.
Старый 26.04.2007, 12:49   #9  
slava09 is offline
slava09
Участник
Аватар для slava09
MCBMSS
Дети Юза
1C
 
1,642 / 237 (11) ++++++
Регистрация: 06.03.2003
Адрес: Украина, Киев
Цитата:
Сообщение от Recoilme Посмотреть сообщение
А я дурак, не стал в свое время париться, пытаться нарисовать и продавать набор внешних отчетов на reporting services для аксапта. Подумал в майкрософт все сами сделают по уму и мега круто ))
Ну и зря.
__________________
С уважением Шатохин Святослав.
Старый 03.05.2007, 09:46   #10  
sharp is offline
sharp
Участник
 
41 / 16 (1) ++
Регистрация: 22.12.2006
Прошу прощение за некоторое отклонение от темы, но возникала ли у кого-нибудь следующая ошибка при обработке отчета:

Не удалось выполнить запрос для набора данных "dataSet".
Выполнение семантического запроса завершилось с ошибкой. Invalid object name 'DBO.<имя таблицы дайнамикс>WITHUSERIDS'.
Старый 07.05.2007, 16:37   #11  
slava09 is offline
slava09
Участник
Аватар для slava09
MCBMSS
Дети Юза
1C
 
1,642 / 237 (11) ++++++
Регистрация: 06.03.2003
Адрес: Украина, Киев
Попробуйте из КвериАнализера обратится к этой таблице, так как обращается RS
__________________
С уважением Шатохин Святослав.
Старый 08.05.2007, 08:17   #12  
sharp is offline
sharp
Участник
 
41 / 16 (1) ++
Регистрация: 22.12.2006
Цитата:
Сообщение от slava09 Посмотреть сообщение
Попробуйте из КвериАнализера обратится к этой таблице, так как обращается RS
Проблема решена. Ошибка была в строке подключения.
Теги
интеграция, полезное, ax4.0, reporting services

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
msdynamicsax: Make the role centers work with Reporting Services Blog bot DAX Blogs 0 15.08.2008 11:05
gatesasbait: Installing Reporting Services, Analysis Services and Enterprise Portal for AX 2009 Blog bot DAX Blogs 0 03.07.2008 02:05
Arijit Basu: Microsoft SQL Server Reporting Services Integration Blog bot DAX Blogs 0 20.07.2007 11:50
casperkamal: SQL Reporting Services for Dynamics Ax 4.0 Blog bot DAX Blogs 0 12.03.2007 21:30
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:06.