

# SQL Server Agent 角色
<a name="SQLServerAgent.AgentRoles"></a>

RDS for SQL Server 支持以下 SQL Server Agent 角色，这些角色具有不同的权限级别来管理作业：
+ **SQLAgentUserRole**

  权限
  + 创建和管理自己的作业、计划和操作员
  + 查看自己的作业和计划的属性
  + 无法查看或管理由其他用户创建的作业

  此角色适用于需要创建和管理自己的作业，但不需要访问由其他用户创建的作业的用户。
+ **SQLAgentReaderRole**

  权限
  + SQLAgentUserRole 的所有权限
  + 查看所有作业和计划（包括其他用户创建的作业和计划）的列表
  + 查看所有作业的属性
  + 查看作业历史记录

  此角色适用于需要监控所有作业的状态但不需要管理这些作业的用户。
+ **SQLAgentOperatorRole**

  权限
  + SQLAgentUserRole 和 SQLAgentReaderRole 的所有权限
  + 执行、停止或启动作业
  + 管理作业历史记录
  + 启用/禁用作业和计划
  + 查看操作员和代理

  此角色提供最全面的权限，适合需要完全控制所有作业的用户。

使用以下命令将角色分配给您的 SQL Server 登录名：

```
USE msdb;
EXEC sp_addrolemember 'SQLAgentOperatorRole', 'username';
```

## 在 RDS for SQL Server 中管理 SQLAgentOperatorRole
<a name="SQLServerAgent.AgentRoles.ManageSQLAgentOperatorRole"></a>

要查看当前作业，必须将 SQLAgentOperatorRole 添加到 SQL Server 登录名，并在断开与数据库的连接之前将其移除。

要在 SQL Server Management Studio 中可视化 SQL Server Agent 树，请按照以下说明操作：

**在 SQL Server Management Studio（SSMS）上查看 SQL Server Agent**

1. 使用 RDS 主凭证，登录 RDS SQL Server 实例并向所需用户授予 SQLAgentUserRole。

   ```
   USE msdb
   GO
   IF NOT EXISTS(SELECT name FROM sys.database_principals WHERE name = 'UserName')
   BEGIN
   CREATE USER UserName FROM LOGIN UserName
   END
   GO
   ALTER ROLE SQLAgentUserRole ADD MEMBER UserName
   GO
   GRANT ALTER ON ROLE::[SQLAgentOperatorRole] to UserName
   GO
   ```

   如果该用户不存在，则这些命令会在 `msdb` 数据库上创建该用户。它还会在 SQLAgentUserRole 上添加用户，因此可以看到 SSMS 上的 SQL Server Agent 树。最后，它向用户授予对 SQLAgentOperatorRole 的更改权限。这可让用户在该角色中添加/移除自身。

1. 要将自己添加到上述角色中，请使用需要查看作业的用户连接到 RDS SQL Server 实例，然后运行以下脚本。

   ```
   use msdb
   go
   ALTER ROLE SQLAgentOperatorRole ADD MEMBER UserName
   GO
   ```

   之后，右键单击**作业**文件夹，然后选择**刷新**。

1. 执行此操作时，**作业**选项卡会显示一个 **\$1**（加号）按钮。单击可展开 SQL Server Agent 作业列表。

1. 
**重要**  
在断开与 RDS SQL Server 实例的连接之前，您需要将自己从 SQLAgentOperatorRole 中移除。

   要从 SQLAgentOperatorRole 中移除登录名，请在断开或关闭 Management Studio 之前运行以下查询：

   ```
   USE msdb
   GO
   ALTER ROLE SQLAgentOperatorRole DROP MEMBER UserName
   GO
   ```

有关更多信息，请参阅 [Leveraging SQLAgentOperatorRole in RDS SQL Server](https://aws.amazon.com/blogs/database/leveraging-sqlagentoperatorrole-in-rds-sql-server/)。