

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# を使用した SQL Server から PostgreSQL への移行 AWS Schema Conversion Tool
<a name="CHAP_Source.SQLServer.ToPostgreSQL"></a>

 AWS SCTでは、SQL サーバーから PostgreSQL への拡張パックを使用できます。この拡張パックは、変換された PostgreSQL コード内の SQL Server データベース関数をエミュレートします。SQL Server から PostgreSQL への拡張パックを使用すると、SQL Server エージェントと SQL Server データベースメールをエミュレートできます。拡張パックの詳細については、「[での拡張パックの使用 AWS Schema Conversion Tool](CHAP_ExtensionPack.md)」を参照してください。

**Topics**
+ [ターゲットデータベースとしての PostgreSQL の権限](#CHAP_Source.SQLServer.ToPostgreSQL.ConfigurePostgreSQL)
+ [SQL Server から 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 エージェントをエミュレートする](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 をターゲットとして使用するには、 `CREATE ON DATABASE` 権限 AWS SCT が必要です。ターゲット 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 Server から 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>** PostgreSQL のスキーマ名として SQL サーバのスキーマ名を使用します。
  + [**<source\$1db>\$1<schema>**] – SQL Server データベースとスキーマ名の組み合わせを PostgreSQL のスキーマ名として使用します。
+ ソースオブジェクト名の大文字と小文字を維持する。

  オブジェクト名が小文字に変換されないようにするには、**[大文字と小文字を区別する操作では小文字へのキャストを避ける]** を選択します。このオプションは、ターゲットデータベースで大文字と小文字の区別オプションをオンにした場合にのみ適用されます。
+ ソースデータベースのパラメータ名をそのまま使用する。

  変換されたコード内のパラメータ名に二重引用符を追加するには、**[元のパラメータ名を保持]** を選択します。

## 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 を提供します。これを行うには、プロジェクトのプロパティで**一意のインデックス名を生成する**オプションを選択します。デフォルトでは、この機能は有効になっています。このオプションが有効になっている場合、一意のインデックス名が IX\$1table\$1name\$1index\$1name 形式を使用して作成されます。このオプションが無効になっている場合、インデックス名は変更されません。
+ GOTO ステートメントとラベルを使用して、ステートメントを実行する順序を変更できます。GOTO ステートメントに続くすべての Transact-SQL ステートメントはスキップされ、ラベルで処理が継続されます。GOTO ステートメントとラベルはプロシージャ、バッチ、またはステートメントブロックの任意の場所で使用できます。GOTO ステートメントをネストすることもできます。

  PostgreSQL は GOTO ステートメントを使用しません。は、GOTO ステートメントを含むコードを AWS SCT 変換すると、BEGIN...END または LOOP...END LOOP ステートメントを使用するようにステートメントを変換します。が GOTO ステートメントを AWS SCT 変換する方法の例を次の表に示します。  
**SQL Server の GOTO ステートメントと、変換された PostgreSQL ステートメント**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/SchemaConversionTool/latest/userguide/CHAP_Source.SQLServer.ToPostgreSQL.html)
+ PostgreSQL は MERGE ステートメントをサポートしていません。 は次の方法で MERGE ステートメントの動作を AWS SCT エミュレートします。
  + 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 トリガーアクションの条件を設定できます。 は、DML トリガーステートメント内でこれらのテーブルの使用を変換 AWS SCT できます。
+ 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 に変換する場合、 は PATINDEX を使用するアプリケーションコードを aws\$1sqlserver\$1ext.patindex(<pattern character>, <expression character varying>) に置き換え AWS SCT ます。
+ SQL Server では、ユーザー定義のテーブルタイプは、テーブル構造の定義を表すタイプです。ユーザー定義のテーブル型を使用して、ストアドプロシージャまたは関数のテーブル値パラメータを宣言します。ユーザー定義のテーブルタイプを使用して、バッチまたはストアドプロシージャまたは関数の本文で使用するテーブル変数を宣言することもできます。 は、一時テーブルを作成して、PostgreSQL でこのタイプを AWS SCT エミュレートしました。

SQL Server から PostgreSQL に変換する場合、 は SQL Server システムオブジェクトを PostgreSQL 内の認識可能なオブジェクト AWS SCT に変換します。次の表に、システムオブジェクトの変換方法を示します。

 


| 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 エージェントをエミュレートする
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Agent"></a>

SQL Server エージェントは、SQL Server ジョブを実行する Microsoft Windows サービスです。SQL Server エージェントは、スケジュールに従って、特定のイベントに応答して、またはオンデマンドでジョブを実行します。SQL Server エージェントの詳細については、『[Microsoft 技術ドキュメント](https://docs.microsoft.com/en-us/sql/ssms/agent/sql-server-agent?view=sql-server-ver15)』を参照してください。

PostgreSQL には、SQL Server エージェントに相当するものはありません。SQL Server エージェント機能をエミュレートするために、 は拡張パック 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 は、1 つの 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 エージェントの動作をエミュレートするために、 AWS SCT 拡張パックでは次のテーブルと手順も作成されます。

## PostgreSQL で SQL Server エージェントをエミュレートするテーブル
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Agent.Tables"></a>

SQL Server エージェントをエミュレートするために、拡張パックは次のテーブルを使用します。

**sysjobs**  
ジョブに関する情報を格納します。

**sysjobsteps**  
ジョブのステップに関する情報を格納します。

**sysschedules**  
ジョブスケジュールに関する情報を格納します。

**sysjobschedules**  
個々のジョブのスケジュール情報を格納します。

**sysjobhistory**  
スケジュールされたジョブの実行に関する情報を格納します。

## PostgreSQL で SQL Server エージェントをエミュレートするプロシージャ
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Agent.Procedures"></a>

SQL Server エージェントをエミュレートするために、拡張パックでは以下の手順を使用します。

**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\$1identifier、sp\$1verify\$1schedule\$1identifiers**  
設定を確認する内部プロシージャ。

## PostgreSQL で SQL サーバーエージェントをエミュレートするプロシージャの構文
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Agent.Syntax"></a>

拡張パック内の `aws_sqlserver_ext.sp_add_job` プロシージャは、`msdb.dbo.sp_add_job` プロシージャをエミュレートします。SQL Server エージェントプロシージャの詳細については、『[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 エージェントプロシージャの詳細については、『[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 エージェントプロシージャの詳細については、『[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 エージェントプロシージャの詳細については、『[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 エージェントプロシージャの詳細については、『[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 エージェントプロシージャの詳細については、『[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 エージェントプロシージャの詳細については、『[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 エージェントプロシージャの詳細については、『[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 エージェントプロシージャの詳細については、『[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 エージェントプロシージャの詳細については、『[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 エージェントプロシージャの詳細については、『[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 エージェントプロシージャの詳細については、『[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 エージェントプロシージャの詳細については、『[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 エージェントプロシージャの詳細については、『[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 エージェントをエミュレートするプロシージャを使用する場合の例
<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 サーバーエージェントをエミュレートするためのユースケースの例
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Agent.UseCases"></a>

ソースデータベースコードが SQL Server エージェントを使用してジョブを実行する場合は、 の SQL Server から PostgreSQL への拡張パックを使用して AWS SCT 、このコードを PostgreSQL に変換できます。拡張機能パックは、 AWS Lambda 関数を使用して SQL Server エージェントの動作をエミュレートします。

新しい AWS Lambda 関数を作成するか、既存の関数を登録できます。

**新しい AWS Lambda 関数を作成するには**

1. ターゲットデータベースツリー AWS SCTで、コンテキスト (右クリック) メニューを開き、**拡張パックの適用**を選択し、**PostgreSQL** を選択します。

   拡張パックウィザードが表示されます。

1. [**SQL Server エージェントエミュレーションサービス**] タブで、次の操作を行います。
   + ** 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 リソースネーム (ARN) です。

次の例では、1 つのステップで構成されるシンプルなタスクを作成します。このタスクでは、5 分ごとに以前に作成された `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 データベース メールを使用すると、SQL Server データベース エンジンまたは Azure SQL Managed Instance からユーザーに電子メール メッセージを送信できます。これらのメールメッセージには、クエリ結果を含めたり、ネットワーク上の任意のリソースからのファイルを含めることができます。SQL Server データベースメールの詳細については、『[Microsoft 技術ドキュメント](https://docs.microsoft.com/en-us/sql/relational-databases/database-mail/database-mail?view=sql-server-ver15)』を参照してください。

PostgreSQL には SQL Server データベースメールに相当するものはありません。SQL Server データベースメール機能をエミュレートするために、 AWS SCT は拡張パックを作成します。この拡張パックは、 AWS Lambda と Amazon Simple Email Service (Amazon SES) を使用します。 AWS Lambda は、Amazon SES E メール送信サービスとやり取りするためのインターフェイスをユーザーに提供します。このインタラクションを設定するには、Lambda 関数の Amazon リソースネーム (ARN) を追加します。

新しいE メールアカウントの場合、次のコマンドを使用します。

```
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 を既存の E メールアカウントに追加するには、次のコマンドを使用します。

```
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 データベースメールの動作をエミュレートするために、 AWS SCT 拡張パックは次のテーブル、ビュー、およびプロシージャを使用します。

## PostgreSQL で SQL サーバーデータベースメールをエミュレートするテーブル
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.Tables"></a>

SQL Server データベースメールをエミュレートするために、拡張パックは次のテーブルを使用します。

**sysmail\$1account**  
E メールアカウントに関する情報を格納します。

**sysmail\$1profile**  
ユーザープロファイルに関する情報を格納します。

**sysmail\$1server**  
E メールサーバに関する情報を格納します。

**sysmail\$1mailitems**  
メールメッセージのリストを保存します。

**sysmail\$1attachments**  
E メール添付ごとに 1 つの行が含まれます。

**sysmail\$1log**  
E メール送信に関するサービス情報を格納します。

**sysmail\$1profileaccount**  
ユーザープロファイルとE メールアカウントに関する情報を格納します。

## PostgreSQL で SQL サーバーデータベースメールをエミュレートするビュー
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.Views"></a>

SQL Server データベースメールをエミュレートするために、 は互換性を確保するために PostgreSQL データベースに次のビュー AWS SCT を作成します。拡張パックではこれらのビューを使用しませんが、変換したコードでこれらのビューをクエリできます。

**sysmail\$1allitems**  
すべてのメールのリストが含まれます。

**sysmail\$1faileditems**  
送信できなかったメールのリストが含まれます。

**sysmail\$1sentitems**  
送信済みメールのリストが含まれます。

**sysmail\$1unsentitems**  
まだ送信されていないメールのリストが含まれます。

**sysmail\$1mailattachments**  
添付ファイルのリストが含まれます。

## PostgreSQL で SQL サーバーデータベースメールをエミュレートするプロシージャ
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.Procedures"></a>

SQL Server データベースメールをエミュレートするために、拡張パックは次の手順を使用します。

**sp\$1send\$1dbmail**  
指定した受信者に E メールを送信します。

**sysmail\$1add\$1profile\$1sp**  
新しいユーザープロファイルを作成します。

**sysmail\$1add\$1account\$1sp**  
簡易メール転送プロトコル (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**  
E メールアカウントを削除します。

**sysmail\$1delete\$1profile\$1sp**  
ユーザープロファイルを削除します。

**sysmail\$1delete\$1mailitems\$1sp**  
内部テーブルからメールを削除します。

**sysmail\$1help\$1profile\$1sp**  
ユーザープロファイルに関する情報を表示します。

**sysmail\$1help\$1account\$1sp**  
E メールアカウントに関する情報を表示します。

**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 データベースメールのソース手順の詳細については、『[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 データベースメールのソース手順の詳細については、『[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 データベースメールのソース手順の詳細については、『[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 データベースメールのソース手順の詳細については、『[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 データベースメールのソース手順の詳細については、『[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 データベースメールのソース手順の詳細については、『[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 データベースメールのソース手順の詳細については、『[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 データベースメールのソース手順の詳細については、『[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 データベースメールのソース手順の詳細については、『[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 データベースメールのソース手順の詳細については、『[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 データベースメールのソース手順の詳細については、『[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 データベースメールのソース手順の詳細については、『[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 データベースメールのソース手順の詳細については、『[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 データベースメールのソース手順の詳細については、『[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>

E メールを送信するには、次に示す `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'
);
```

次の例は、クエリ結果を E メールで送信する方法を示しています。

```
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 コードを使用して E メールを送信する方法を示しています。

```
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'
);
```

E メールを削除するには、次に示す `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
);
```

次の例は、最も古い E メールを削除する方法を示しています。

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

次の例は、送信できないすべての E メールを削除する方法を示しています。

```
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 データベースメールを使用して E メールを送信する場合は、 AWS SCT 拡張パックを使用してこのコードを PostgreSQL に変換できます。

**PostgreSQL データベースからE メールを送信するには**

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` 関数を使用して E メールを送信します。

   ```
   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();
```

次の例では、特定のE メールアカウントに関する情報を表示します。

```
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'
);
```