

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

# 使用 從 SQL Server 遷移至 PostgreSQL AWS Schema Conversion Tool
<a name="CHAP_Source.SQLServer.ToPostgreSQL"></a>

您可以在其中使用 SQL Server 到 PostgreSQL 延伸套件 AWS SCT。此延伸套件會在轉換後的 PostgreSQL 程式碼中模擬 SQL Server 資料庫函數。使用 SQL Server 到 PostgreSQL 延伸套件來模擬 SQL Server Agent 和 SQL Server Database Mail。如需詳細了解延伸套件，請參閱：[搭配 使用延伸套件 AWS Schema Conversion Tool](CHAP_ExtensionPack.md)。

**Topics**
+ [PostgreSQL 做為目標資料庫的權限](#CHAP_Source.SQLServer.ToPostgreSQL.ConfigurePostgreSQL)
+ [SQL 伺服器到 PostgreSQL 轉換設定](#CHAP_Source.SQLServer.ToPostgreSQL.ConversionSettings)
+ [將 SQL Server 分割區轉換為 PostgreSQL 第 10 版分割區](#CHAP_Source.SQLServer.ToPostgreSQL.PG10Partitions)
+ [遷移考量事項](#CHAP_Source.SQLServer.ToPostgreSQL.MigrationConsiderations)
+ [使用 AWS SCT 延伸套件模擬 PostgreSQL 中的 SQL Server Agent](CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Agent.md)
+ [使用 AWS SCT 延伸套件模擬 PostgreSQL 中的 SQL Server 資料庫郵件](CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.md)

## PostgreSQL 做為目標資料庫的權限
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ConfigurePostgreSQL"></a>

若要使用 PostgreSQL 做為目標， AWS SCT 需要 `CREATE ON DATABASE`權限。請務必為每個目標 PostgreSQL 資料庫授予此權限。

若要使用轉換後的公有同義詞，請將資料庫預設搜尋路徑變更為 `"$user", public_synonyms, public`。

您可以使用下列程式碼範例來建立資料庫使用者並授與權限。

```
CREATE ROLE user_name LOGIN PASSWORD 'your_password';
GRANT CREATE ON DATABASE db_name TO user_name;
ALTER DATABASE db_name SET SEARCH_PATH = "$user", public_synonyms, public;
```

在上述範例中，請將 *user\$1name* 替換為您的使用者名稱。然後，將 *db\$1name* 取代為目標資料庫的名稱。最後，使用安全密碼取代 *your\$1password*。

在 PostgreSQL 中，只有結構描述擁有者或 `superuser` 可以刪除結構描述。擁有者可以捨棄結構描述和此結構描述包含的所有物件，即使結構描述的擁有者不擁有其部分物件。

當您使用不同的使用者來轉換和套用不同的結構描述到目標資料庫時，當 AWS SCT 無法捨棄結構描述時，您可能會收到錯誤訊息。若要避免此錯誤訊息，請使用 `superuser` 角色。

## SQL 伺服器到 PostgreSQL 轉換設定
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ConversionSettings"></a>

若要編輯 SQL Server 至 PostgreSQL 轉換設定，請選擇**設定**，然後選擇**轉換設定**。從上方清單中選擇 **SQL Server**，然後選擇 **SQL Server – PostgreSQL**。 AWS SCT 會顯示 SQL Server 到 PostgreSQL 轉換的所有可用設定。

中的 SQL Server 到 PostgreSQL 轉換設定 AWS SCT 包含下列項目的選項：
+ 限制轉換程式碼中具有動作項目的註解數量。

  針對**所選嚴重性及更高之動作項目在轉換後的程式碼中新增註解**，請選擇動作項目的嚴重性。 會在轉換後的程式碼中 AWS SCT 新增所選嚴重性及更高之動作項目的註解。

  例如，若要將已轉換程式碼中的註解數量降到最低，請選擇**僅限錯誤**。若要在已轉換的程式碼中包含所有動作項目的註解，請選擇**所有訊息**。
+ 允許 在 SQL Server 的不同資料表中使用具有相同名稱的索引。

  在 PostgreSQL 中，您在結構描述中使用的所有索引名稱都必須是唯一的。若要確保 AWS SCT 產生所有索引的唯一名稱，請選取**產生索引的唯一名稱**。
+ 將 SQL Server 程序轉換為 PostgreSQL 函數。

  PostgreSQL 第 10 版及更早版本不支援程序。對於不熟悉在 PostgreSQL 中使用程序的客戶， AWS SCT 可以將程序轉換為 函數。若要這樣做，請選取**將程序轉換為函數**。
+ 在資料表`EXEC`中模擬 的輸出。

  來源 SQL Server 資料庫可以將 的輸出存放在資料表`EXEC`中。 AWS SCT 會建立暫存資料表和模擬此功能的額外程序。若要使用此模擬，請選取**建立其他常式以處理開啟的資料集**。
+ 定義要用於轉換程式碼中結構描述名稱的範本。針對**結構描述名稱產生範本**，選擇下列其中一個選項：
  + **<source\$1db>** – 使用 SQL Server 資料庫名稱做為 PostgreSQL 中的結構描述名稱。
  + **<source\$1schema>** – 使用 SQL Server 結構描述名稱做為 PostgreSQL 中的結構描述名稱。
  + **<source\$1db>\$1<schema>** – 在 PostgreSQL 中使用 SQL Server 資料庫和結構描述名稱的組合做為結構描述名稱。
+ 保留來源物件名稱的字母大小寫。

  若要避免將物件名稱轉換為小寫，請選取**避免轉換為小寫以進行區分大小寫的操作**。此選項僅適用於您在目標資料庫中開啟區分大小寫選項時。
+ 保留來源資料庫中的參數名稱。

  若要將雙引號新增至轉換程式碼中的參數名稱，請選取**保留原始參數名稱**。

## 將 SQL Server 分割區轉換為 PostgreSQL 第 10 版分割區
<a name="CHAP_Source.SQLServer.ToPostgreSQL.PG10Partitions"></a>

當您將 Microsoft SQL Server 資料庫轉換為 Amazon Aurora PostgreSQL 相容版本 (Aurora PostgreSQL) 或 Amazon Relational Database Service for PostgreSQL (Amazon RDS for PostgreSQL) 時，請注意下列事項。

在 SQL Server 中，您可以使用分割功能建立分割區。從 SQL Server 分割資料表轉換到 PostgreSQL 版本 10 分割資料表時，請注意幾個潛在問題：
+ SQL Server 可讓您使用沒有 NOT NULL 限制的欄來分割資料表。在這種情況下，所有 NULL 值會移至最左邊分割區。PostgreSQL 不支援 RANGE 分割的 NULL 值。
+ SQL Server 允許您建立分割資料表的主要和唯一索引鍵。對於 PostgreSQL，您可以為每個分割區直接建立主要或唯一索引鍵。因此，遷移到 PostgreSQL 時，必須從父資料表移除 PRIMARY 或 UNIQUE KEY 限制。產生的金鑰名稱採用 格式`<original_key_name>_<partition_number>`。
+ SQL Server 允許您從分割資料表建立外部索引鍵限制以及對分割資料表建立外部索引鍵限制。PostgreSQL 不支援參考分割資料表的外部索引鍵。此外，PostgreSQL 也不支援從一個分割資料表參考另一個資料表的外部索引鍵。
+ SQL Server 允許您為分割資料表建立索引。對於 PostgreSQL，應為每個分割區直接建立索引。因此，遷移到 PostgreSQL 時，必須從父資料表移除索引。產生的索引名稱採用格式 `<original_index_name>_<partition_number>`。
+  PostgreSQL 不支援分割索引。

## 遷移考量事項
<a name="CHAP_Source.SQLServer.ToPostgreSQL.MigrationConsiderations"></a>

將 SQL Server 結構描述遷移至 PostgreSQL 時需要考慮的一些事項：
+ 在 PostgreSQL 中，結構描述中所有物件的名稱都必須是唯一的，包含索引。索引名稱在基礎資料表的結構描述中也必須是唯一的。在 SQL Server 中，不同資料表的索引名稱可以相同。

  為了確保索引名稱的唯一性，如果您的索引名稱不是唯一的， AWS SCT 可讓您選擇產生唯一的索引名稱。做法是在專案屬性中選擇選項 **Generate unique index names (產生唯一的索引名稱)**。此選項預設為啟用。如果啟用此選項，會使用格式 IX\$1table\$1name\$1index\$1name 建立唯一的索引名稱。如果停用此選項，索引名稱不變。
+ GOTO 陳述式和標籤可用來變更陳述式的執行順序。GOTO 陳述式後面的任何 Transact-SQL 陳述式都會被略過，並繼續處理標籤。GOTO 陳述式與標籤可以用在程序、批次或陳述式區塊中的任何地方。GOTO 陳述式也可以設為巢狀。

  PostgreSQL 不使用 GOTO 陳述式。當 AWS SCT 轉換包含 GOTO 陳述式的程式碼時，它會將陳述式轉換為使用 BEGIN...END 或 LOOP...END LOOP 陳述式。您可以在下表中找到如何 AWS SCT 轉換 GOTO 陳述式的範例。  
**SQL Server GOTO 陳述式與轉換後的 PostgreSQL 陳述式**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/SchemaConversionTool/latest/userguide/CHAP_Source.SQLServer.ToPostgreSQL.html)
+ PostgreSQL 不支援 MERGE 陳述式。 會以下列方式 AWS SCT 模擬 MERGE 陳述式的行為：
  + 透過 INSERT ON CONFLICT 建構。
  + 透過使用 UPDATE FROM DML 陳述式，例如不含 WHEN NOT MATCHED 子句的 MERGE。
  + 透過使用 CURSOR (例如含有 DELETE 子句的 MERGE) 或使用複雜的 MERGE ON 條件陳述式。
+ AWS SCT 當 Amazon RDS 為目標時， 可以將資料庫觸發新增至物件樹狀結構。
+ AWS SCT 當 Amazon RDS 為目標時， 可以將伺服器層級觸發新增至物件樹狀結構。
+ SQL Server 會自動建立和管理 `deleted`和 `inserted`資料表。您可以使用這些臨時的記憶體駐留資料表來測試特定資料修改的效果，以及設定 DML 觸發動作的條件。 AWS SCT 可以在 DML 觸發陳述式內轉換這些資料表的使用情況。
+ AWS SCT 當 Amazon RDS 為目標時， 可以將連結的伺服器新增至物件樹狀結構。
+ 當從 Microsoft SQL Server 遷移到 PostgreSQL 時，內建的 SUSER\$1SNAME 函數將進行轉換，如下所示：
  + SUSER\$1SNAME – 傳回與安全性識別碼 (SID) 相關聯的登入名稱。
  + SUSER\$1SNAME(<server\$1user\$1sid>) – 不支援。
  + SUSER\$1SNAME() CURRENT\$1USER – 傳回目前執行內容的使用者名稱。
  + SUSER\$1SNAME(NULL) – 傳回 NULL。
+ 支援轉換表格值函數。表格值函數會傳回表格，並可在查詢中代替表格。
+ PATINDEX 將傳回指定表達式中模式第一次出現的開始位置，或所有有效的文字和字元資料類型。如果沒有找到該模式，它返回零。從 SQL Server 轉換為 Amazon RDS for PostgreSQL 時， AWS SCT 會取代使用 PATINDEX 搭配 aws\$1sqlserver\$1ext.patindex (<pattern character>， <expression character varying>) 的應用程式程式碼。
+ 在 SQL Server 中，使用者定義資料表類型是一種代表資料表結構定義的類型。您可以使用使用者定義的資料表類型來宣告預存程序或函數的資料表值參數。您也可以使用使用者定義的資料表類型，宣告您想要在批次或預存程序或函數內文中使用的資料表變數。透過建立暫存資料表，在 PostgreSQL 中 AWS SCT 模擬此類型。

從 SQL Server 轉換為 PostgreSQL 時， 會將 SQL Server 系統物件 AWS SCT 轉換為 PostgreSQL 中可識別的物件。下表顯示系統物件轉換方式。

 


| MS SQL Server 使用案例 | PostgreSQL 替換 | 
| --- | --- | 
| SYS.SCHEMAS | AWS\$1SQLSERVER\$1EXT.SYS\$1SCHEMAS | 
| SYS.TABLES | AWS\$1SQLSERVER\$1EXT.SYS\$1TABLES | 
| SYS.VIEWS | AWS\$1SQLSERVER\$1EXT.SYS\$1VIEWS | 
| SYS.ALL\$1VIEWS | AWS\$1SQLSERVER\$1EXT.SYS\$1ALL\$1VIEWS | 
| SYS.TYPES | AWS\$1SQLSERVER\$1EXT.SYS\$1TYPES | 
| SYS.COLUMNS | AWS\$1SQLSERVER\$1EXT.SYS\$1COLUMNS | 
| SYS.ALL\$1COLUMNS | AWS\$1SQLSERVER\$1EXT.SYS\$1ALL\$1COLUMNS | 
| SYS.FOREIGN\$1KEYS | AWS\$1SQLSERVER\$1EXT.SYS\$1FOREIGN\$1KEYS | 
| SYS.SYSFOREIGNKEYS | AWS\$1SQLSERVER\$1EXT.SYS\$1SYSFOREIGNKEYS | 
| SYS.FOREIGN\$1KEY\$1COLUMNS | AWS\$1SQLSERVER\$1EXT.SYS\$1FOREIGN\$1KEY\$1COLUMNS | 
| SYS.KEY\$1CONSTRAINTS | AWS\$1SQLSERVER\$1EXT.SYS\$1KEY\$1CONSTRAINTS | 
| SYS.IDENTITY\$1COLUMNS | AWS\$1SQLSERVER\$1EXT.SYS\$1IDENTITY\$1COLUMNS | 
| SYS.PROCEDURES | AWS\$1SQLSERVER\$1EXT.SYS\$1PROCEDURES | 
| SYS.INDEXES | AWS\$1SQLSERVER\$1EXT.SYS\$1INDEXES | 
| SYS.SYSINDEXES | AWS\$1SQLSERVER\$1EXT.SYS\$1SYSINDEXES | 
| SYS.OBJECTS | AWS\$1SQLSERVER\$1EXT.SYS\$1OBJECTS | 
| SYS.ALL\$1OBJECTS | AWS\$1SQLSERVER\$1EXT.SYS\$1ALL\$1OBJECTS | 
| SYS.SYSOBJECTS | AWS\$1SQLSERVER\$1EXT.SYS\$1SYSOBJECTS | 
| SYS.SQL\$1MODULES | AWS\$1SQLSERVER\$1EXT.SYS\$1SQL\$1MODULES | 
| SYS.DATABASES | AWS\$1SQLSERVER\$1EXT.SYS\$1DATABASES | 
| INFORMATION\$1SCHEMA.SCHEMATA  | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1SCHEMATA | 
| INFORMATION\$1SCHEMA.VIEWS | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1VIEWS | 
| INFORMATION\$1SCHEMA.TABLES | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1TABLES | 
| INFORMATION\$1SCHEMA.COLUMNS | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1COLUMNS | 
| INFORMATION\$1SCHEMA.CHECK\$1CONSTRAINTS | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1CHECK\$1CONSTRAINTS | 
| INFORMATION\$1SCHEMA.REFERENTIAL\$1CONSTRAINTS | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1REFERENTIAL\$1CONSTRAINTS | 
| INFORMATION\$1SCHEMA.TABLE\$1CONSTRAINTS | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1TABLE\$1CONSTRAINTS | 
| INFORMATION\$1SCHEMA.KEY\$1COLUMN\$1USAGE | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1KEY\$1COLUMN\$1USAGE | 
| INFORMATION\$1SCHEMA.CONSTRAINT\$1TABLE\$1USAGE | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1CONSTRAINT\$1TABLE\$1USAGE  | 
| INFORMATION\$1SCHEMA.CONSTRAINT\$1COLUMN\$1USAGE | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1CONSTRAINT\$1COLUMN\$1USAGE  | 
| INFORMATION\$1SCHEMA.ROUTINES | AWS\$1SQLSERVER\$1EXT.INFORMATION\$1SCHEMA\$1ROUTINES | 
| SYS.SYSPROCESSES | AWS\$1SQLSERVER\$1EXT.SYS\$1SYSPROCESSES | 
| sys.system\$1objects | AWS\$1SQLSERVER\$1EXT.SYS\$1SYSTEM\$1OBJECTS | 

# 使用 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);
```

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

您可以使用 SQL Server Database Mail，從 SQL Server Database Engine 或 Azure SQL 受管執行個體傳送電子郵件訊息給使用者。這些電子郵件訊息可以包含查詢結果，或包含來自您網路上任何資源的檔案。如需 SQL Server Database Mail 的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/database-mail/database-mail?view=sql-server-ver15)。

PostgreSQL 沒有 SQL Server Database Mail 的同等項目。若要模擬 SQL Server Database Mail 功能， AWS SCT 會建立延伸套件。此延伸套件使用 AWS Lambda 和 Amazon Simple Email Service (Amazon SES)。 AWS Lambda 提供使用者與 Amazon SES 電子郵件傳送服務互動的界面。若要設定此互動，請新增 Lambda 函數的 Amazon Resource Name (ARN)。

對於新的電子郵件帳戶，請使用下列命令。

```
do
$$
begin
PERFORM sysmail_add_account_sp (
    par_account_name :='your_account_name',
    par_email_address := 'your_account_email',
    par_display_name := 'your_account_display_name',
    par_mailserver_type := 'AWSLAMBDA'
    par_mailserver_name := 'ARN'
);
end;
$$ language plpgsql;
```

若要將 Lambda 函數的 ARN 新增至現有的電子郵件帳戶，請使用下列命令。

```
do
$$
begin
PERFORM sysmail_update_account_sp (
    par_account_name :='existind_account_name',
    par_mailserver_type := 'AWSLAMBDA'
    par_mailserver_name := 'ARN'
);
end;
$$ language plpgsql;
```

在上述範例中， *`ARN`*是 Lambda 函數的 ARN。

若要模擬 PostgreSQL 中的 SQL Server Database Mail 行為，延伸 AWS SCT 套件會使用下列資料表、檢視和程序。

## 在 PostgreSQL 中模擬 SQL Server 資料庫郵件的資料表
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.Tables"></a>

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

**sysmail\$1account**  
儲存電子郵件帳戶的相關資訊。

**sysmail\$1profile**  
儲存有關使用者設定檔的資訊。

**sysmail\$1server**  
存放電子郵件伺服器的相關資訊。

**sysmail\$1mailitems**  
儲存電子郵件訊息的清單。

**sysmail\$1attachments**  
包含每個電子郵件附件的一列。

**sysmail\$1log**  
儲存有關傳送電子郵件訊息的服務資訊。

**sysmail\$1profileaccount**  
儲存使用者設定檔和電子郵件帳戶的相關資訊。

## 在 PostgreSQL 中模擬 SQL Server 資料庫郵件的檢視
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.Views"></a>

若要模擬 SQL Server Database Mail， 會在 PostgreSQL 資料庫中 AWS SCT 建立下列檢視，以確保相容性。延伸套件不會使用它們，但轉換後的程式碼可以查詢這些檢視。

**sysmail\$1allitems**  
包含所有電子郵件的清單。

**sysmail\$1faileditems**  
包含無法傳送的電子郵件清單。

**sysmail\$1sentitems**  
包含已傳送的電子郵件清單。

**sysmail\$1unsentitems**  
包含尚未傳送的電子郵件清單。

**sysmail\$1mailattachments**  
包含連接檔案的清單。

## 在 PostgreSQL 中模擬 SQL Server 資料庫郵件的程序
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.Procedures"></a>

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

**sp\$1send\$1dbmail**  
傳送電子郵件給指定的收件人。

**sysmail\$1add\$1profile\$1sp**  
建立新的使用者設定檔。

**sysmail\$1add\$1account\$1sp**  
建立新的電子郵件帳戶，以存放 Simple Mail Transfer Protocol (SMTP) 登入資料等資訊。

**sysmail\$1add\$1profileaccount\$1sp**  
將電子郵件帳戶新增至指定的使用者設定檔。

**sysmail\$1update\$1profile\$1sp**  
變更使用者描述檔的屬性，例如描述、名稱等。

**sysmail\$1update\$1account\$1sp**  
變更現有電子郵件帳戶中的資訊。

**sysmail\$1update\$1profileaccount\$1sp**  
更新指定使用者設定檔中的電子郵件帳戶資訊。

**sysmail\$1delete\$1profileaccount\$1sp**  
從指定的使用者設定檔中移除電子郵件帳戶。

**sysmail\$1delete\$1account\$1sp**  
刪除電子郵件帳戶。

**sysmail\$1delete\$1profile\$1sp**  
刪除使用者設定檔。

**sysmail\$1delete\$1mailitems\$1sp**  
從內部資料表刪除電子郵件。

**sysmail\$1help\$1profile\$1sp**  
顯示使用者設定檔的相關資訊。

**sysmail\$1help\$1account\$1sp**  
顯示電子郵件帳戶的相關資訊。

**sysmail\$1help\$1profileaccount\$1sp**  
顯示與使用者設定檔相關聯的電子郵件帳戶資訊。

**sysmail\$1dbmail\$1json**  
產生 AWS Lambda 函數 JSON 請求的內部程序。

**sysmail\$1verify\$1profile\$1sp、sysmail\$1verify\$1account\$1sp、sysmail\$1verify\$1addressparams\$1sp**  
檢查設定的內部程序。

**sp\$1get\$1dbmail、sp\$1set\$1dbmail、sysmail\$1dbmail\$1xml**  
已棄用的內部程序。

## PostgreSQL 中模擬 SQL Server 資料庫郵件的程序語法
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.Syntax"></a>

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

```
par_profile_name varchar = NULL::character varying,
par_recipients text = NULL::text,
par_copy_recipients text = NULL::text,
par_blind_copy_recipients text = NULL::text,
par_subject varchar = NULL::character varying,
par_body text = NULL::text,
par_body_format varchar = NULL::character varying,
par_importance varchar = 'NORMAL'::character varying,
par_sensitivity varchar = 'NORMAL'::character varying,
par_file_attachments text = NULL::text,
par_query text = NULL::text,
par_execute_query_database varchar = NULL::character varying,
par_attach_query_result_as_file smallint = 0,
par_query_attachment_filename varchar = NULL::character varying,
par_query_result_header smallint = 1,
par_query_result_width integer = 256,
par_query_result_separator VARCHAR = ' '::character varying,
par_exclude_query_output smallint = 0,
par_append_query_error smallint = 0,
par_query_no_truncate smallint = 0,
par_query_result_no_padding smallint = 0,
out par_mailitem_id integer,
par_from_address text = NULL::text,
par_reply_to text = NULL::text,
out returncode integer
```

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

```
par_sent_before timestamp = NULL::timestamp without time zone,
par_sent_status varchar = NULL::character varying,
out returncode integer
```

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

```
par_profile_name varchar,
par_description varchar = NULL::character varying,
out par_profile_id integer,
out returncode integer
```

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

```
par_account_name varchar
par_email_address varchar
par_display_name varchar = NULL::character varying
par_replyto_address varchar = NULL::character varying
par_description varchar = NULL::character varying
par_mailserver_name varchar = NULL::character varying
par_mailserver_type varchar = 'SMTP'::bpchar
par_port integer = 25
par_username varchar = NULL::character varying
par_password varchar = NULL::character varying
par_use_default_credentials smallint = 0
par_enable_ssl smallint = 0
out par_account_id integer
out returncode integer
```

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

```
par_profile_id integer = NULL::integer,
par_profile_name varchar = NULL::character varying,
par_account_id integer = NULL::integer,
par_account_name varchar = NULL::character varying,
par_sequence_number integer = NULL::integer,
out returncode integer
```

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

```
par_profile_id integer = NULL::integer,
par_profile_name varchar = NULL::character varying,
out returncode integer
```

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

```
par_profile_id integer = NULL::integer,
par_profile_name varchar = NULL::character varying,
par_description varchar = NULL::character varying,
out returncode integer
```

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

```
par_profile_id integer = NULL::integer,
par_profile_name varchar = NULL::character varying,
par_force_delete smallint = 1,
out returncode integer
```

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

```
par_account_id integer = NULL::integer,
par_account_name varchar = NULL::character varying,
out returncode integer
```

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

```
par_account_id integer = NULL::integer,
par_account_name varchar = NULL::character varying,
par_email_address varchar = NULL::character varying,
par_display_name varchar = NULL::character varying,
par_replyto_address varchar = NULL::character varying,
par_description varchar = NULL::character varying,
par_mailserver_name varchar = NULL::character varying,
par_mailserver_type varchar = NULL::character varying,
par_port integer = NULL::integer,
par_username varchar = NULL::character varying,
par_password varchar = NULL::character varying,
par_use_default_credentials smallint = NULL::smallint,
par_enable_ssl smallint = NULL::smallint,
par_timeout integer = NULL::integer,
par_no_credential_change smallint = NULL::smallint,
out returncode integer
```

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

```
par_account_id integer = NULL::integer,
par_account_name varchar = NULL::character varying,
out returncode integer
```

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

```
par_profile_id integer = NULL::integer,
par_profile_name varchar = NULL::character varying,
par_account_id integer = NULL::integer,
par_account_name varchar = NULL::character varying,
out returncode integer
```

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

```
par_profile_id integer = NULL::integer,
par_profile_name varchar = NULL::character varying,
par_account_id integer = NULL::integer,
par_account_name varchar = NULL::character varying,
par_sequence_number integer = NULL::integer,
out returncode integer
```

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

```
par_profile_id integer = NULL::integer,
par_profile_name varchar = NULL::character varying,
par_account_id integer = NULL::integer,
par_account_name varchar = NULL::character varying,
out returncode integer
```

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

若要傳送電子郵件，請使用如下所示`aws_sqlserver_ext.sp_send_dbmail`的程序。

```
PERFORM sp_send_dbmail (
    par_profile_name := 'Administrator',
    par_recipients := 'hello@rusgl.info',
    par_subject := 'Automated Success Message',
    par_body := 'The stored procedure finished'
);
```

下列範例示範如何傳送包含查詢結果的電子郵件。

```
PERFORM sp_send_dbmail (
    par_profile_name := 'Administrator',
    par_recipients := 'hello@rusgl.info',
    par_subject := 'Account with id = 1',
    par_query := 'SELECT COUNT(*)FROM Account WHERE id = 1'
);
```

下列範例示範如何使用 HTML 程式碼傳送電子郵件。

```
DECLARE var_tableHTML TEXT;
SET var_tableHTML := CONCAT(
    '<H1>Work Order Report</H1>',
    '<table border="1">',
    '<tr><th>Work Order ID</th><th>Product ID</th>',
    '<th>Name</th><th>Order Qty</th><th>Due Date</th>',
    '<th>Expected Revenue</th></tr>',
    '</table>'
);
PERFORM sp_send_dbmail (
    par_recipients := 'hello@rusgl.info',
    par_subject := 'Work Order List',
    par_body := var_tableHTML,
    par_body_format := 'HTML'
);
```

若要刪除電子郵件，請使用 程序`aws_sqlserver_ext.sysmail_delete_mailitems_sp`，如下所示。

```
DECLARE var_GETDATE datetime;
SET var_GETDATE = NOW();
PERFORM sysmail_delete_mailitems_sp (
    par_sent_before := var_GETDATE
);
```

下列範例示範如何刪除最舊的電子郵件。

```
PERFORM sysmail_delete_mailitems_sp (
    par_sent_before := '31.12.2015'
);
```

下列範例顯示如何刪除無法傳送的所有電子郵件。

```
PERFORM sysmail_delete_mailitems_sp (
    par_sent_status := 'failed'
);
```

若要建立新的使用者設定檔，請使用 程序`aws_sqlserver_ext.sysmail_add_profile_sp`，如下所示。

```
PERFORM sysmail_add_profile_sp (
    profile_name := 'Administrator',
    par_description := 'administrative mail'
);
```

下列範例示範如何建立新的設定檔，並將唯一的設定檔識別符儲存在變數中。

```
DECLARE var_profileId INT;
SELECT par_profile_id
    FROM sysmail_add_profile_sp (
        profile_name := 'Administrator',
        par_description := ' Profile used for administrative mail.')
    INTO var_profileId;
    
SELECT var_profileId;
```

若要建立新的電子郵件帳戶，請使用 程序`aws_sqlserver_ext.sysmail_add_account_sp`，如下所示。

```
PERFORM sysmail_add_account_sp (
    par_account_name :='Audit Account',
    par_email_address := 'dba@rusgl.info',
    par_display_name := 'Test Automated Mailer',
    par_description := 'Account for administrative e-mail.',
    par_mailserver_type := 'AWSLAMBDA'
    par_mailserver_name := 'arn:aws:lambda:us-west-2:555555555555:function:pg_v3'
);
```

若要將電子郵件帳戶新增至使用者設定檔，請使用如下所示`aws_sqlserver_ext.sysmail_add_profileaccount_sp`的程序。

```
PERFORM sysmail_add_profileaccount_sp (
    par_account_name := 'Administrator',
    par_account_name := 'Audit Account',
    par_sequence_number := 1
);
```

## 在 PostgreSQL 中模擬 SQL Server 資料庫郵件的使用案例範例
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.UseCases"></a>

如果您的來源資料庫程式碼使用 SQL Server Database Mail 來傳送電子郵件，您可以使用 AWS SCT 延伸套件將此程式碼轉換為 PostgreSQL。

**從 PostgreSQL 資料庫傳送電子郵件**

1. 建立和設定您的 AWS Lambda 函數。

1. 套用 AWS SCT 延伸套件。

1. 使用 `sysmail_add_profile_sp`函數建立使用者設定檔，如下所示。

1. 使用 `sysmail_add_account_sp`函數建立電子郵件帳戶，如下所示。

1. 使用 `sysmail_add_profileaccount_sp`函數將此電子郵件帳戶新增至您的使用者設定檔，如下所示。

   ```
   CREATE OR REPLACE FUNCTION aws_sqlserver_ext.
   proc_dbmail_settings_msdb()
   RETURNS void
   AS
   $BODY$
   BEGIN
   PERFORM aws_sqlserver_ext.sysmail_add_profile_sp(
       par_profile_name := 'Administrator',
       par_description := 'administrative mail'
   );
   PERFORM aws_sqlserver_ext.sysmail_add_account_sp(
       par_account_name := 'Audit Account',
       par_description := 'Account for administrative e-mail.',
       par_email_address := 'dba@rusgl.info',
       par_display_name := 'Test Automated Mailer',
       par_mailserver_type := 'AWSLAMBDA'
       par_mailserver_name := 'your_ARN'
   );
   PERFORM aws_sqlserver_ext.sysmail_add_profileaccount_sp(
       par_profile_name := 'Administrator',
       par_account_name := 'Audit Account',
       par_sequence_number := 1
   );
   END;
   $BODY$
   LANGUAGE plpgsql;
   ```

1. 使用 `sp_send_dbmail`函數傳送電子郵件，如下所示。

   ```
   CREATE OR REPLACE FUNCTION aws_sqlserver_ext.
   proc_dbmail_send_msdb()
   RETURNS void
   AS
   $BODY$
   BEGIN
   PERFORM aws_sqlserver_ext.sp_send_dbmail(
       par_profile_name := 'Administrator',
       par_recipients := 'hello@rusgl.info',
       par_body := 'The stored procedure finished',
       par_subject := 'Automated Success Message'
   );
   END;
   $BODY$
   LANGUAGE plpgsql;
   ```

若要檢視所有使用者設定檔的相關資訊，請使用 程序`sysmail_help_profile_sp`，如下所示。

```
SELECT FROM aws_sqlserver_ext.sysmail_help_profile_sp();
```

下列範例顯示特定使用者設定檔的相關資訊。

```
select from aws_sqlserver_ext.sysmail_help_profile_sp(par_profile_id := 1);
select from aws_sqlserver_ext.sysmail_help_profile_sp(par_profile_name := 'Administrator');
```

若要檢視所有電子郵件帳戶的相關資訊，請使用 程序`sysmail_help_account_sp`，如下所示。

```
select from aws_sqlserver_ext.sysmail_help_account_sp();
```

下列範例顯示特定電子郵件帳戶的相關資訊。

```
select from aws_sqlserver_ext.sysmail_help_account_sp(par_account_id := 1);
select from aws_sqlserver_ext.sysmail_help_account_sp(par_account_name := 'Audit Account');
```

若要檢視與使用者設定檔關聯之所有電子郵件帳戶的相關資訊，請使用如下所示`sysmail_help_profileaccount_sp`的程序。

```
select from aws_sqlserver_ext.sysmail_help_profileaccount_sp();
```

下列範例依識別符、設定檔名稱或帳戶名稱篩選記錄。

```
select from aws_sqlserver_ext.sysmail_help_profileaccount_sp(par_profile_id := 1);
select from aws_sqlserver_ext.sysmail_help_profileaccount_sp(par_profile_id := 1, par_account_id := 1);
select from aws_sqlserver_ext.sysmail_help_profileaccount_sp(par_profile_name := 'Administrator');
select from aws_sqlserver_ext.sysmail_help_profileaccount_sp(par_account_name := 'Audit Account');
```

若要變更使用者設定檔名稱或描述，請使用 程序`sysmail_update_profile_sp`，如下所示。

```
select aws_sqlserver_ext.sysmail_update_profile_sp(
    par_profile_id := 2,
    par_profile_name := 'New profile name'
);
```

若要變更電子郵件帳戶設定，請使用 程序`ysmail_update_account_sp`，如下所示。

```
select from aws_sqlserver_ext.sysmail_update_account_sp (
    par_account_name := 'Audit Account',
    par_mailserver_name := 'arn:aws:lambda:region:XXXXXXXXXXXX:function:func_test',
    par_mailserver_type := 'AWSLAMBDA'
);
```