Я начинаю с предоставления пользователям домена доступа к домашней странице сервера отчетов.
Затем я создаю новые роли в SQL Server Management studio, SSMS.После открытия SSMS нажмите «Подключиться» и выберите «Службы отчетов…»
Введите имя своего сервера и информацию для входа в систему, а затем нажмите «Подключиться».
После подключения к серверу отчетов откройте папку безопасности, щелкните правой кнопкой мыши «Роли» и выберите «Новая роль ...»
Я создал 2 новые роли («Группа обозревателя», «Функциональный владелец») с тем же разрешением, что и «Браузер».
Functional Owner
- кто утверждает доступ к папке отчета Browser Group
- у кого есть доступ к отчетам по папке
Затем в диспетчере отчетов щелкните стрелку вниз для папки и выберите «Безопасность»
Затем нажмите«Назначение новой роли»
Затем введите группу Active Directory или адрес электронной почты и проверьте созданную вами новую роль.
Затем можно запросить разрешения на сервере и показать их в отчете.(используйте служебную учетную запись для запуска отчета).Я развертываю отчет в корневом каталоге на сервере отчетов и называю его .How to get access to a report folder
.Я включаю "."в начале имени отчета сортировать по началу.
Отчет SQL
;WITH
nonreport_folders
AS
(
SELECT tbl.* FROM (VALUES
( 'Images')
, ( 'SharedDataSets')
, ( 'Data Sources')
, ( '')
) tbl ([FolderName])
)
,
user_list
AS
(
SELECT
usr.[UserID]
, usr.[UserName]
, [UserNameFormat] =
CASE
WHEN CHARINDEX('\', usr.[UserName]) > 0 THEN UPPER(SUBSTRING(usr.[UserName] ,CHARINDEX('\', usr.[UserName]) + 1, LEN(usr.[UserName])))
ELSE usr.[UserName]
END
FROM
dbo.[Users] AS usr
)
,
reporting_roles
AS
(
SELECT
cat.[Name]
, rol.[RoleName]
, usr.[UserNameFormat]
FROM
dbo.[Catalog] AS cat
LEFT JOIN dbo.[PolicyUserRole] AS urol ON urol.[PolicyID] = cat.[PolicyID]
LEFT JOIN dbo.[Roles] AS rol ON urol.[RoleID] = rol.[RoleID]
LEFT JOIN dbo.[Policies] AS pol ON urol.[PolicyID] = pol.[PolicyID]
LEFT JOIN user_list AS usr ON urol.[UserID] = usr.[UserID]
LEFT JOIN nonreport_folders AS nrf ON nrf.[FolderName] = cat.[Name]
WHERE
1=1
AND cat.[Type] = 1
AND nrf.[FolderName] IS NULL
)
SELECT *
FROM (
SELECT DISTINCT
[FolderName] = rpt.[Name]
, [UserNameFormat] = STUFF((SELECT '; ' + rol.UserNameFormat FROM reporting_roles rol WHERE rol.[RoleName] = rpt.[RoleName] AND rol.[Name] = rpt.[Name] FOR XML PATH('')),1,1,'')
, [RoleName]
FROM
reporting_roles AS rpt
) as s
PIVOT
(
MAX([UserNameFormat])
FOR [RoleName] IN ([Browser Group], [Functional Owner])
)AS pvt ORDER BY 1
В отчете также можно создать гиперссылку для создания электронного письма для запроса доступа к каждой папке.,Вы можете включить сообщение для службы поддержки, для которой группа Active Directory нужна пользователю, на основе роли «Группа обозревателя» и cc «Функциональный владелец» для утверждения.Я бы также использовал параметр для электронной почты службы поддержки.
Пример отчета
Отчет XML
<?xml version="1.0" encoding="utf-8"?>
<Report MustUnderstand="df" xmlns="http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner" xmlns:df="http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition/defaultfontfamily">
<Description>A list of report folders with permission groups and function owners</Description>
<df:DefaultFontFamily>Segoe UI</df:DefaultFontFamily>
<Author>Anthony Duguid</Author>
<AutoRefresh>0</AutoRefresh>
<DataSources>
<DataSource Name="ReportServer">
<ConnectionProperties>
<DataProvider>SQL</DataProvider>
<ConnectString>Data Source=YourServerName;Initial Catalog=ReportServer</ConnectString>
<IntegratedSecurity>true</IntegratedSecurity>
</ConnectionProperties>
<rd:SecurityType>Integrated</rd:SecurityType>
<rd:DataSourceID>2ff706bc-1b72-4676-bb2a-10cc2737189c</rd:DataSourceID>
</DataSource>
</DataSources>
<DataSets>
<DataSet Name="FolderPermissions">
<Query>
<DataSourceName>ReportServer</DataSourceName>
<CommandText>;WITH
nonreport_folders
AS
(
SELECT tbl.* FROM (VALUES
( 'Images')
, ( 'SharedDataSets')
, ( 'Data Sources')
, ( '')
) tbl ([FolderName])
)
,
user_list
AS
(
SELECT
usr.[UserID]
, usr.[UserName]
, [UserNameFormat] =
CASE
WHEN CHARINDEX('\', usr.[UserName]) > 0 THEN UPPER(SUBSTRING(usr.[UserName] ,CHARINDEX('\', usr.[UserName]) + 1, LEN(usr.[UserName])))
ELSE usr.[UserName]
END
FROM
dbo.[Users] AS usr
)
,
reporting_roles
AS
(
SELECT
cat.[Name]
, rol.[RoleName]
, usr.[UserNameFormat]
FROM
dbo.[Catalog] AS cat
LEFT JOIN dbo.[PolicyUserRole] AS urol ON urol.[PolicyID] = cat.[PolicyID]
LEFT JOIN dbo.[Roles] AS rol ON urol.[RoleID] = rol.[RoleID]
LEFT JOIN dbo.[Policies] AS pol ON urol.[PolicyID] = pol.[PolicyID]
LEFT JOIN user_list AS usr ON urol.[UserID] = usr.[UserID]
LEFT JOIN nonreport_folders AS nrf ON nrf.[FolderName] = cat.[Name]
WHERE
1=1
AND cat.[Type] = 1
AND nrf.[FolderName] IS NULL
)
SELECT *
FROM (
SELECT DISTINCT
[FolderName] = rpt.[Name]
, [UserNameFormat] = STUFF((SELECT '; ' + rol.UserNameFormat FROM reporting_roles rol WHERE rol.[RoleName] = rpt.[RoleName] AND rol.[Name] = rpt.[Name] FOR XML PATH('')),1,1,'')
, [RoleName]
FROM
reporting_roles AS rpt
) as s
PIVOT
(
MAX([UserNameFormat])
FOR [RoleName] IN ([Browser Group], [Functional Owner])
)AS pvt ORDER BY 1</CommandText>
</Query>
<Fields>
<Field Name="FolderName">
<DataField>FolderName</DataField>
<rd:TypeName>System.String</rd:TypeName>
</Field>
<Field Name="Browser_Group">
<DataField>Browser Group</DataField>
<rd:TypeName>System.String</rd:TypeName>
</Field>
<Field Name="Functional_Owner">
<DataField>Functional Owner</DataField>
<rd:TypeName>System.String</rd:TypeName>
</Field>
</Fields>
</DataSet>
</DataSets>
<ReportSections>
<ReportSection>
<Body>
<ReportItems>
<Tablix Name="Tablix1">
<TablixBody>
<TablixColumns>
<TablixColumn>
<Width>0.6cm</Width>
</TablixColumn>
<TablixColumn>
<Width>5.5cm</Width>
</TablixColumn>
<TablixColumn>
<Width>7.39208cm</Width>
</TablixColumn>
<TablixColumn>
<Width>6.49521cm</Width>
</TablixColumn>
</TablixColumns>
<TablixRows>
<TablixRow>
<Height>0.6cm</Height>
<TablixCells>
<TablixCell>
<CellContents>
<Textbox Name="Textbox24">
<CanGrow>true</CanGrow>
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value />
<Style>
<FontFamily>Arial</FontFamily>
</Style>
</TextRun>
</TextRuns>
<Style />
</Paragraph>
</Paragraphs>
<rd:DefaultName>Textbox23</rd:DefaultName>
<Style>
<Border>
<Color>LightGrey</Color>
<Style>Solid</Style>
</Border>
<PaddingLeft>2pt</PaddingLeft>
<PaddingRight>2pt</PaddingRight>
<PaddingTop>2pt</PaddingTop>
<PaddingBottom>2pt</PaddingBottom>
</Style>
</Textbox>
</CellContents>
</TablixCell>
<TablixCell>
<CellContents>
<Textbox Name="Textbox25">
<CanGrow>true</CanGrow>
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value>Folder Name</Value>
<Style>
<FontFamily>Calibri</FontFamily>
</Style>
</TextRun>
</TextRuns>
<Style />
</Paragraph>
</Paragraphs>
<rd:DefaultName>Textbox22</rd:DefaultName>
<Style>
<Border>
<Color>LightGrey</Color>
<Style>Solid</Style>
</Border>
<PaddingLeft>2pt</PaddingLeft>
<PaddingRight>2pt</PaddingRight>
<PaddingTop>2pt</PaddingTop>
<PaddingBottom>2pt</PaddingBottom>
</Style>
</Textbox>
</CellContents>
</TablixCell>
<TablixCell>
<CellContents>
<Textbox Name="RoleName2">
<CanGrow>true</CanGrow>
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value>Group</Value>
<Style>
<FontFamily>Calibri</FontFamily>
</Style>
</TextRun>
</TextRuns>
<Style />
</Paragraph>
</Paragraphs>
<rd:DefaultName>RoleName</rd:DefaultName>
<Style>
<Border>
<Color>LightGrey</Color>
<Style>Solid</Style>
</Border>
<PaddingLeft>2pt</PaddingLeft>
<PaddingRight>2pt</PaddingRight>
<PaddingTop>2pt</PaddingTop>
<PaddingBottom>2pt</PaddingBottom>
</Style>
</Textbox>
</CellContents>
</TablixCell>
<TablixCell>
<CellContents>
<Textbox Name="Textbox12">
<CanGrow>true</CanGrow>
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value>Owner</Value>
<Style>
<FontFamily>Calibri</FontFamily>
</Style>
</TextRun>
</TextRuns>
<Style />
</Paragraph>
</Paragraphs>
<rd:DefaultName>Textbox12</rd:DefaultName>
<Style>
<Border>
<Color>LightGrey</Color>
<Style>Solid</Style>
</Border>
<PaddingLeft>2pt</PaddingLeft>
<PaddingRight>2pt</PaddingRight>
<PaddingTop>2pt</PaddingTop>
<PaddingBottom>2pt</PaddingBottom>
</Style>
</Textbox>
</CellContents>
</TablixCell>
</TablixCells>
</TablixRow>
<TablixRow>
<Height>0.6cm</Height>
<TablixCells>
<TablixCell>
<CellContents>
<Image Name="image10">
<Source>Embedded</Source>
<Value>email</Value>
<Sizing>Clip</Sizing>
<ActionInfo>
<Actions>
<Action>
<Hyperlink>="mailto:" & Parameters!HelpDeskEmail.Value & "?subject=Access to report folder: " & Fields!FolderName.Value & "&cc=" & Fields!Functional_Owner.Value & "&body=I would like access to the report folder. Please add me to the following Active Directory group: " & Fields!Browser_Group.Value</Hyperlink>
</Action>
</Actions>
</ActionInfo>
<ToolTip>request access to report folder</ToolTip>
<Style>
<Border>
<Style>None</Style>
<Width>0.5pt</Width>
</Border>
<PaddingLeft>1.5pt</PaddingLeft>
<PaddingTop>1.5pt</PaddingTop>
</Style>
</Image>
</CellContents>
</TablixCell>
<TablixCell>
<CellContents>
<Textbox Name="FolderName2">
<CanGrow>true</CanGrow>
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value>=Fields!FolderName.Value</Value>
<Style>
<FontFamily>Calibri</FontFamily>
</Style>
</TextRun>
</TextRuns>
<Style />
</Paragraph>
</Paragraphs>
<rd:DefaultName>FolderName</rd:DefaultName>
<Style>
<Border>
<Color>LightGrey</Color>
<Style>Solid</Style>
</Border>
<PaddingLeft>2pt</PaddingLeft>
<PaddingRight>2pt</PaddingRight>
<PaddingTop>2pt</PaddingTop>
<PaddingBottom>2pt</PaddingBottom>
</Style>
</Textbox>
</CellContents>
</TablixCell>
<TablixCell>
<CellContents>
<Textbox Name="txtRoleName2">
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value>=Fields!Browser_Group.Value</Value>
<Style>
<FontFamily>Calibri</FontFamily>
</Style>
</TextRun>
</TextRuns>
<Style />
</Paragraph>
</Paragraphs>
<Style>
<Border>
<Color>LightGrey</Color>
<Style>Solid</Style>
</Border>
<PaddingLeft>2pt</PaddingLeft>
<PaddingRight>2pt</PaddingRight>
<PaddingTop>2pt</PaddingTop>
<PaddingBottom>2pt</PaddingBottom>
</Style>
</Textbox>
</CellContents>
</TablixCell>
<TablixCell>
<CellContents>
<Textbox Name="Functional_Owner">
<CanGrow>true</CanGrow>
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value>=Fields!Functional_Owner.Value</Value>
<Style>
<FontFamily>Calibri</FontFamily>
</Style>
</TextRun>
</TextRuns>
<Style />
</Paragraph>
</Paragraphs>
<rd:DefaultName>Functional_Owner</rd:DefaultName>
<Style>
<Border>
<Color>LightGrey</Color>
<Style>Solid</Style>
</Border>
<PaddingLeft>2pt</PaddingLeft>
<PaddingRight>2pt</PaddingRight>
<PaddingTop>2pt</PaddingTop>
<PaddingBottom>2pt</PaddingBottom>
</Style>
</Textbox>
</CellContents>
</TablixCell>
</TablixCells>
</TablixRow>
</TablixRows>
</TablixBody>
<TablixColumnHierarchy>
<TablixMembers>
<TablixMember />
<TablixMember />
<TablixMember />
<TablixMember />
</TablixMembers>
</TablixColumnHierarchy>
<TablixRowHierarchy>
<TablixMembers>
<TablixMember>
<KeepWithGroup>After</KeepWithGroup>
</TablixMember>
<TablixMember>
<Group Name="Details" />
</TablixMember>
</TablixMembers>
</TablixRowHierarchy>
<DataSetName>FolderPermissions</DataSetName>
<Height>1.2cm</Height>
<Width>19.98729cm</Width>
<Style>
<Border>
<Style>None</Style>
</Border>
</Style>
</Tablix>
</ReportItems>
<Height>0.47244in</Height>
<Style />
</Body>
<Width>7.86901in</Width>
<Page>
<PageHeight>29.7cm</PageHeight>
<PageWidth>21cm</PageWidth>
<LeftMargin>2cm</LeftMargin>
<RightMargin>2cm</RightMargin>
<TopMargin>2cm</TopMargin>
<BottomMargin>2cm</BottomMargin>
<ColumnSpacing>0.13cm</ColumnSpacing>
<Style />
</Page>
</ReportSection>
</ReportSections>
<ReportParameters>
<ReportParameter Name="HelpDeskEmail">
<DataType>String</DataType>
<DefaultValue>
<Values>
<Value>yourhelpdesk@yourcompany.com</Value>
</Values>
</DefaultValue>
<Prompt>HelpDeskEmail</Prompt>
<Hidden>true</Hidden>
</ReportParameter>
<ReportParameter Name="FunctionalOwner">
<DataType>String</DataType>
<DefaultValue>
<Values>
<Value>Functional Owner</Value>
</Values>
</DefaultValue>
<Prompt>FunctionalOwner</Prompt>
<Hidden>true</Hidden>
<MultiValue>true</MultiValue>
</ReportParameter>
<ReportParameter Name="BrowserGroup">
<DataType>String</DataType>
<DefaultValue>
<Values>
<Value>Browser Group</Value>
</Values>
</DefaultValue>
<Prompt>BrowserGroup</Prompt>
<Hidden>true</Hidden>
<MultiValue>true</MultiValue>
</ReportParameter>
</ReportParameters>
<ReportParametersLayout>
<GridLayoutDefinition>
<NumberOfColumns>1</NumberOfColumns>
<NumberOfRows>3</NumberOfRows>
<CellDefinitions>
<CellDefinition>
<ColumnIndex>0</ColumnIndex>
<RowIndex>0</RowIndex>
<ParameterName>HelpDeskEmail</ParameterName>
</CellDefinition>
<CellDefinition>
<ColumnIndex>0</ColumnIndex>
<RowIndex>1</RowIndex>
<ParameterName>FunctionalOwner</ParameterName>
</CellDefinition>
<CellDefinition>
<ColumnIndex>0</ColumnIndex>
<RowIndex>2</RowIndex>
<ParameterName>BrowserGroup</ParameterName>
</CellDefinition>
</CellDefinitions>
</GridLayoutDefinition>
</ReportParametersLayout>
<EmbeddedImages>
<EmbeddedImage Name="email">
<MIMEType>image/png</MIMEType>
<ImageData>iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAITSURBVBgZpcHLThNhGIDh9/vn7/RApwc5VCmFWBPi1mvwAlx7BW69Afeu3bozcSE7E02ILjCRhRrds8AEbKVS2gIdSjvTmf+TYqLu+zyiqszDMCf75PnnnVwhuNcLpwsXk8Q4BYeSOsWpkqrinJI6JXVK6lSRdDq9PO+19vb37XK13Hj0YLMUTVVyWY//Cf8IVwQEGEeJN47S1YdPo4npDpNmnDh5udOh1YsZRcph39EaONpnjs65oxsqvZEyTaHdj3n2psPpKDLBcuOOGUWpZDOG+q0S7751ObuYUisJGQ98T/Ct4Fuo5IX+MGZr95jKjRKLlSxXxFxOEmaaN4us1Upsf+1yGk5ZKhp8C74H5ZwwCGO2drssLZZo1ouIcs2MJikz1oPmapHlaoFXH1oMwphyTghyQj+MefG+RblcoLlaJG/5y4zGCTMikEwTctaxXq/w9kuXdm9Cuzfh9acujXqFwE8xmuBb/hCwl1GKAnGccDwIadQCfD9DZ5Dj494QA2w2qtQW84wmMZ1eyFI1QBVQwV5GiaZOpdsPaSwH5HMZULi9UmB9pYAAouBQbMHHrgQcnQwZV/KgTu1o8PMgipONu2t5KeaNiEkxgAiICDMCCFeEK5aNauAOfoXx8KR9ZOOLk8P7j7er2WBhwWY9sdbDeIJnwBjBWBBAhGsCmiZxPD4/7Z98b/0QVWUehjkZ5vQb/Un5e/DIsVsAAAAASUVORK5CYII=</ImageData>
</EmbeddedImage>
</EmbeddedImages>
<rd:ReportUnitType>Cm</rd:ReportUnitType>
<rd:ReportID>73bf78ec-5d72-4bb2-bdf4-804444e517c6</rd:ReportID>
</Report>
Пример выражения
="mailto:" & Parameters!HelpDeskEmail.Value & "?subject=Access to report folder: " & Fields!FolderName.Value &
"&cc=" & Fields!Functional_Owner.Value &
"&body=I would like access to the report folder. Please add me to the following Active Directory group: " & Fields!Browser_Group.Value
Пример электронной почты
Вот несколько примеров SSRS, которые я использую для запроса сервера отчетов.