

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

# 使用 連接 Microsoft SQL Server AWS Schema Conversion Tool
<a name="CHAP_Source.SQLServer"></a>

您可以使用 AWS SCT 將結構描述、資料庫程式碼物件和應用程式程式碼從 SQL Server 轉換為下列目標：
+ Amazon RDS for MySQL
+ Amazon Aurora MySQL-Compatible Edition
+ Amazon RDS for PostgreSQL
+ Amazon Aurora PostgreSQL-Compatible Edition
+ Amazon RDS for SQL Server
+ Amazon RDS for MariaDB

**注意**  
AWS SCT 不支援使用 Amazon RDS for SQL Server 做為來源。

您可以使用 AWS SCT 建立評估報告，以將結構描述、資料庫程式碼物件和應用程式程式碼從 SQL Server 遷移至 Babelfish for Aurora PostgreSQL，如下所述。

**Topics**
+ [將 Microsoft SQL Server 作為來源的權限](#CHAP_Source.SQLServer.Permissions)
+ [使用 Microsoft SQL Server 做為來源時使用 Windows 身分驗證](#CHAP_Source.SQLServer.Permissions.WinAuth)
+ [以來源身分連線至 SQL Server](#CHAP_Source.SQLServer.Connecting)
+ [將 SQL Server 轉換到 MySQL](CHAP_Source.SQLServer.ToMySQL.md)
+ [使用 從 SQL Server 遷移至 PostgreSQL AWS Schema Conversion Tool](CHAP_Source.SQLServer.ToPostgreSQL.md)
+ [使用 從 SQL Server 遷移至 Amazon RDS for SQL Server AWS Schema Conversion Tool](CHAP_Source.SQLServer.ToRDSSQLServer.md)

## 將 Microsoft SQL Server 作為來源的權限
<a name="CHAP_Source.SQLServer.Permissions"></a>

做為來源的 Microsoft SQL Server 所需的權限如下：
+ VIEW DEFINITION
+ VIEW DATABASE STATE

`VIEW DEFINITION` 權限可讓具有公開存取權的使用者查看物件定義。 AWS SCT 會使用`VIEW DATABASE STATE`權限來檢查 SQL Server Enterprise Edition 的功能。

對您要轉換其結構描述的每個資料庫重複授予。

此外，請授與 `master` 資料庫的下列權限：
+ VIEW SERVER STATE
+ VIEW ANY DEFINITION

AWS SCT 使用 `VIEW SERVER STATE`權限來收集伺服器設定和組態。請務必授予檢視端點`VIEW ANY DEFINITION`的權限。

若要讀取 Microsoft Analysis Services 的相關資訊，請在 `master` 資料庫上執行下列命令。

```
EXEC master..sp_addsrvrolemember @loginame = N'<user_name>', @rolename = N'sysadmin'
```

在上述範例中，將`<user_name>`預留位置取代為您之前授予 權限的使用者名稱。

若要讀取 SQL Server Agent 的相關資訊，請將您的使用者新增至`SQLAgentUser`角色。在 `msdb` 資料庫上執行下列命令。

```
EXEC sp_addrolemember <SQLAgentRole>, <user_name>;
```

在上述範例中，請將 `<SQLAgentRole>` 預留位置替換為 SQL Server 代理程式角色的名稱。然後將`<user_name>`預留位置取代為您之前授予 權限的使用者名稱。如需詳細資訊，請參閱《*Amazon RDS 使用者指南*》中的「[將使用者新增至 SQLAgentUser 角色](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.SQLServer.CommonDBATasks.Agent.html#SQLServerAgent.AddUser)」。

若要偵測日誌傳送，請授與 `msdb` 資料庫的 `SELECT on dbo.log_shipping_primary_databases` 權限。

若要使用 DDL 複寫的通知方法，請在來源資料庫上授予 `RECEIVE ON <schema_name>.<queue_name>`權限。在此範例中，請將 `<schema_name>` 預留位置替換為您資料庫的結構描述名稱。接著將 `<queue_name>` 預留位置替換為佇列資料表的名稱。

## 使用 Microsoft SQL Server 做為來源時使用 Windows 身分驗證
<a name="CHAP_Source.SQLServer.Permissions.WinAuth"></a>

如果您的應用程式執行於以 Windows 為基礎的內部網路，您可以在存取資料庫時使用 Windows 驗證。Windows 驗證使用目前在作業系統執行緒上建立的 Windows 身分存取 SQL Server 資料庫。接著您可將 Windows 身分對應到 SQL Server 資料庫和許可。若要使用 Windows 驗證連接到 SQL Server，您必須指定應用程式使用正在使用的 Windows 身分。您也必須授予 Windows 身分對 SQL Server 資料庫的存取。

SQL Server 有兩種存取模式：Windows 驗證模式和混合模式。Windows 驗證模式可啟用 Windows 驗證並停用 SQL Server 驗證。混合模式可同時啟用 Windows 驗證和 SQL Server 驗證。Windows 驗證一律可用，且無法停用。如需有關 Windows 驗證的詳細資訊，請參閱 Microsoft Windows 文件。

在 TEST\$1DB 中建立使用者的可能範例如下

```
USE [TEST_DB]
CREATE USER [TestUser] FOR LOGIN [TestDomain\TestUser]
GRANT VIEW DEFINITION TO [TestUser]
GRANT VIEW DATABASE STATE TO [TestUser]
```

### 搭配 JDBC 連線使用 Windows 身分驗證
<a name="CHAP_Source.SQLServer.Permissions.WinAuth.JDBC"></a>

JDBC 驅動程式用於非 Windows 作業系統時，JDBC 驅動程式不支援 Windows 驗證。從非 Windows 作業系統連線至 SQL Server 時，不會自動指定 Windows 身分驗證登入資料，例如使用者名稱和密碼。在這種情況下，應用程式必須改用 SQL Server 身分驗證。

在 JDBC 連線字串中，`integratedSecurity` 參數必須指定使用 Windows 驗證連接。JDBC 驅動程式透過 `integratedSecurity` 連線字串參數支援 Windows 作業系統上的整合式 Windows 驗證。

使用整合式驗證

1. 安裝 JDBC 驅動程式。

1. 將 `sqljdbc_auth.dll` 檔案複製到安裝 JDBC 驅動程式之電腦的 Windows 系統路徑上的目錄。

   `sqljdbc_auth.dll` 檔案會安裝在下列位置：

   <*安裝目錄*>\$1sqljdbc\$1<*version*>\$1<*language*>\$1auth\$1

嘗試使用 Windows 驗證建立到 SQL Server 資料庫的連線時，您可能會收到錯誤：此驅動程式未設定使用整合式驗證。您可透過執行以下動作解決這個問題：
+ 宣告兩個變數，指向 JDBC 的安裝路徑：

   `variable name: SQLJDBC_HOME; variable value: D:\lib\JDBC4.1\enu` （您的 sqljdbc4.jar 存在的位置）；

  `variable name: SQLJDBC_AUTH_HOME; variable value: D\lib\JDBC4.1\enu\auth\x86` （如果您執行 32 位元作業系統） 或 `D\lib\JDBC4.1\enu\auth\x64`（如果您執行 64 位元作業系統）。這是您的 `sqljdbc_auth.dll` 所在的位置。
+ `sqljdbc_auth.dll` 複製到執行 JDK/JRE 的資料夾。您可以複製到 lib 資料夾、bin 資料夾等。例如，您可能會複製到下列資料夾。

  ```
  [JDK_INSTALLED_PATH]\bin;
  [JDK_INSTALLED_PATH]\jre\bin;
  [JDK_INSTALLED_PATH]\jre\lib;
  [JDK_INSTALLED_PATH]\lib;
  ```
+ 請確定您的 JDBC 程式庫資料夾中只有 SQLJDBC4.jar 檔案。從該資料夾移除任何其他 sqljdbc\$1.jar 檔案 （或將其複製到另一個資料夾）。如果您要新增驅動程式做為程式的一部分，請確定您只新增 SQLJDBC4.jar 做為要使用的驅動程式。
+ 複製應用程式資料夾內的 sqljdbc\$1auth.dll 檔案。

**注意**  
如果您執行 32 位元 Java 虛擬機器 (JVM)，請使用 x86 資料夾中的 sqljdbc\$1auth.dll 檔案，即使作業系統為 x64 版本。如果您在 x64 處理器上執行 64 位元 JVM，請使用 x64 資料夾中的 sqljdbc\$1auth.dll 檔案。

連接到 SQL Server 資料庫時，您可以選擇 **Windows 驗證**或 **SQL Server 驗證**做為**驗證**選項。

## 以來源身分連線至 SQL Server
<a name="CHAP_Source.SQLServer.Connecting"></a>

使用以下程序，透過 AWS Schema Conversion Tool連接到您的 Microsoft SQL Server 來源資料庫。

**若要連接到 Microsoft SQL Server 來源資料庫**

1. 在 中 AWS Schema Conversion Tool，選擇**新增來源**。

1. 選擇 **Microsoft SQL Server**，然後選擇**下一步**。

   新增**來源**對話方塊隨即出現。

1. 在**連線名稱**中，輸入資料庫的名稱。 會在左側面板的樹狀目錄中 AWS SCT 顯示此名稱。

1. 使用來自 的資料庫登入資料 AWS Secrets Manager 或手動輸入：
   + 若要從 Secrets Manager 使用資料庫登入資料，請使用下列指示：

     1. 針對 **AWS Secret**，選擇秘密的名稱。

     1. 選擇**填入**，從 Secrets Manager 自動填入資料庫連線對話方塊中的所有值。

     如需從 Secrets Manager 使用資料庫登入資料的資訊，請參閱 [在 AWS Secrets Manager 中設定 AWS Schema Conversion Tool](CHAP_UserInterface.SecretsManager.md)。
   + 若要手動輸入 Microsoft SQL Server 來源資料庫連線資訊，請使用下列指示：  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/SchemaConversionTool/latest/userguide/CHAP_Source.SQLServer.html)

1. 選擇**測試連線**以驗證 AWS SCT 可以連接到您的來源資料庫。

1. 選擇**連線**以連線至來源資料庫。

# 將 SQL Server 轉換到 MySQL
<a name="CHAP_Source.SQLServer.ToMySQL"></a>

若要在轉換後的 MySQL 程式碼中模擬 Microsoft SQL Server 資料庫函數，請使用 SQL Server 到 MySQL 延伸套件 AWS SCT。如需詳細了解延伸套件，請參閱：[搭配 使用延伸套件 AWS Schema Conversion Tool](CHAP_ExtensionPack.md)。

**Topics**
+ [MySQL 做為目標資料庫的權限](#CHAP_Source.SQLServer.ToMySQL.ConfigureTarget)
+ [SQL Server 到 MySQL 的轉換設定](#CHAP_Source.SQLServer.ToMySQL.ConversionSettings)
+ [遷移考量事項](#CHAP_Source.SQLServer.ToMySQL.MigrationConsiderations)

## MySQL 做為目標資料庫的權限
<a name="CHAP_Source.SQLServer.ToMySQL.ConfigureTarget"></a>

做為目標的 MySQL 所需的權限如下：
+ CREATE ON \$1.\$1
+ ALTER ON \$1.\$1
+ DROP ON \$1.\$1
+ INDEX ON \$1.\$1
+ ON \$1.\$1 參考資料
+ SELECT ON \$1.\$1
+ 在 \$1.\$1 上建立檢視
+ SHOW VIEW ON \$1.\$1
+ 觸發開啟 \$1.\$1
+ 建立路由開啟 \$1.\$1
+ ALTER ROUTINE ON \$1.\$1
+ EXECUTE ON \$1.\$1
+ INSERT，更新 AWS\$1SQLSERVER\$1EXT.\$1
+ 在 AWS\$1SQLSERVER\$1EXT\$1DATA 上插入、更新、刪除。\$1
+ 在 AWS\$1SQLSERVER\$1EXT\$1DATA 上建立暫存資料表。\$1

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

```
CREATE USER 'user_name' IDENTIFIED BY 'your_password';
GRANT CREATE ON *.* TO 'user_name';
GRANT ALTER ON *.* TO 'user_name';
GRANT DROP ON *.* TO 'user_name';
GRANT INDEX ON *.* TO 'user_name';
GRANT REFERENCES ON *.* TO 'user_name';
GRANT SELECT ON *.* TO 'user_name';
GRANT CREATE VIEW ON *.* TO 'user_name';
GRANT SHOW VIEW ON *.* TO 'user_name';
GRANT TRIGGER ON *.* TO 'user_name';
GRANT CREATE ROUTINE ON *.* TO 'user_name';
GRANT ALTER ROUTINE ON *.* TO 'user_name';
GRANT EXECUTE ON *.* TO 'user_name';
GRANT INSERT, UPDATE ON AWS_SQLSERVER_EXT.* TO 'user_name';
GRANT INSERT, UPDATE, DELETE ON AWS_SQLSERVER_EXT_DATA.* TO 'user_name';
GRANT CREATE TEMPORARY TABLES ON AWS_SQLSERVER_EXT_DATA.* TO 'user_name';
```

在上述範例中，請將 *user\$1name* 替換為您的使用者名稱。然後，將 *your\$1password* 替換為一個安全的密碼。

如果您使用 MySQL 資料庫 5.7 版或更低版本做為目標，請執行下列命令。對於 MySQL 資料庫 8.0 版和更新版本，此命令已棄用。

```
GRANT SELECT ON mysql.proc TO 'user_name';
```

若要使用 Amazon RDS for MySQL 或 Aurora MySQL 作為目標，請將 `lower_case_table_names` 參數設定為 `1`。此值意味著 MySQL 服務器在處理資料表、索引、觸發程式和資料庫等對象名稱的識別碼時不區分大小寫。如果您已在目標執行個體中開啟二進位記錄功能，請將 `log_bin_trust_function_creators` 參數設定為 `1`。在這種情況下，您不需要使用 `DETERMINISTIC`、`READS SQL DATA` 或 `NO SQL` 特性來建立已儲存的函數。若要設定這些參數，請建立新的參數群組，或是修改現有的資料庫參數群組。

## SQL Server 到 MySQL 的轉換設定
<a name="CHAP_Source.SQLServer.ToMySQL.ConversionSettings"></a>

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

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

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

  例如，若要將已轉換程式碼中的註解數量降到最低，請選擇**僅限錯誤**。若要在已轉換的程式碼中包含所有動作項目的註解，請選擇**所有訊息**。
+ 若要允許來源 SQL Server 資料庫將 的輸出存放在資料表`EXEC`中。 會 AWS SCT 建立暫存資料表和模擬此功能的額外程序。若要使用此模擬，請選取**建立其他常式以處理開啟的資料集**。

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

將 SQL Server 結構描述遷移至 MySQL 時，請考慮下列事項：
+ MySQL 不支援 `MERGE`陳述式。不過， AWS SCT 可以使用 `INSERT ON DUPLICATE KEY`子句和 `MERGE`陳述式，在轉換期間模擬`UPDATE FROM and DELETE FROM`陳述式。

  若要使用 正確模擬`INSERT ON DUPLICATE KEY`，請確定目標 MySQL 資料庫上存在唯一的限制條件或主索引鍵。
+ 您可以使用`GOTO`陳述式和標籤來變更陳述式執行的順序。任何遵循陳述式的 Transact-SQL `GOTO`陳述式都會略過，處理會在 標籤繼續。您可以在程序、批次或`GOTO`陳述式區塊內的任何位置使用陳述式和標籤。您也可以巢狀`GOTO`化陳述式。

  MySQL 不使用 `GOTO` 陳述式。當 AWS SCT 轉換包含`GOTO`陳述式的程式碼時，它會將陳述式轉換為使用 `BEGIN…END`或 `LOOP…END LOOP`陳述式。您可以在下表中找到如何 AWS SCT 轉換`GOTO`陳述式的範例。  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/SchemaConversionTool/latest/userguide/CHAP_Source.SQLServer.ToMySQL.html)
+ MySQL 不支援多陳述式資料表值函數。 透過建立暫存資料表和重寫陳述式來使用這些暫存資料表，在轉換期間 AWS SCT 模擬資料表值函數。

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

# 使用 從 SQL Server 遷移至 Amazon RDS for SQL Server AWS Schema Conversion Tool
<a name="CHAP_Source.SQLServer.ToRDSSQLServer"></a>

將 SQL Server 結構描述和程式碼遷移到 Amazon RDS for SQL Server 的一些考量事項：
+ AWS SCT 可以轉換 SQL Server Agent，以在 Amazon RDS for SQL Server 資料庫執行個體上提供排程、提醒和任務。轉換後，您可以將 Amazon RDS for SQL Server 資料庫執行個體搭配 SQL Server Reporting Service (SSRS)、SQL Server Analysis Services (SSAS) 和 SQL Server Integration Services (SSIS) 使用。
+ Amazon RDS 目前不支援 SQL Server Service Broker，或其他需要您執行 CREATE ENDPOINT 命令的 T-SQL 端點。
+ Amazon RDS 對連結伺服器提供有限的支援。轉換使用連結伺服器的 SQL Server 應用程式程式碼時， 會 AWS SCT 轉換應用程式程式碼。不過，請務必檢閱使用連結伺服器之物件的行為，然後再執行轉換的程式碼。
+ 系統會使用 Always on。
+  AWS SCT 評估報告提供轉換的伺服器指標。這類有關 SQL Server 執行個體的各項指標包括：
  + 已使用資料鏡像。
  + 已設定 SQL Server 記錄傳送。
  + 已使用容錯移轉叢集。
  + 已設定 Database Mail。
  + 已使用全文檢索搜尋服務。Amazon RDS for SQL Server 具備有限的全文檢索搜尋功能，而且不支援語意搜尋。
  + 已安裝 Data Quality Service (DQS)。Amazon RDS 不支援 DQS，因此建議您在 Amazon EC2 執行個體上安裝 SQL Server。

## RDS for SQL Server 做為目標的權限
<a name="CHAP_Source.SQLServer.ToRDSSQLServer.ConfigureTarget"></a>

若要遷移至 RDS for SQL Server，請建立資料庫使用者，然後授予每個資料庫所需的權限。您可以使用下列程式碼範例。

```
CREATE LOGIN user_name WITH PASSWORD 'your_password';
                
USE db_name
CREATE USER user_name FOR LOGIN user_name
GRANT VIEW DEFINITION TO user_name
GRANT VIEW DATABASE STATE TO user_name
GRANT CREATE SCHEMA TO user_name;
GRANT CREATE TABLE TO user_name;
GRANT CREATE VIEW TO user_name;
GRANT CREATE TYPE TO user_name;
GRANT CREATE DEFAULT TO user_name;
GRANT CREATE FUNCTION TO user_name;
GRANT CREATE PROCEDURE TO user_name;
GRANT CREATE ASSEMBLY TO user_name;
GRANT CREATE AGGREGATE TO user_name;
GRANT CREATE FULLTEXT CATALOG TO user_name;
GRANT CREATE SYNONYM TO user_name;
GRANT CREATE XML SCHEMA COLLECTION TO user_name;
```

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