AXForum  
Go Back   AXForum > Microsoft Dynamics AX > DAX: База знаний и проекты
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Old 25.04.2007, 13:49   #1  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Join Date: 09.07.2002
Location: 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, Аксапта заполнила таблицу:
Click image for larger version

Name:	SysSRS.GIF
Views:	402
Size:	15.7 KB
ID:	2587

Представление PRODROUTETRANSWITHUSERIDS стало возвращать данные:
Click image for larger version

Name:	ViewProdRouteTrans.GIF
Views:	405
Size:	21.5 KB
ID:	2589

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

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

Last edited by EVGL; 25.04.2007 at 14:01.
This post has been rated by: belugin (9), Logger (5), gl00mie (4), driller (1).
Old 25.04.2007, 14:38   #2  
slava09 is offline
slava09
Участник
slava09's Avatar
MCBMSS
Дети Юза
1C
 
1,642 / 237 (11) ++++++
Join Date: 06.03.2003
Location: Украина, Киев
Я слышал, что в 5-ке RS будет поддерживать RLS
__________________
С уважением Шатохин Святослав.
This post has been rated by: belugin (5).
Old 26.04.2007, 10:39   #3  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
TasmanianDevil's Avatar
Злыдни
 
887 / 389 (14) ++++++
Join Date: 24.01.2005
Location: Томск
Quote:
Originally Posted by slava09 View Post
Я слышал, что в 5-ке RS будет поддерживать RLS
Интеграцией RLS в Active Directory ?
Old 26.04.2007, 10:55   #4  
George Nordic is offline
George Nordic
Модератор
George Nordic's Avatar
Злыдни
 
4,480 / 1255 (50) ++++++++
Join Date: 17.12.2003
Location: Moscow
Blog Entries: 9
ActiveDirectory - UserLogin - RLS - ReportServer.

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

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

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

 

Similar Threads
Thread Thread Starter Forum Replies Last Post
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

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 10:21.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.