创建 RSExecRole

Reporting Services 使用称为 RSExecRole 的预定义数据库角色向报表服务器数据库授予报表服务器权限。 为报表服务器数据库自动创建了 RSExecRole 角色。 通常,始终不应修改该角色或将其他用户分配给该角色。 不过,将报表服务器数据库移到新的或其他 SQL Server 数据库引擎时,必须在 Master 系统数据库和 MSDB 系统数据库中重新创建角色。

使用以下说明,执行下列步骤:

  • 在 Master 系统数据库中创建和设置 RSExecRole

  • 在 MSDB 系统数据库中创建和设置 RSExecRole

注意

本主题中的说明针对的是不需要运行脚本或编写 WMI 代码来设置报表服务器数据库的用户。 如果管理大型部署并且要例行移动数据库,则应编写脚本来自动执行这些步骤。 有关详细信息,请参阅 访问 Reporting Services WMI 提供程序

开始之前

  • 备份加密密钥,以便可以在数据库移动之后对其进行还原。 此步骤不会直接影响你创建和预配 RSExecRole 的能力,不过你必须有密钥备份才能验证你的工作。 有关详细信息,请参阅 Back Up and Restore Reporting Services Encryption Keys

  • 验证你是以具有 SQL Server 实例上的 sysadmin 权限的用户帐户身份登录的。

  • 验证 SQL Server 代理服务已安装在计划使用的数据库引擎实例上并且正在运行。

  • 附加 ReportServerTempDB 和 ReportServer 数据库。 不要求你附加这些数据库来创建实际的角色,不过必须要先附加它们才可以测试你的工作。

关于手动创建 RSExecRole 的说明是供迁移报表服务器安装的上下文中使用的。 备份和移动报表服务器数据库等重要任务均不在本文中讲述,但是会记录在数据库引擎文档中。

在 master 系统数据库中创建 RSExecRole

Reporting Services 使用 SQL Server 代理服务的扩展存储过程来支持计划操作。 下列步骤说明如何向 RSExecRole 角色授予这些过程的执行权限。

使用 Management Studio 在 master 系统数据库中创建 RSExecRole 的具体步骤

  1. 启动 SQL Server Management Studio 并连接到托管报表服务器数据库的数据库引擎实例。

  2. 打开 “数据库”

  3. 打开 “系统数据库”

  4. 打开 Master

  5. 打开 “安全性”

  6. 打开 “角色”

  7. 右键单击“数据库角色”,然后选择“新建数据库角色”。 此时将显示“数据库角色 - 新建”页。

  8. 在“角色名称”中,输入 RSExecRole

  9. 在“所有者”中,输入 dbo

  10. 选择“安全对象”页。

  11. 选择搜索。 此时,将显示 “添加对象” 对话框。 “指定对象” 选项默认情况下处于选中状态。

  12. 选择“确定”。 此时,将显示 “选择对象” 对话框。

  13. 选择“对象类型”

  14. 选择“扩展存储过程”

  15. 选择“确定”

  16. 选择浏览

  17. 向下滚动列表,然后选择下列程序:

    1. xp_sqlagent_enum_jobs

    2. xp_sqlagent_is_starting

    3. xp_sqlagent_notify

  18. 选择“确定”,然后再选择“确定”

  19. 在“执行”行的“授予”列中,选中复选框。

  20. 对于其余的每个存储过程,重复此操作。 必须向RSExecRole 授予全部三个存储过程的执行权限。

  21. 选择“确定”,以完成操作。

显示“数据库角色属性”页面的屏幕截图。

在 MSDB 中创建 RSExecRole

Reporting Services 使用 SQL Server 代理服务的存储过程并从系统表中检索作业信息,以支持计划操作。 下列步骤说明如何向 RSExecRole 授予这些过程的执行权限和对表的选择权限。

在 MSDB 系统数据库中创建 RSExecRole

  1. 重复相似的步骤,授予 MSDB 中存储过程和表的权限。 若要简化这些步骤,需要单独预配存储过程和表。

  2. 打开 MSDB

  3. 打开 “安全性”

  4. 打开 “角色”

  5. 右键单击“数据库角色”,然后选择“新建数据库角色”。 将显示“常规”页。

  6. 在“角色名称”中,输入 RSExecRole

  7. 在“所有者”中,输入 dbo

  8. 选择“安全对象”页。

  9. 选择搜索。 此时,将显示 “添加对象” 对话框。 “指定对象” 选项默认情况下处于选中状态。

  10. 选择“确定”

  11. 选择“对象类型”

  12. 选择“存储过程”

  13. 选择“确定”

  14. 选择浏览

  15. 向下滚动项目的列表,然后选择下列程序:

    1. sp_add_category

    2. sp_add_job

    3. sp_add_jobschedule

    4. sp_add_jobserver

    5. sp_add_jobstep

    6. sp_delete_job

    7. sp_help_category

    8. sp_help_job

    9. sp_help_jobschedule

    10. sp_verify_job_identifiers

  16. 选择“确定”,然后再选择“确定”

  17. 选择第一个存储过程:sp_add_category。

  18. 在“执行”行的“授予”列中,选中复选框。

  19. 对于其余的每个存储过程,重复此操作。 必须向 RSExecRole 授予全部 10 个存储过程的执行权限。

  20. 继续在“安全对象”页上,再次选择“搜索”。 此时,将显示 “添加对象” 对话框。 “指定对象” 选项默认情况下处于选中状态。

  21. 选择“确定”

  22. 选择“对象类型”

  23. 选择

  24. 选择“确定”

  25. 选择浏览

  26. 向下滚动项目列表,然后选择下列各表:

    1. syscategories

    2. sysjobs

  27. 选择“确定”,然后再选择“确定”

  28. 选择第一个表:syscategories。

  29. 在“选择”行的“授予”列中,选择复选框。

  30. 对于 sysjobs 表重复此操作。 必须向 RSExecRole 授予这两个表的选择权限。

  31. 选择“确定”,以完成操作。

移动报表服务器数据库

创建角色之后,可以将报表服务器数据库移到新的 SQL Server 实例。 有关详细信息,请参阅将报表服务器数据库移至其他计算机

若要将数据库引擎升级到 SQL Server 2016 或更高版本,可以在移动数据库前后进行升级。

当报表服务器连接到报表服务器数据库时,该数据库将自动升级。 数据库升级不要求任何特定的步骤。

还原加密密钥并验证工作

如果已附加报表服务器数据库,则现在应可以完成以下步骤来验证你的工作。

在数据库移动后验证报表服务器的可操作性

  1. 启动 Reporting Services 配置工具,然后连接到报表服务器。

  2. 选择“数据库”

  3. 选择“更改数据库”

  4. 选择“选择现有报表服务器数据库”

  5. 输入数据库引擎的服务器名称。 如果将报表服务器数据库附加到命名实例,则必须按以下格式输入实例名称:<servername>\<instancename>。

  6. 选择“测试连接”。 应该会看到一个对话框,其中显示“测试连接成功”。

  7. 选择“确定”以关闭该对话框,然后选择“下一步”

  8. 在“数据库”上,选择报表服务器数据库。

  9. 单击“下一步”,并完成向导。

  10. 选择“加密密钥”

  11. 选择“还原”。

  12. 选择强文件 (.snk),该文件拥有用来对报表服务器数据库中存储的凭据和连接信息进行解密的对称密钥的备份副本。

  13. 输入密码,然后选择“确定”

  14. 选择“Web 门户 URL”

  15. 选择链接以打开 Web 门户。 您应看到报表服务器数据库中的报表服务器项。

使用 T-SQL 创建 RSExecRole 角色和权限

还可以使用以下 T-SQL 脚本在系统数据库上创建该角色,并授予适用权限:

USE master;
GO
IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE [type] = 'R' AND [name] = 'RSExecRole') BEGIN
    CREATE ROLE [RSExecRole];
END
GRANT EXECUTE ON dbo.xp_sqlagent_enum_jobs TO [RSExecRole];
GRANT EXECUTE ON dbo.xp_sqlagent_is_starting TO [RSExecRole];
GRANT EXECUTE ON dbo.xp_sqlagent_notify TO [RSExecRole];
GO
USE msdb;
GO
IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE [type] = 'R' AND [name] = 'RSExecRole') BEGIN
    CREATE ROLE [RSExecRole];
END
GRANT EXECUTE ON dbo.sp_add_category TO [RSExecRole];
GRANT EXECUTE ON dbo.sp_add_job TO [RSExecRole];
GRANT EXECUTE ON dbo.sp_add_jobschedule TO [RSExecRole];
GRANT EXECUTE ON dbo.sp_add_jobserver TO [RSExecRole];
GRANT EXECUTE ON dbo.sp_add_jobstep TO [RSExecRole];
GRANT EXECUTE ON dbo.sp_delete_job TO [RSExecRole];
GRANT EXECUTE ON dbo.sp_help_category TO [RSExecRole];
GRANT EXECUTE ON dbo.sp_help_job TO [RSExecRole];
GRANT EXECUTE ON dbo.sp_help_jobschedule TO [RSExecRole];
GRANT EXECUTE ON dbo.sp_verify_job_identifiers TO [RSExecRole];
GRANT SELECT ON dbo.syscategories TO [RSExecRole];
GRANT SELECT ON dbo.sysjobs TO [RSExecRole];
GO