

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 SQL Server Agent for Amazon RDS
<a name="Appendix.SQLServer.CommonDBATasks.Agent"></a>

借助 Amazon RDS，您可以在執行 Microsoft SQL Server 企業版、標準版或 Web 版的資料庫執行個體上使用 SQL Server 代理程式。SQL Server 代理程式是 Microsoft Windows 服務，會執行排程的管理任務 (稱為任務)。您可以使用 SQL Server 代理程式來執行 T-SQL 任務，以在 SQL Server 資料庫執行個體中重建索引、執行損毀檢查，以及彙總資料。

建立 SQL Server 資料庫執行個體時，會在 `SQLAgentUserRole` 角色中登錄主要使用者。

SQL Server 代理程式可以按排程或隨需執行任務，以回應特定事件。如需詳細資訊，請參閱 Microsoft 文件中的 [SQL Server 代理程式](http://msdn.microsoft.com/en-us/library/ms189237)。

**注意**  
避免排程任務在資料庫執行個體的維護和備份時段執行。AWS 啟動的維護和備份程序可能會中斷任務或導致其被取消。  
在異地同步備份部署中，當任務複寫功能開啟時，SQL Server Agent 任務從主要主機複製至次要主機。如需更多詳細資訊，請參閱 [開啟 SQL Server Agent 任務複寫](#SQLServerAgent.Replicate)。  
多可用區部署有 10,000 個 SQL Server Agent 任務的限制。若您需要更高的限制，請聯絡 支援 請求增加配額。開啟 [AWS 支援 中心](https://console.aws.amazon.com/support/home#/)頁面，如有必要請登入，然後選擇 **Create case** (建立案例)。選擇 **Service limit increase (提高服務限制)**。填妥並提交表格。

若要在 SQL Server Management Studio (SSMS) 中檢視個別 SQL Server 代理程式任務的歷程紀錄，您可以開啟物件總管 (Object Explorer)，並在任務上按一下滑鼠右鍵，然後選擇 **View History (檢視歷程紀錄)**。

由於 SQL Server 代理程式正在資料庫執行個體中的受管理主機上執行，因此不支援某些動作：
+ 不支援使用 ActiveX、Windows command shell 或 Windows PowerShell 執行複寫任務和命令列指令碼。
+ 您無法手動開始、停止或重新啟動 SQL Server 代理程式。
+ 無法從資料庫執行個體透過 SQL Server 代理程式傳送電子郵件通知。
+ 不支援 SQL Server 代理程式提醒和運算子。
+ 不支援使用 SQL Server 代理程式來建立備份。使用 Amazon RDS 備份您的資料庫執行個體。
+ 目前，RDS for SQL Server 不支援使用 SQL Server Agent 字符。

## 開啟 SQL Server Agent 任務複寫
<a name="SQLServerAgent.Replicate"></a>

您可使用下列儲存程序開啟 SQL Server Agent 任務複寫：

```
EXECUTE msdb.dbo.rds_set_system_database_sync_objects @object_types = 'SQLAgentJob';
```

您可在 Amazon RDS for SQL Server 支援的所有 SQL Server 版本上執行儲存程序。複製下列類別中的任務：
+ [未分類 (本機)]
+ [未分類 (多伺服器)]
+ [未分類]
+ 資料收集器
+ 資料庫引擎調校 Advisor
+ 資料庫維護
+ 全文

僅複製使用 T-SQL 任務步驟的任務。SQL Server Integration Services (SSIS)、SQL Server Reporting Services (SSRS)、複寫和 PowerShell 等步驟類型的任務不會複製。不會複製使用 Database Mail 和伺服器層級物件的任務。

**重要**  
主要主機是複寫的真實來源。開啟工作複寫之前，請確定您的 SQL Server 代理程式工作位於主要主機上。如果您未這麼做，則當次要主機上有較新的工作時，如果您開啟該功能，可能會導致刪除 SQL Server 代理程式工作。

您可使用下列函數來確認複製是否已開啟。

```
SELECT * from msdb.dbo.rds_fn_get_system_database_sync_objects();
```

 若 SQL Server Agent 任務正在複製，則 T-SQL 查詢傳回下列內容。若並未複製，則不會為 `object_class` 傳回任何東西。

![\[SQL Server Agent 任務正在複製\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/images/SQLAgentJob.png)


您可以使用下列函數，以 UTC 時間找出物件上次同步的時間。

```
SELECT * from msdb.dbo.rds_fn_server_object_last_sync_time();
```

例如，假設您修改 SQL Server Agent 任務的時間為 01:00。您希望最近的同步時間在 01:00 之後，表示同步已發生。

同步化之後，針對次要節點上的 `date_created` 和 `date_modified` 傳回的值預期會相符。

![\[上次同步伺服器物件的時間為 01:21:23\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/UserGuide/images/SQLAgentJob_last_sync_time.png)


如果您也使用 `tempdb` 複寫，您可以在 `@object_type` 參數中提供相關物件，以啟用 SQL Agent 任務和 `tempdb` 組態的複寫：

```
EXECUTE msdb.dbo.rds_set_system_database_sync_objects @object_types = 'SQLAgentJob,TempDbFile';
```

如需 `tempdb` 複寫的詳細資訊，請參閱 [多可用區域部署的 TempDB 組態](SQLServer.TempDB.MAZ.md)。

# 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
   ```

如需詳細資訊，請參閱[在 RDS SQL Server 中使用 SQLAgentOperatorRole](https://aws.amazon.com/blogs/database/leveraging-sqlagentoperatorrole-in-rds-sql-server/)。

# 將使用者新增至 SQLAgentUser 角色
<a name="SQLServerAgent.AddUser"></a>

如要允許其他登入或使用者使用 SQL Server Agent，則您必須以主要使用者身分登入，並進行下列作業：

1. 透過使用 `CREATE LOGIN` 命令來建立另一個伺服器層級的登入。

1. 利用 `msdb` 命令在 `CREATE USER` 中建立使用者，然後將此使用者與您在前一個步驟中所建立的登入相連結。

1. 利用 `SQLAgentUserRole` 系統存放程序，將使用者新增至 `sp_addrolemember`。

例如，假設您的主要使用者名稱為 **admin**，而您想要將 SQL Server Agent 的存取權提供給名為 **theirname** 與密碼為 **theirpassword** 的使用者。於此狀況下，您可使用下列程序。

**新增使用者至 SQLAgentUser 角色**

1. 以主要使用者身分登入。

1. 執行下列命令：

   ```
   --Initially set context to master database
   USE [master];
   GO
   --Create a server-level login named theirname with password theirpassword
   CREATE LOGIN [theirname] WITH PASSWORD = 'theirpassword';
   GO
   --Set context to msdb database
   USE [msdb];
   GO
   --Create a database user named theirname and link it to server-level login theirname
   CREATE USER [theirname] FOR LOGIN [theirname];
   GO
   --Added database user theirname in msdb to SQLAgentUserRole in msdb
   EXEC sp_addrolemember [SQLAgentUserRole], [theirname];
   ```

# 刪除 SQL Server 代理程式任務
<a name="SQLServerAgent.DeleteJob"></a>

您可以使用 `sp_delete_job` 存放程序來刪除 Amazon RDS for Microsoft SQL Server 上的SQL Server 代理程式任務。

您無法使用 SSMS 來刪除 SQL Server 代理程式任務。如果這麼做，您會收到類似下列的錯誤訊息：

```
The EXECUTE permission was denied on the object 'xp_regread', database 'mssqlsystemresource', schema 'sys'.
```

RDS 屬於受管服務，其會因受限而無法執行能存取 Windows 登錄的程序。當您使用 SSMS 時，其會嘗試執行 RDS 未授權的程序 (`xp_regread`)。

**注意**  
在 RDS for SQL Server 上，才允許 sysadmin 角色的成員更新或刪除不同登入所擁有的任務。如需詳細資訊，請參閱[在 RDS SQL Server 中使用 SQLAgentOperatorRole](https://aws.amazon.com/blogs/database/leveraging-sqlagentoperatorrole-in-rds-sql-server/)。

**若要刪除 SQL Server 代理程式任務**
+ 執行下列 T-SQL 陳述式：

  ```
  EXEC msdb..sp_delete_job @job_name = 'job_name';
  ```