}4. I言語とリレーショナルデータベースの学習


4.1 I言語がリレーショナルデータベースに設定する内容。
★下記の説明はMicrosoftSQLServerの場合の説明です。他のRDBMSは同じようには出来ないので、内容が異なる部分が有ります。
(1)I言語では4文字の英字の許可を設定しデータベースを許可を単位として持ちます。
(2)データベースは許可を単位として4個作られます、2個は本番用で残りの2個はテスト用です。2個の内1個は長期間存在するテーブル用で、もう一個は作業用の一時的にテーブルを作ってすぐ消す場合のテーブル用です。
(3)具体的には次のような名前でデータベース名が作られます。
(3.1)I_システム名_R_M_許可名---RはREAL(本番用)で、MはMASTER(コンピュータ用語で都度発生するデータがトランザクションで、長期間存在するデータをマスタと呼びます)の先頭文字です。
(3.2)I_システム名_R_W_許可名---WはWORK(作業用)の先頭文字です。
(3.3)I_システム名_T_M_許可名---TはTEST(テスト用)の先頭文字です。
(3.4)I_システム名_T_W_許可名。
(4)SQL Serverに対するログイン名は許可に対して8個作られます。
★データベース内はログイン名では無くユーザー名を使いますが、I言語ではログイン名とユーザー名は同じ綴りとなります。
(4.1)I_システム名_R_D_許可名---DはDB OWNER(DBの管理者)の先頭文字です。
★本番中で命令の先頭に'DBO_'を付加するとこのユーザー名で接続されます、ただし、’DBO_'を付けられるジョブは認証が'A'(管理者用認証)又は許可が'ZZZZ'(共通システム用許可)に限ります。
★4個のデータベースに対し全権限が有ります。
(4.2)I_システム名_R_I_許可名---IはINPUT(更新可能)の先頭文字です。
★本番中でジョブの処理種類がINPUTの時このログイン名で接続されます。
★W(WORK)には全権限(データベースの管理者)、M(MASTER)にはINSERT,UPDATE,SELECTの権限が有ります。(注:DELETE権限は有りません)
★I言語の場合行の削除はDELETEで物理削除をしないで、UPDATEでZ_CANCELに削除日を入れる論理削除の方法を取っています、理由は削除履歴を残す為です、よって、DELETEの権限は有りません。
(4.3)I_システム名_R_O_許可名---OはOUTPUT(更新不可、検索のみ)の先頭文字です。
★本番中でジョブの処理種類がOUTPUTの時このログイン名で接続されます。
★W(WORK)には全権限(データベースの管理者)、M(MASTER)にはSELECTの権限が有ります。
(4.4)I_システム名_R_L_許可名---LはLINK(リンクサーバー用)の先頭文字です。
★リンクサーバー設定用です。
(4.5)I_システム名_T_D_許可名---TはTEST(テスト用)の先頭文字です。
★4.5以降はテスト中にみ使われます。
★4.5以降はテスト用は権限が上記と同じですが、本番用のデータベースには一切の権限が有りません。
(4.6)I_システム名_T_I_許可名
(4.7)I_システム名_T_O_許可名
(4.8)I_システム名_T_L_許可名
4.2 I言語の命名規約。
(1)I言語ではテーブル名に規約を設ける事で、I言語自体のプログラムも簡単にしています。
(2)テーブル名の先頭は許可名と同じにする必要があります、(注意:VER21以前は列名も先頭は許可にする必要が有ります)このようにする事で権限の設定を許可単位に簡単に設定できるようにしています。更に許可の後にサブシステムの区分の意味で2文字の部分を付加する事を推奨しています。又テーブル名がプログラム内で容易に探し出せるように最後の文字は'実表'か'_TABLE'とする必要が有ります。
(3)許可と部分はメニューでジョブを設定する時に指定し、テーブル名は「?_MM?テーブル名」の_MMのように_で始まるシステム変数を?で囲って内容を設定する事で「I_システム名_[R又はT]_M_許可.DBO.許可+部分」(DBOはスキーマ名で固定です)とデータベース名とスキーマ名更に許可と部分がテーブル名の先頭に付加されるようになっています。
4.3 I言語とSQLの関係。
(1)SQL文は簡単ですので、さほどI言語で対応しなくても、簡単に早く作る事ができますが、それでも全てをSQL文で作るには時間がかかるので、この部分もI言語で対応しています。
(2.1)テーブルを作成する その1「CREATE_TABLE[2]{?_WORK_TABLE?A}{[主キー定義,.]}{[データ定義,.]}」
★'2'を書くとZ_CANCEL等I言語が使う列名を付加しません。
(2.2)テーブルを作成する その2「COPY_TABLE{?_WORK_TABLE?A}{旧テーブル名}{NOT}」
★既に存在するテーブルを雛形として作成します。
(3)テーブルを削除する。「DROP_TABLE{?_WORK_TABLE?A}」
★ワークデータベース内の一時テーブルを消します。
(4)インデックスを作成する。「CREATE_INDEX{テーブル名}{インデックス番号}{キー名,..}」
★インデックス番号は0から9で、0は主キー用と成ります。
(5)インデックスを削除する。「DROP_INDEX{テーブル名}{インデクス番号}
(6)ビューを作成する。「CREATE_OBJECT{ビュー名}{VIEW}{定義}」
(7)ビューを削除する。「DROP_OBJECT{ビュー名}{VIEW}」
(8.1)権限を作成する その1。「GRANT{テーブル名}{}{[PUBLIC,LINK]}」
★該当許可のユーザーに対しIはINPUT,UPDATE,SELECTのOはSELECTの権限をテーブルに与えます。
(8.2)権限を作成する その2。「GRANT_PERMISSION{オブジェクト}{[対象]}{許可}{[ユーザ]}」
★他の許可のユーザーに対し該当オブジェクトにSELECT権限を与えます。
(9)権限を削除する文。「REVOKE_PERMISSION{オブジェクト名{[対象]}{許可}{ユーザ}」
★他の許可のユーザーに与えた権限を取ります。
(10.1)トランザクションを開始する。「SQL{BEGIN TRANSACTION}」 
(10.2)トランザクションを確定する。「SQL{COMMIT TRANSACTION}」
(10.3)トランザクションを取り消す。「SQL{ROLLBACK TRANSACTION}」
(11.1)行を更新する その1「PROGRAM{テーブル名}{キー名,..}{データ名,..}{操作}
★操作が1は削除、2は作成、3は修正と成ります。
(11.2)行を更新する その2「REPLACE_ALL[2]{出力テーブル名}{入力テーブル名}{キー列名,..}{データ列名,..}{出力条件}{入力条件}
★'ALL'は全行対象で、'PART'にするとに入力テーブルに有るデータのみで、'ADD'にすると作成のみで、'CHANGE'にすると修正のみで,CANCEL'にすると削除のみ実行します。
★'2'を書くと入力テーブル名に対しZ_CANCELによる論理削除の判定をしません。
(11.3)行を更新する その3「INSERT{テーブル名}{データ名,...}」
(11.4)行を更新する その4「INSERT_FILE{テーブル名}{列名,...}{ファイル名}{[エンコード][,レコード区切り指定]}」
★ファイルからINSERTします。
(11.5)行を更新する その5「SQL[_REAL_TEST]{SQL文}」
★SQL文を全て組み立てて使用する場合に使います。
★_REAL_TESTを付加すると本番用とテスト用の両方のテーブルに対し処理を実行します。
(11.6)行を更新する その6「UPDATE{更新テーブル名}{更新列名[,...]}{更新データ[,...]}{他のテーブル名含む以降のSQL文}」
★複数テーブル使用のUPDATEをRDBMSに合わせ組立実行します。
(12.1)行を検索する その1。「PROGRAM{テーブル名}{キー名,..}{データ名,..}{0}」
(12.2)行を検索する その2。「SQL_FILE[2]{付加ファイル名}{[OT,ADD]}{[エンコード][,レコード区切り指定]}{SQL文}」
★検索した結果をファイルに書きます。
★'2'を書くとファイル名が自由に指定出来ます。
(12.3)行を検索する その3。「SQL_SET{データ名,..}{SQL文}」
★最初の1件のみデータ名にデータを受け取ります。
(12.4)行を検索する その4。「SQL_REPEAT{データ名,..}{SQL文}」
★データ名の最後に連番を付加して全データを受け取ります。
(12.5)行を検索する その5。「SQL1{SQL文}」
★「SQL1_NEXT{データ名,..}..;..」で1件づつのデータを受け取れます。
★「SQL1_FIRST{データ名,..}..;..」で先頭データに戻って読む事が出来ます。
★SQL2{}も使えます。
(12.6)行を検索する その6。「SQL=SQL文」
★検索した結果を画面に表示します。
★プログラムではCOPY=@ZZZZZZ_SQL内で使っています。
(13.1)カーソルによるSQL処理を実行します。「CURSOR[2]{テーブル名1[,..]}{列名1,[K,A,D,][,..]}{WHERE句}{作業データ定義1[,..]}{キー割れ開始処理}{1件処理}{キー割れ終了処理}」
★前の行の処理結果がその行の処理内容に影響を及ぼすような特殊な処理に使います、通常は殆ど使いません。
★'2'を書くとZ_CANCELの論理削除判定をしません。
(13.2)テーブル情報を変数に設定します。「SET_TABLE{&テーブル別名}{テーブル名}」
(13.3)テーブルが無い時";"まで移動します。「IF_TABLE[_NOT]{テーブル名}..;..」
★_NOTが付くとテーブルが有るとき";"まで移動します。
(13.4)リンク用SQL文を組み立てます。「LINK_SET{データ名}{SELECTからFROMまで}{テーブル名}{別名} {WHERE以下}」
★異なるRDBMSの場合のエラーの発生を回避します。
All Rights Reserved, Copyright (C) 2016-2016 Nobumichi Harasawa.