Db2 for i のテーブル、スキーマの2つの作成方法での差異

[前の記事](https://qiita.com/gomAnomalocaris/items/7d94c7661ebeaf148ce8)で取り上げたようにDb2 for i ではテーブル（IBM i 用語ではPF、カッコ内以下同様）のトランザクションログ（ジャーナル）の取得は必須ではありません。
また、Db2 for i のデータベースオブジェクトを作成する方法も従来からあるIBM i OSコマンドとSQLの2つがありますが、テーブルとスキーマをIBM i OSコマンドで作成するとジャーナルは自動で取得されませんが、SQLで作成するとジャーナルが自動で取得されます。正確にはCREATE SCHEMAで作成されたスキーマ（ライブラリー）にCREATE TABLEでPFを作成することでジャーナルが自動取得されるようになります。
かつてはSQLからPF, ライブラリーを作成しても自動的にジャーナル取得はされませんでした、記憶ではIBM i 7.1あたりからの仕様変更だったと思います。

## Db2 for i でのスキーマ作成方法2種

### スキーマの作成
以下のように **CRTLIBコマンド、SQLでCREATE SCHEMA**　の2つの方法があります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/4516e61c-88d4-e7a7-4d17-e40d8584896e.png)

この時点で作成されたスキーマを確認してみると、
**CRTLIBコマンドで作成したスキーマ内には何もオブジェクトがありません**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/c766f016-6eb9-a5ae-9368-4c821609a250.png)

**一方、CREATE SCHEMAしたスキーマでは、ジャーナル、ジャーナルレシーバー、それにシステムで使用するテーブルが19個（IBM i 7.4の場合）作成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/f58e403c-d1e1-43ff-9839-61e46c1c3fd2.png)

### さらに2つの方法でテーブルを作成してみる
上記で作成したスキーマにIBM i OSコマンド、SQLでテーブルを作成してみます。
テーブルのカラム定義（DDS）はDEMOLIB/QDDSSRCに用意しました。以下のような感じです（一部分）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/1e266b1a-ccf5-ce61-74ab-f1238902275b.png)

CRTPFコマンドで上記のDDSからテーブルを作成します。
**CRTPF FILE(GOMALIB6/TOKMASP) SRCFILE(DEMOLIB/QDDSSRC)**

続けてCREATE SCHEMAしたスキーマにSQLでテーブルを作成しますが、ここでは上で作成したテーブルからSQL DDLを作成してみます。ACSのスキーマ表示画面などから上で作成したGOMALIB6/TOKMASPを表示します。
※ACSのスキーマ表示はデフォルトではサインオンしているユーザープロフィールのデフォルトライブラリーリストのものしか表示されないので、スキーマの組込みメニューからGOMALIB6を追加します。
GOMALIB6を展開して表をクリックし、TOKMASPが表示し、さらに右クリックして **SQLの生成** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/3668b735-cbf9-5648-5851-1145aa5666ef.png)

IBM i 7.4では生成したSQL DDLを別ウィンドウのSQLスクリプト実行画面に表示させるか、テキストファイルに保存することが出来ます。ここではSQLスクリプト実行画面に表示させます。（下図）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/172d548b-e173-c961-6e34-97f2ca8b491a.png)

このDDLのスキーマ名をすべてGOMALIB7に変更して実行するとTOKMASP6にCRTPFで作成したのと同じ定義のテーブルが作成されます。この例では数個のSQLステートメントが実行され、テーブルが作成されます。

## 2つの方法で作成されたテーブルを比較する
どちらのテーブルもカラム(フィールド)属性などは同一ですが、いくつかの属性が異なります。ここではジャーナル（トランザクションログ）の取得状況について確認してみます。

DSPPFコマンドで作成した2つのテーブルを確認すると、**CRTLIB/CRTPFで作成したテーブルではジャーナル処理が開始されていません(ファイルは現在ジャーナル処理中 NO)**
GOMALIB6/TOKMASP
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/ddcbc087-3e7b-521a-5f1f-44e4c771d480.png)

一方、**CREATE SHCEMAで作成したテーブルはジャーナルが*BOTHイメージでジャーナルGOMALIB7/QSQJRNに取得開始されています。**
GOMALIB7/TOKMASP
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/895933e7-777b-94f8-526e-f8ba9b026c9d.png)

以上のようにスキーマ、テーブルの作成コマンドによってテーブル作成時点でジャーナル取得状況が変わることが分かります。もちろん、CRTPFしたテーブルもSTRJRNPFコマンドを実行してジャーナル取得することは可能です。

## 2/27追記：guriguriさんコメントの検証結果
Q2) もしも 4 パターンが可能な場合、テーブルのいくつかの属性が異なるのは、スキーマ作成方法とテーブル作成方法のどちらに起因しますか？

上記を検証してみました。IBM i 7.5(執筆時点の最新OSバージョン）です。
**スキーマ（ライブラリー）を作成するコマンドがIBM i OS CRTLIBコマンドの場合、その中に作成されるテーブル(PF)はCRTPF, CREATE TABLEどちらの場合もジャーナル（トランザクションログ）は取得開始になりませんでした。
一方、CREATE SCHEMAで作成したスキーマ（ライブラリー）に作成したテーブル(PF)はCRTPF, CREATE TABLEどちらのコマンドでもジャーナルは取得開始時状態で作成されました。**

※私の（やや遠い）記憶では、CREATE SHCEMAしてもCRTPFで作成したPFはジャーナルが自動開始にならなかったと思います。最近のIBM i OSのどこかのバージョンで変わったのかもしれません。（間違えて覚えているだけかもしれませんが‥^^;）


※CREATE SCHEMAで自動作成されたテーブルたちは何？などは別途追記してみたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/77c9dbd6-439b-ead0-c00e-dd37e94528ef.png)