0

Я работаю с службами Dynamics CRM 2015 и SQL Server Reporting Services. Моя задача - создать отчет для пользователей, имеющих определенную роль безопасности.Проверить имя пользователя userId и использовать это значение из запроса

В моем отчете приведены несколько параметров. Мне нужно убедиться, что пользователь, не имеющий требуемой роли безопасности, не имеет доступа к параметрам отчета.

Если я пытаюсь создать параметр со значением по умолчанию =User!UserID я получаю следующее сообщение об ошибке:

"NT AUTHORITY\NETWORK SERVICE" - it is not a user id.

  1. Как я могу найти звонившего идентификатор пользователя?
  2. Как создать запрос, возвращающий параметры только в том случае, если вызывающий пользователь имеет роль безопасности? Я знаю SQL, но я никогда не пишу таких запросов.
+0

Пользователя, который запрашивает отчет ReportServer не то же самое, которое Входы во всех случаях для базы данных SQL. Чтобы войти в Sql Server, вы можете олицетворять пользователя, использовать проверку подлинности Windows или запрашивать учетные данные. 'User! UserID' возвращает пользователя, который запрашивает отчет. –

ответ

1

При разработке отчета на основе SQL вы можете использовать следующий SQL скрипт, чтобы получить идентификатор текущего пользователя:

dbo.fn_FindUserGuid() 

Если вы разрабатываете FetchXml отчеты на основе вы должны будете использовать запрос похож на следующий, чтобы получить его :

<fetch version="1.0" output-format="xml-platform" 
     mapping="logical" distinct="false"> 
    <entity name="systemuser"> 
     <attribute name="fullname" /> 
     <attribute name="systemuserid" /> 
     <order attribute="fullname" descending="false" /> 
     <filter type="and"> 
     <condition attribute="systemuserid" 
        operator="eq-userid" /> 
     </filter> 
    </entity> 
</fetch> 
0

Спасибо всем! С вашей помощью я сделал целевую SQL скрипт, что делать мою задачу:

SELECT new_name, new_practiceId 
FROM new_practiceBase 
WHERE EXISTS 
     (
     SELECT * 
     FROM SystemUserRoles R 
     JOIN RoleBase RB ON R.roleid=RB.roleid 
     WHERE R.SystemUserId=dbo.fn_FindUserGuid() 
     AND RB.name IN('Руководитель практики','Управляющий партнер') 
    ); 

полный запрос, который создал дизайнер запросов:

SELECT  new_name, new_practiceId 
FROM   new_practiceBase 
WHERE  EXISTS 
          (SELECT  R.SystemUserId, R.RoleId, R.SystemUserRoleId, R.VersionNumber, RB.RoleId AS Expr1, RB.RoleTemplateId, RB.OrganizationId, RB.Name, RB.BusinessUnitId, RB.CreatedOn, RB.ModifiedOn, 
                 RB.CreatedBy, RB.VersionNumber AS Expr2, RB.ModifiedBy, RB.ParentRoleId, RB.OverriddenCreatedOn, RB.ImportSequenceNumber, RB.IsManaged, RB.CreatedOnBehalfBy, RB.ComponentState, 
                 RB.RoleIdUnique, RB.SolutionId, RB.OverwriteTime, RB.ModifiedOnBehalfBy, RB.IsCustomizable, RB.SupportingSolutionId, RB.ParentRootRoleId 
           FROM   SystemUserRoles AS R INNER JOIN 
                 RoleBase AS RB ON R.RoleId = RB.RoleId 
           WHERE  (R.SystemUserId = dbo.fn_FindUserGuid()) AND (RB.Name IN ('Руководитель практики', 'Управляющий партнер'))) 
Смежные вопросы