

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

# 使用 AWS SCT 延伸套件模擬 PostgreSQL 中的 SQL Server Agent
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Agent"></a>

SQL Server Agent 是執行 SQL Server 任務的 Microsoft Windows 服務。SQL Server Agent 會依排程、回應特定事件或隨需執行任務。如需 SQL Server Agent 的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/ssms/agent/sql-server-agent?view=sql-server-ver15)。

PostgreSQL 沒有 SQL Server Agent 的同等項目。若要模擬 SQL Server Agent 功能，請 AWS SCT 建立延伸套件。此延伸套件使用 AWS Lambda 和 Amazon CloudWatch。 AWS Lambda 實作您用來管理排程和執行任務的界面。Amazon CloudWatch 會維護排程規則。

AWS Lambda 和 Amazon CloudWatch 使用 JSON 參數進行互動。此 JSON 參數具有下列結構。

```
{
    "mode": mode,
    "parameters": {
        list of parameters
    },
    "callback": procedure name
}
```

在上述範例中， *`mode`* 是任務的類型`list of parameters`，也是一組取決於任務類型的參數。此外， `procedure name`是任務完成後執行的程序名稱。

AWS SCT 使用一個 Lambda 函數來控制和執行任務。CloudWatch 規則會開始執行任務，並提供啟動任務所需的資訊。當 CloudWatch 規則觸發時，它會使用規則中的參數啟動 Lambda 函數。

若要建立呼叫程序的簡單任務，請使用下列格式。

```
{
    "mode": "run_job",
    "parameters": {
        "vendor": "mysql",
        "cmd": "lambda_db.nightly_job"
    }
}
```

若要建立具有數個步驟的任務，請使用下列格式。

```
{
    "mode": "run_job",
    "parameters": {
        "job_name": "Job1",
        "enabled": "true",
        "start_step_id": 1,
        "notify_level_email": [0|1|2|3],
        "notify_email": email,
        "delete_level": [0|1|2|3],
        "job_callback": "ProcCallBackJob(job_name, code, message)",
        "step_callback": "ProcCallBackStep(job_name, step_id, code, message)"
    },
    "steps": [
        {
            "id":1,
            "cmd": "ProcStep1",
            "cmdexec_success_code": 0,
            "on_success_action": [|2|3|4],
            "on_success_step_id": 1,
            "on_fail_action": 0,
            "on_fail_step_id": 0,
            "retry_attempts": number,
            "retry_interval": number
        },
        {
            "id":2,
            "cmd": "ProcStep2",
            "cmdexec_success_code": 0,
            "on_success_action": [1|2|3|4],
            "on_success_step_id": 0,
            "on_fail_action": 0,
            "on_fail_step_id": 0,
            "retry_attempts": number,
            "retry_interval": number
        },
        ...
]
}
```

為了模擬 PostgreSQL 中的 SQL Server Agent 行為， AWS SCT 延伸套件也會建立下列資料表和程序。

## 在 PostgreSQL 中模擬 SQL Server 代理程式的資料表
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Agent.Tables"></a>

若要模擬 SQL Server Agent，延伸套件會使用下列資料表：

**sysjobs**  
儲存任務的相關資訊。

**sysjobsteps**  
儲存有關任務步驟的資訊。

**sysschedules**  
儲存任務排程的相關資訊。

**sysjobschedules**  
儲存個別任務的排程資訊。

**sysjobhistory**  
儲存排程任務執行的相關資訊。

## 在 PostgreSQL 中模擬 SQL Server 代理程式的程序
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Agent.Procedures"></a>

若要模擬 SQL Server Agent，延伸套件會使用下列程序：

**sp\$1add\$1job**  
新增任務。

**sp\$1add\$1jobstep**  
將步驟新增至任務。

**sp\$1add\$1schedule**  
在 Amazon CloudWatch 中建立新的排程規則。您可以將此排程與任意數量的任務搭配使用。

**sp\$1attach\$1schedule**  
設定所選任務的排程。

**sp\$1add\$1jobschedule**  
在 Amazon CloudWatch 中建立任務的排程規則，並設定此規則的目標。

**sp\$1update\$1job**  
更新先前建立之任務的屬性。

**sp\$1update\$1jobstep**  
更新任務中步驟的屬性。

**sp\$1update\$1schedule**  
更新 Amazon CloudWatch 中排程規則的屬性。

**sp\$1update\$1jobschedule**  
更新指定任務排程的屬性。

**sp\$1delete\$1job**  
刪除任務。

**sp\$1delete\$1jobstep**  
從任務中刪除任務步驟。

**sp\$1delete\$1schedule**  
刪除排程。

**sp\$1delete\$1jobschedule**  
從 Amazon CloudWatch 刪除指定任務的排程規則。

**sp\$1detach\$1schedule**  
移除排程與任務之間的關聯。

**get\$1jobs、update\$1job**  
與 互動的內部程序 AWS Elastic Beanstalk。

**sp\$1verify\$1job\$1date、sp\$1verify\$1job\$1time、sp\$1verify\$1job、sp\$1verify\$1jobstep、sp\$1verify\$1schedule、sp\$1verify\$1job\$1identifiers、sp\$1verify\$1schedule\$1identifiers**  
檢查設定的內部程序。

## PostgreSQL 中模擬 SQL Server Agent 的程序語法
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Agent.Syntax"></a>

延伸套件中的`aws_sqlserver_ext.sp_add_job`程序會模擬`msdb.dbo.sp_add_job`程序。如需來源 SQL Server Agent 程序的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-add-job-transact-sql?view=sql-server-ver15)。

```
par_job_name varchar,
par_enabled smallint = 1,
par_description varchar = NULL::character varying,
par_start_step_id integer = 1,
par_category_name varchar = NULL::character varying,
par_category_id integer = NULL::integer,
par_owner_login_name varchar = NULL::character varying,
par_notify_level_eventlog integer = 2,
par_notify_level_email integer = 0,
par_notify_level_netsend integer = 0,
par_notify_level_page integer = 0,
par_notify_email_operator_name varchar = NULL::character varying,
par_notify_netsend_operator_name varchar = NULL::character varying,
par_notify_page_operator_name varchar = NULL::character varying,
par_delete_level integer = 0,
inout par_job_id integer = NULL::integer,
par_originating_server varchar = NULL::character varying,
out returncode integer
```

延伸套件中的`aws_sqlserver_ext.sp_add_jobstep`程序會模擬`msdb.dbo.sp_add_jobstep`程序。如需來源 SQL Server Agent 程序的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-add-jobstep-transact-sql?view=sql-server-ver15)。

```
par_job_id integer = NULL::integer,
par_job_name varchar = NULL::character varying,
par_step_id integer = NULL::integer,
par_step_name varchar = NULL::character varying,
par_subsystem varchar = 'TSQL'::bpchar,
par_command text = NULL::text,
par_additional_parameters text = NULL::text,
par_cmdexec_success_code integer = 0,
par_on_success_action smallint = 1,
par_on_success_step_id integer = 0,
par_on_fail_action smallint = 2,
par_on_fail_step_id integer = 0,
par_server varchar = NULL::character varying,
par_database_name varchar = NULL::character varying,
par_database_user_name varchar = NULL::character varying,
par_retry_attempts integer = 0,
par_retry_interval integer = 0,
par_os_run_priority integer = 0,
par_output_file_name varchar = NULL::character varying,
par_flags integer = 0,
par_proxy_id integer = NULL::integer,
par_proxy_name varchar = NULL::character varying,
inout par_step_uid char = NULL::bpchar,
out returncode integer
```

延伸套件中的`aws_sqlserver_ext.sp_add_schedule`程序會模擬`msdb.dbo.sp_add_schedule`程序。如需來源 SQL Server Agent 程序的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-add-schedule-transact-sql?view=sql-server-ver15)。

```
par_schedule_name varchar,
par_enabled smallint = 1,
par_freq_type integer = 0,
par_freq_interval integer = 0,
par_freq_subday_type integer = 0,
par_freq_subday_interval integer = 0,
par_freq_relative_interval integer = 0,
par_freq_recurrence_factor integer = 0,
par_active_start_date integer = NULL::integer,
par_active_end_date integer = 99991231,
par_active_start_time integer = 0,
par_active_end_time integer = 235959,
par_owner_login_name varchar = NULL::character varying,
*inout par_schedule_uid char = NULL::bpchar,*
inout par_schedule_id integer = NULL::integer,
par_originating_server varchar = NULL::character varying,
out returncode integer
```

延伸套件中的`aws_sqlserver_ext.sp_attach_schedule`程序會模擬`msdb.dbo.sp_attach_schedule`程序。如需來源 SQL Server Agent 程序的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-attach-schedule-transact-sql?view=sql-server-ver15)。

```
par_job_id integer = NULL::integer,
par_job_name varchar = NULL::character varying,
par_schedule_id integer = NULL::integer,
par_schedule_name varchar = NULL::character varying,
par_automatic_post smallint = 1,
out returncode integer
```

延伸套件中的`aws_sqlserver_ext.sp_add_jobschedule`程序會模擬`msdb.dbo.sp_add_jobschedule`程序。如需來源 SQL Server Agent 程序的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-add-jobschedule-transact-sql?view=sql-server-ver15)。

```
par_job_id integer = NULL::integer,
par_job_name varchar = NULL::character varying,
par_name varchar = NULL::character varying,
par_enabled smallint = 1,
par_freq_type integer = 1,
par_freq_interval integer = 0,
par_freq_subday_type integer = 0,
par_freq_subday_interval integer = 0,
par_freq_relative_interval integer = 0,
par_freq_recurrence_factor integer = 0,
par_active_start_date integer = NULL::integer,
par_active_end_date integer = 99991231,
par_active_start_time integer = 0,
par_active_end_time integer = 235959,
inout par_schedule_id integer = NULL::integer,
par_automatic_post smallint = 1,
inout par_schedule_uid char = NULL::bpchar,
out returncode integer
```

延伸套件中的`aws_sqlserver_ext.sp_delete_job`程序會模擬`msdb.dbo.sp_delete_job`程序。如需來源 SQL Server Agent 程序的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-delete-job-transact-sql?view=sql-server-ver15)。

```
par_job_id integer = NULL::integer,
par_job_name varchar = NULL::character varying,
par_originating_server varchar = NULL::character varying,
par_delete_history smallint = 1,
par_delete_unused_schedule smallint = 1,
out returncode integer
```

延伸套件中的`aws_sqlserver_ext.sp_delete_jobstep`程序會模擬`msdb.dbo.sp_delete_jobstep`程序。如需來源 SQL Server Agent 程序的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-delete-jobsteplog-transact-sql?view=sql-server-ver15)。

```
par_job_id integer = NULL::integer,
par_job_name varchar = NULL::character varying,
par_step_id integer = NULL::integer,
out returncode integer
```

延伸套件中的`aws_sqlserver_ext.sp_delete_jobschedule`程序會模擬`msdb.dbo.sp_delete_jobschedule`程序。如需來源 SQL Server Agent 程序的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-delete-jobschedule-transact-sql?view=sql-server-ver15)。

```
par_job_id integer = NULL::integer,
par_job_name varchar = NULL::character varying,
par_name varchar = NULL::character varying,
par_keep_schedule integer = 0,
par_automatic_post smallint = 1,
out returncode integer
```

延伸套件中的`aws_sqlserver_ext.sp_delete_schedule`程序會模擬`msdb.dbo.sp_delete_schedule`程序。如需來源 SQL Server Agent 程序的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-delete-schedule-transact-sql?view=sql-server-ver15)。

```
par_schedule_id integer = NULL::integer,
par_schedule_name varchar = NULL::character varying,
par_force_delete smallint = 0,
par_automatic_post smallint = 1,
out returncode integer
```

延伸套件中的`aws_sqlserver_ext.sp_detach_schedule`程序會模擬`msdb.dbo.sp_detach_schedule`程序。如需來源 SQL Server Agent 程序的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-detach-schedule-transact-sql?view=sql-server-ver15)。

```
par_job_id integer = NULL::integer,
par_job_name varchar = NULL::character varying,
par_schedule_id integer = NULL::integer,
par_schedule_name varchar = NULL::character varying,
par_delete_unused_schedule smallint = 0,
par_automatic_post smallint = 1,
out returncode integer
```

延伸套件中的`aws_sqlserver_ext.sp_update_job`程序會模擬`msdb.dbo.sp_update_job`程序。如需來源 SQL Server Agent 程序的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-update-job-transact-sql?view=sql-server-ver15)。

```
par_job_id integer = NULL::integer
par_job_name varchar = NULL::character varying
par_new_name varchar = NULL::character varying
par_enabled smallint = NULL::smallint
par_description varchar = NULL::character varying
par_start_step_id integer = NULL::integer
par_category_name varchar = NULL::character varying
par_owner_login_name varchar = NULL::character varying
par_notify_level_eventlog integer = NULL::integer
par_notify_level_email integer = NULL::integer
par_notify_level_netsend integer = NULL::integer
par_notify_level_page integer = NULL::integer
par_notify_email_operator_name varchar = NULL::character varying
par_notify_netsend_operator_name varchar = NULL::character varying
par_notify_page_operator_name varchar = NULL::character varying
par_delete_level integer = NULL::integer
par_automatic_post smallint = 1
out returncode integer
```

延伸套件中的`aws_sqlserver_ext.sp_update_jobschedule`程序會模擬`msdb.dbo.sp_update_jobschedule`程序。如需來源 SQL Server Agent 程序的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-update-jobschedule-transact-sql?view=sql-server-ver15)。

```
par_job_id integer = NULL::integer
par_job_name varchar = NULL::character varying
par_name varchar = NULL::character varying
par_new_name varchar = NULL::character varying
par_enabled smallint = NULL::smallint
par_freq_type integer = NULL::integer
par_freq_interval integer = NULL::integer
par_freq_subday_type integer = NULL::integer
par_freq_subday_interval integer = NULL::integer
par_freq_relative_interval integer = NULL::integer
par_freq_recurrence_factor integer = NULL::integer
par_active_start_date integer = NULL::integer
par_active_end_date integer = NULL::integer
par_active_start_time integer = NULL::integer
                par_active_end_time integer = NULL::integer
par_automatic_post smallint = 1
out returncode integer
```

延伸套件中的`aws_sqlserver_ext.sp_update_jobstep`程序會模擬`msdb.dbo.sp_update_jobstep`程序。如需來源 SQL Server Agent 程序的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-update-jobstep-transact-sql?view=sql-server-ver15)。

```
par_job_id integer = NULL::integer
par_job_name varchar = NULL::character varying
par_step_id integer = NULL::integer
par_step_name varchar = NULL::character varying
par_subsystem varchar = NULL::character varying
par_command text = NULL::text
par_additional_parameters text = NULL::text
par_cmdexec_success_code integer = NULL::integer
par_on_success_action smallint = NULL::smallint
par_on_success_step_id integer = NULL::integer
par_on_fail_action smallint = NULL::smallint
par_on_fail_step_id integer = NULL::integer
par_server varchar = NULL::character varying
par_database_name varchar = NULL::character varying
par_database_user_name varchar = NULL::character varying
par_retry_attempts integer = NULL::integer
par_retry_interval integer = NULL::integer
par_os_run_priority integer = NULL::integer
par_output_file_name varchar = NULL::character varying
par_flags integer = NULL::integer
par_proxy_id integer = NULL::integer
par_proxy_name varchar = NULL::character varying
out returncode integer
```

延伸套件中的`aws_sqlserver_ext.sp_update_schedule`程序會模擬`msdb.dbo.sp_update_schedule`程序。如需來源 SQL Server Agent 程序的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-update-schedule-transact-sql?view=sql-server-ver15)。

```
par_schedule_id integer = NULL::integer
par_name varchar = NULL::character varying
par_new_name varchar = NULL::character varying
par_enabled smallint = NULL::smallint
par_freq_type integer = NULL::integer
par_freq_interval integer = NULL::integer
par_freq_subday_type integer = NULL::integer
par_freq_subday_interval integer = NULL::integer
par_freq_relative_interval integer = NULL::integer
par_freq_recurrence_factor integer = NULL::integer
par_active_start_date integer = NULL::integer
par_active_end_date integer = NULL::integer
par_active_start_time integer = NULL::integer
par_active_end_time integer = NULL::integer
par_owner_login_name varchar = NULL::character varying
par_automatic_post smallint = 1
out returncode integer
```

## 在 PostgreSQL 中使用模擬 SQL Server Agent 的程序範例
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Agent.Examples"></a>

若要新增任務，請使用 程序`aws_sqlserver_ext.sp_add_job`，如下所示。

```
SELECT * FROM aws_sqlserver_ext.sp_add_job (
    par_job_name := 'test_job',
    par_enabled := 1::smallint,
    par_start_step_id := 1::integer,
    par_category_name := '[Uncategorized (Local)]',
    par_owner_login_name := 'sa');
```

若要新增任務步驟，請使用 程序`aws_sqlserver_ext.sp_add_jobstep`，如下所示。

```
SELECT * FROM aws_sqlserver_ext.sp_add_jobstep (
    par_job_name := 'test_job',
    par_step_id := 1::smallint,
    par_step_name := 'test_job_step1',
    par_subsystem := 'TSQL',
    par_command := 'EXECUTE [dbo].[PROC_TEST_JOB_STEP1];',
    par_server := NULL,
    par_database_name := 'GOLD_TEST_SS');
```

若要新增簡單的排程，請使用 程序`aws_sqlserver_ext.sp_add_schedule`，如下所示。

```
SELECT * FROM aws_sqlserver_ext.sp_add_schedule(
    par_schedule_name := 'RunOnce',
    par_freq_type := 1,
    par_active_start_time := 233000);
```

若要設定任務的排程，請使用 程序`aws_sqlserver_ext.sp_attach_schedule`，如下所示。

```
SELECT * FROM aws_sqlserver_ext.sp_attach_schedule (
    par_job_name := 'test_job',
    par_schedule_name := 'NightlyJobs');
```

若要建立任務的排程，請使用 程序`aws_sqlserver_ext.sp_add_jobschedule`，如下所示。

```
SELECT * FROM aws_sqlserver_ext.sp_add_jobschedule (
    par_job_name := 'test_job2',
    par_name := 'test_schedule2',
    par_enabled := 1::smallint,
    par_freq_type := 4,
    par_freq_interval := 1,
    par_freq_subday_type := 4,
    par_freq_subday_interval := 1,
    par_freq_relative_interval := 0,
    par_freq_recurrence_factor := 0,
    par_active_start_date := 20100801,
    par_active_end_date := 99991231,
    par_active_start_time := 0,
    par_active_end_time := 0);
```

## 在 PostgreSQL 中模擬 SQL Server Agent 的使用案例範例
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Agent.UseCases"></a>

如果您的來源資料庫程式碼使用 SQL Server Agent 來執行任務，您可以使用 SQL Server 到 PostgreSQL 延伸套件 AWS SCT ，讓 將此程式碼轉換為 PostgreSQL。延伸套件使用 AWS Lambda 函數來模擬 SQL Server Agent 的行為。

您可以建立新的 AWS Lambda 函數或註冊現有的函數。

**建立新的 AWS Lambda 函數**

1. 在 AWS SCT目標資料庫樹狀目錄中，開啟內容 （按一下滑鼠右鍵） 選單，選擇**套用延伸套件，**然後選擇 **PostgreSQL**。

   會顯示延伸套件精靈。

1. 在 **SQL Server Agent 模擬服務**索引標籤上，執行下列動作：
   + 選擇**建立 AWS Lambda 函數**。
   + 針對**資料庫登入**，輸入目標資料庫使用者的名稱。
   + 針對**資料庫密碼**，輸入您在上一個步驟中輸入的使用者名稱的密碼。
   + 針對 **Python 程式庫資料夾**，輸入 Python 程式庫資料夾的路徑。
   + 選擇**建立 AWS Lambda 函數**，然後選擇**下一步**。

**註冊您先前部署的 AWS Lambda 函數**
+ 在目標資料庫上執行下列指令碼。

  ```
  SELECT
      FROM aws_sqlserver_ext.set_service_setting(
          p_service := 'JOB', 
          p_setting := 'LAMBDA_ARN', 
          p_value := ARN)
  ```

  在上述範例中， *`ARN`*是已部署 AWS Lambda 函數的 Amazon Resource Name (ARN)。

下列範例會建立簡單的任務，其中包含一個步驟。每五分鐘，此任務會執行先前建立的 `job_example` 函數。此函數會將記錄插入`job_example_table`資料表。

**若要建立此簡單任務**

1. 使用 `aws_sqlserver_ext.sp_add_job`函數建立任務，如下所示。

   ```
   SELECT
       FROM aws_sqlserver_ext.sp_add_job (
           par_job_name := 'test_simple_job');
   ```

1. 使用 `aws_sqlserver_ext.sp_add_jobstep`函數建立任務步驟，如下所示。

   ```
   SELECT
       FROM aws_sqlserver_ext.sp_add_jobstep (
           par_job_name := 'test_simple_job', 
           par_step_name := 'test_simple_job_step1', 
           par_command := 'PERFORM job_simple_example;');
   ```

   任務步驟指定 函數的功能。

1. 使用 `aws_sqlserver_ext.sp_add_jobschedule`函數為任務建立排程器，如下所示。

   ```
   SELECT
       FROM aws_sqlserver_ext.sp_add_jobschedule (
           par_job_name := 'test_simple_job', 
           par_name := 'test_schedule', 
           par_freq_type := 4, /* Daily */
           par_freq_interval := 1, /* frequency_interval is unused */
           par_freq_subday_type := 4, /* Minutes */
           par_freq_subday_interval := 5 /* 5 minutes */);
   ```

   任務步驟指定 函數的功能。

若要刪除此任務，請使用 `aws_sqlserver_ext.sp_delete_job`函數，如下所示。

```
PERFORM aws_sqlserver_ext.sp_delete_job(
    par_job_name := 'PeriodicJob1'::character varying,
    par_delete_history := 1::smallint,
    par_delete_unused_schedule := 1::smallint);
```