24.10.2014 Views

Magic eBusiness Platform V9Plus チュートリアル SQL 編

Magic eBusiness Platform V9Plus チュートリアル SQL 編

Magic eBusiness Platform V9Plus チュートリアル SQL 編

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Magic</strong> <strong>eBusiness</strong> <strong>Platform</strong> <strong>V9Plus</strong><br />

チュートリアル<br />

<strong>SQL</strong> 編


本 書 に 記 載 の 内 容 は、 将 来 予 告 なしに 変 更 することがあります。これらの 情 報 について MSE(<strong>Magic</strong> Software Enterprises<br />

Ltd.)および MSJ(<strong>Magic</strong> Software Japan K.K.)は、いかなる 責 任 も 負 いません。<br />

本 書 の 内 容 につきましては、 万 全 を 期 して 作 成 していますが、 万 一 誤 りや 不 正 確 な 記 述 があったとしても、MSE および MSJ<br />

はいかなる 責 任 、 債 務 も 負 いません。<br />

MSE および MSJ は、この 製 品 の 商 業 価 値 や 特 定 の 用 途 に 対 する 適 合 性 の 保 証 を 含 め、この 製 品 に 関 する 明 示 的 、あるいは<br />

黙 示 的 な 保 証 は 一 切 していません。<br />

本 書 に 記 載 のソフトウェアは、 製 品 の 使 用 許 諾 契 約 書 に 記 載 の 条 件 に 同 意 をされたライセンス 所 有 者 に 対 してのみ 供 給 される<br />

ものです。 同 ライセンスの 許 可 する 条 件 のもとでのみ、 使 用 または 複 製 することが 許 されます。 当 該 ライセンスが 特 に 許 可 し<br />

ている 場 合 を 除 いては、いかなる 媒 体 へも 複 製 することはできません。<br />

ライセンス 所 有 者 自 身 の 個 人 使 用 目 的 で 行 う 場 合 を 除 き、MSE または MSJ の 書 面 による 事 前 の 許 可 なしでは、いかなる 条<br />

件 下 でも、 本 書 のいかなる 部 分 も、 電 子 的 、 機 械 的 、 撮 影 、 録 音 、その 他 のいかなる 手 段 によっても、コピー、 検 索 システム<br />

への 記 憶 、 電 送 を 行 うことはできません。<br />

サードパーティ 各 社 商 標 の 引 用 は、MSE および MSJ の 製 品 に 対 する 互 換 性 に 関 しての 情 報 提 供 のみを 目 的 としてなされる<br />

ものです。<br />

本 書 において、 説 明 のためにサンプルとして 引 用 されている 会 社 名 、 製 品 名 、 住 所 、 人 物 は、 特 に 断 り 書 きのないかぎり、す<br />

べて 架 空 のものであり、 実 在 のものについて 言 及 するものではありません。<br />

<strong>Magic</strong> は <strong>Magic</strong> Software Enterprises Ltd. のイスラエルその 他 の 国 での 商 標 または 登 録 商 標 です。<br />

<strong>Magic</strong> eDeveloper、<strong>Magic</strong> Client および <strong>Magic</strong> Application Server は <strong>Magic</strong> Software Japan K.K. の 商 標 です。<br />

Pervasive.<strong>SQL</strong> は Pervasive Software, Inc. の 商 標 です。<br />

Microsoft および FrontPage は、Microsoft Corporation の 登 録 商 標 です。また、Windows, WindowsNT および ActiveX は<br />

Microsoft Corporation の 商 標 です。<br />

一 般 に、 会 社 名 、 製 品 名 は 各 社 の 商 標 または 登 録 商 標 です。<br />

MSE および MSJ は、 本 製 品 の 使 用 またはその 使 用 によってもたらされる 結 果 に 関 する 保 証 や 告 知 は 一 切 していません。こ<br />

の 製 品 のもたらす 結 果 およびパフォーマンスに 関 する 危 険 性 は、すべてユーザが 責 任 を 負 うものとします。<br />

この 製 品 を 使 用 した 結 果 、または 使 用 不 可 能 な 結 果 生 じた 間 接 的 、 偶 発 的 、 副 次 的 な 損 害 ( 営 利 損 失 、 業 務 中 断 、 業 務 情 報 の<br />

損 失 などの 損 害 も 含 む)に 関 し、 事 前 に 損 害 の 可 能 性 が 勧 告 されていた 場 合 であっても、MSE および MSJ、その 管 理 者 、 役<br />

員 、 従 業 員 、 代 理 人 は、いかなる 場 合 にも 一 切 責 任 を 負 いません。<br />

初 版<br />

2005 年 12 月 31 日<br />

マジックソフトウェア・ジャパン 株 式 会 社<br />

本 書 についてお 気 づきの 点 、ご 意 見 ご 希 望 等 ございましたら、メールで japan_support@magicsoftware.com<br />

までお 送 りください。 個 々のメールにご 返 事 することはできませんが、 今 後 の 改 訂 の 際 に 参 考 にさせていただ<br />

きます。<br />

2 目 次


目 次<br />

目 次 ................................................................................................................................................................... 3<br />

1. はじめに ....................................................................................................................................................... 7<br />

1.1. 目 標 ........................................................................................................................................................ 8<br />

1.2. 前 提 条 件 ................................................................................................................................................ 9<br />

1.2.1. <strong>Magic</strong> について................................................................................................................................9<br />

1.2.2. <strong>SQL</strong> について .................................................................................................................................. 9<br />

1.3. 高 度 な 話 題 ............................................................................................................................................11<br />

2. <strong>SQL</strong> 利 用 準 備 ............................................................................................................................................. 12<br />

2.1. <strong>Magic</strong> 製 品 CD から MSDE をインストール ....................................................................................... 13<br />

2.2. Microsoft サイトからダウンロード...................................................................................................... 15<br />

2.3. データベースの 作 成 ............................................................................................................................. 16<br />

2.4. 簡 単 な <strong>SQL</strong> 操 作 .................................................................................................................................. 17<br />

3. <strong>Magic</strong> での MS-<strong>SQL</strong> 設 定 。 ....................................................................................................................... 19<br />

3.1. ゲートウェイのインストール .............................................................................................................. 20<br />

3.1.1. <strong>Magic</strong> の 新 規 インストールの 場 合 ................................................................................................. 20<br />

3.1.2. アップデートインストールの 場 合 ................................................................................................. 21<br />

3.1.3. ゲートウエイの 確 認 ...................................................................................................................... 22<br />

3.2. DBMS テーブル ................................................................................................................................... 23<br />

3.3. データベーステーブル ......................................................................................................................... 25<br />

4. MS<strong>SQL</strong> テーブルを <strong>Magic</strong> から 扱 ってみる................................................................................................ 27<br />

4.1. 新 規 アプリケーションの 作 成 .............................................................................................................. 28<br />

4.2. テーブル 定 義 ....................................................................................................................................... 29<br />

4.3. テーブル 作 成 とデータ 登 録 .................................................................................................................. 30<br />

4.4. データ 再 編 成 ....................................................................................................................................... 31<br />

4.4.1. テーブルを 変 更 してみる............................................................................................................... 31<br />

4.4.2. データ 再 編 成 機 能 の 無 効 化 ........................................................................................................... 32<br />

4.5. 命 名 規 則 .............................................................................................................................................. 34<br />

4.6. 名 前 の 対 応 ........................................................................................................................................... 35<br />

4.6.1. テーブル 名 .................................................................................................................................... 35<br />

4.6.2. カラム 名 ........................................................................................................................................ 35<br />

4.6.3. インデックス 名 ............................................................................................................................. 36<br />

4.7. 一 意 インデックスの 定 義 ..................................................................................................................... 37<br />

5. 定 義 取 得 ..................................................................................................................................................... 38<br />

5.1. 複 数 のテーブルの 定 義 取 得 .................................................................................................................. 39<br />

5.2. 特 定 のテーブルの 定 義 取 得 .................................................................................................................. 41<br />

目 次 3


5.3. 定 義 取 得 の 結 果 を 見 てみる.................................................................................................................. 42<br />

5.4. ビューの 定 義 取 得 ................................................................................................................................ 43<br />

5.4.1. ビューの 定 義 取 得 .......................................................................................................................... 43<br />

5.4.2. 仮 想 インデックスの 定 義 ............................................................................................................... 44<br />

5.4.3. 仮 想 インデックス 利 用 上 の 注 意 .................................................................................................... 45<br />

6. ペットショップサンプルの 設 定 ................................................................................................................. 46<br />

6.1.1. サンプルについて.......................................................................................................................... 46<br />

6.1.2. 論 理 名 の 設 定 ................................................................................................................................. 47<br />

6.1.3. アプリケーションテーブルの 追 加 ................................................................................................. 48<br />

7. データ 移 行 ................................................................................................................................................. 49<br />

7.1. <strong>Magic</strong> のデータ 再 編 成 機 能 を 使 う........................................................................................................ 50<br />

7.1.1. データ 再 編 成 によるデータベース 移 行 の 手 順 ............................................................................... 50<br />

7.1.2. データベースの 確 認 ...................................................................................................................... 51<br />

7.1.3. 「 顧 客 へのメッセージ」のデータ 型 について............................................................................... 51<br />

7.1.4. 自 動 再 編 成 がうまくいかない 場 合 ................................................................................................. 52<br />

7.2. テキスト 出 力 ・ 入 力 で 移 行 .................................................................................................................. 53<br />

7.2.1. テキスト 出 力 ・ 入 力 によるデータベース 移 行 の 手 順 .................................................................... 53<br />

7.3. データ 移 行 用 のプログラムを 作 成 する ................................................................................................ 55<br />

8. 移 行 直 後 の 動 作 確 認 ................................................................................................................................... 56<br />

8.1. トランザクション 設 定 の 変 更 .............................................................................................................. 57<br />

8.2. マルチユーザ 環 境 での 実 行 .................................................................................................................. 58<br />

8.2.1. <strong>Magic</strong> クライアント 版 ................................................................................................................... 58<br />

8.2.2. アプリケーションの 同 時 オープン................................................................................................. 58<br />

8.3. マルチユーザ 環 境 での 問 題 点 .............................................................................................................. 59<br />

8.3.1. テーブルを 一 つだけ 使 うタスクの 場 合 ......................................................................................... 59<br />

8.3.2. テーブルを 複 数 使 うタスクの 場 合 ................................................................................................. 61<br />

9. トランザクション....................................................................................................................................... 62<br />

9.1. トランザクションとは? ..................................................................................................................... 63<br />

9.1.1. トランザクションの 定 義 ............................................................................................................... 63<br />

9.1.2. トランザクションの 例 .................................................................................................................. 63<br />

9.2. O<strong>SQL</strong> を 使 ってトランザクションを 試 してみる .................................................................................. 64<br />

9.3. 分 離 レベル........................................................................................................................................... 66<br />

9.4. O<strong>SQL</strong> を 使 って 分 離 レベルを 試 してみる............................................................................................. 67<br />

9.4.1. 非 コミット 読 込 の 場 合 .................................................................................................................. 67<br />

9.4.2. コミット 済 み 読 み 取 りの 場 合 ........................................................................................................ 68<br />

9.5. ロックとトランザクション.................................................................................................................. 71<br />

9.5.1. MS-<strong>SQL</strong> Server でのロック .......................................................................................................... 71<br />

9.5.2. ロックとトランザクションの 関 係 ................................................................................................. 71<br />

10. 受 注 入 力 で 何 が 起 こっているのか? ........................................................................................................ 73<br />

4 目 次


10.1. Pervasive の 場 合 ................................................................................................................................ 74<br />

10.2. MS-<strong>SQL</strong> Server の 場 合 ...................................................................................................................... 75<br />

11. 受 注 入 力 プログラムの 変 更 ....................................................................................................................... 76<br />

11.1. 考 え 方 ................................................................................................................................................ 77<br />

11.2. 一 時 テーブルの 定 義 ........................................................................................................................... 80<br />

11.3. 一 時 テーブル 操 作 用 バッチタスク ..................................................................................................... 82<br />

11.3.1. 一 時 テーブルのレコード 削 除 ...................................................................................................... 82<br />

11.3.2. データベースから 一 時 テーブルへのレコードコピー .................................................................. 82<br />

11.3.3. 受 注 明 細 レコード 削 除 ................................................................................................................. 84<br />

11.3.4. 一 時 テーブルのデータをデータベースに 反 映 ............................................................................. 85<br />

11.4. 親 タスクのレコード 前 処 理 の 修 正 ..................................................................................................... 87<br />

11.5. 親 タスクのコントロール 後 処 理 の 削 除 .............................................................................................. 88<br />

11.6. 受 注 明 細 タスク( 子 タスク)の 変 更 ....................................................................................................... 89<br />

11.6.1. 受 注 明 細 タスクのメインテーブルの 変 更 .................................................................................... 89<br />

11.6.2. レコード 後 処 理 ........................................................................................................................... 89<br />

11.6.3. トランザクションの 設 定 ............................................................................................................. 90<br />

11.7. 親 タスクのレコード 後 処 理 の 変 更 ..................................................................................................... 91<br />

11.7.1. 受 注 番 号 の 発 番 ........................................................................................................................... 91<br />

11.7.2. 明 細 レコードをデータベースに 反 映 ........................................................................................... 91<br />

11.7.3. 顧 客 レコードの 累 計 受 注 額 と 受 注 回 数 の 更 新 ............................................................................. 92<br />

11.7.4. まとめると................................................................................................................................... 92<br />

11.8. 実 行 してみる...................................................................................................................................... 93<br />

11.8.1. メニューへの 登 録 ........................................................................................................................ 93<br />

11.8.2. テスト 準 備 ................................................................................................................................... 93<br />

11.8.3. テストパターン ........................................................................................................................... 93<br />

12. トランザクション 設 定 の 注 意 事 項 ............................................................................................................ 95<br />

12.1. トランザクションの 開 始 と 終 了 のタイミング ................................................................................... 96<br />

12.2. 物 理 トランザクションのネストはできない....................................................................................... 98<br />

12.3. トランザクションの 対 象 となるデータベース ................................................................................. 100<br />

12.3.1. DB テーブルに 登 録 されているテーブルに 属 するデータベース................................................ 100<br />

12.3.2. <strong>SQL</strong> データベースと ISAM データベースの 違 い ...................................................................... 102<br />

12.3.3. トランザクションをサポートしない DBMS ............................................................................. 103<br />

12.3.4. まとめると・・・...................................................................................................................... 103<br />

12.4. テーブルを 使 わないタスク.............................................................................................................. 104<br />

13. おわりに ................................................................................................................................................. 106<br />

14. 参 考 資 料 : 移 行 時 の 注 意 事 項 ............................................................................................................... 107<br />

14.1. テーブルリポジトリに 関 する 変 更 ................................................................................................... 108<br />

14.1.1. デフォルト 値 の 違 い .................................................................................................................. 108<br />

14.1.2. DB テーブル .............................................................................................................................. 108<br />

目 次 5


14.1.3. テーブルの 存 在 チェック........................................................................................................... 108<br />

14.1.4. カラム/DB カラム 名 ............................................................................................................... 108<br />

14.1.5. カラム/カラムタイプ .............................................................................................................. 108<br />

14.1.6. 日 付 型 カラム............................................................................................................................. 109<br />

14.1.7. インデックス/ 仮 想 キーの 設 定 ................................................................................................ 109<br />

14.1.8. DB インデックス 名 .................................................................................................................... 109<br />

14.1.9. 重 複 不 可 インデックスの 定 義 .....................................................................................................110<br />

14.1.10. セグメントのサイズ .................................................................................................................110<br />

14.1.11. 論 理 型 カラムのインデックス ...................................................................................................110<br />

14.1.12. 重 複 不 可 データのチェック ......................................................................................................110<br />

14.2. プログラムに 関 する 変 更 ..................................................................................................................111<br />

14.2.1. レコードアクセス.......................................................................................................................111<br />

14.2.2. ロックとトランザクション ........................................................................................................111<br />

14.2.3. 関 数 ............................................................................................................................................112<br />

14.3. その 他 の 違 い ....................................................................................................................................113<br />

14.3.1. NULL 値 .....................................................................................................................................113<br />

14.3.2. ソート 順 について.......................................................................................................................113<br />

6 目 次


1. はじめに<br />

本 書 では、リレーショナルデータベース 管 理 システム( 以 下 RDBMS、あるいは <strong>SQL</strong> データベースと 略 )を<br />

使 って <strong>Magic</strong> アプリケーションを 作 成 するための 基 本 事 項 を 勉 強 します。サンプルとしては、チュートリア<br />

ルで 作 成 したペットショップデモを 利 用 します。ペットショップデモは 非 常 に 単 純 なサンプルですが、<strong>Magic</strong><br />

におけるデータのハンドリングに 必 要 な 基 本 テクニックがカバーされるので、<strong>Magic</strong> の 基 本 を 理 解 するには<br />

最 適 です。 実 際 のアプリケーションが 複 雑 だったとしても、 基 本 的 な 部 分 はペットショップでのテクニック<br />

の 応 用 で 実 現 できます。<br />

リレーショナルデータベースとひとくちに 言 っても、 製 品 ごとに 細 かな 仕 様 が 異 なります。 本 書 では<br />

MS-<strong>SQL</strong> Server (MSDE)を 使 って <strong>SQL</strong> 化 を 行 っていきます。 他 の RDBMS を 使 う 場 合 には、 命 名 規 則 やロ<br />

ック・トランザクションの 動 作 などに 微 妙 な 違 いがありますが、プログラムの 作 り 方 についての 基 本 的 な 考<br />

え 方 は 同 じです。<br />

参 考 :<br />

チュートリアル 入 門 編 では、データベースとして、<strong>Magic</strong> にバンドルされている Pervasive.<strong>SQL</strong> を 使 っ<br />

てきました。Pervasive.<strong>SQL</strong> データベースは、その 名 の 通 り、<strong>SQL</strong> 文 をインターフェースとする「リレ<br />

ーショナル・アクセス」といわれる 方 式 と、 昔 からの Btrieve と 互 換 性 を 持 った、ISAM タイプのインタ<br />

ーフェースを 持 つ「トランザクショナル・アクセス」と 呼 ばれる 方 式 とがあります。<br />

<strong>Magic</strong> の Pervasive ゲートウェイは、このうちトランザクショナル・アクセスを 利 用 して Pervasive.<strong>SQL</strong><br />

のデータをアクセスしていますので、Pervasive.<strong>SQL</strong> をデータベースエンジンとして 使 っていても、 実<br />

際 には ISAM のインターフェースでアクセスしていることになります。<br />

このため、<strong>Magic</strong> から Pervasive ゲートウェイを 介 して Pervasive.<strong>SQL</strong> にアクセスする 場 合 には、トラ<br />

ンザクションの 利 用 が 必 ずしも 必 要 ではなく、 実 際 に <strong>Magic</strong> のアプリケーションではトランザクション<br />

を 使 わずに 組 んでいる 場 合 が 多 いようです。<br />

この 場 合 には、「 第 9 章 トランザクション」(62 ページ)で 説 明 するような、トランザクションを 使 うこ<br />

とによる 制 約 事 項 について 考 慮 する 必 要 がないので、アプリケーションの 作 成 が 簡 単 に 済 みます。 一 方 、<br />

トランザクションのデータ 整 合 性 保 障 のメリットが 得 られないことになります。<br />

はじめに 7


1.1. 目 標<br />

本 書 の 目 標 は、 次 の 通 りです。<br />

• MS-<strong>SQL</strong> を 例 にとり、<strong>SQL</strong> データベースの 設 定 方 法 を 理 解 する。<br />

• Pervasive.<strong>SQL</strong> で 作 ったペットショップデモを MS-<strong>SQL</strong> Server を 使 ったものに 移 植 する。<br />

• 移 植 後 のアプリケーション( 特 に、 受 注 入 力 プログラム)が、マルチユーザ 環 境 でも 正 しく 動 作 するよ<br />

うにする。<br />

<strong>Magic</strong> の <strong>SQL</strong> データベースサポートに 関 しては、 非 常 にきめ 細 かで 幅 広 い 内 容 がありますが、 本 書 ではペ<br />

ットショップデモを MS-<strong>SQL</strong> Server できちんと 動 かすことに 限 定 して 説 明 を 進 めていきます。<br />

8 はじめに


1.2. 前 提 条 件<br />

本 書 では、 読 者 と 動 作 環 境 について、 次 のことを 前 提 としています。<br />

1.2.1. <strong>Magic</strong> について<br />

• 読 者 は <strong>Magic</strong> の 概 念 と 操 作 についての 基 礎 についての 知 識 を 持 っていることを 仮 定 しています。 具 体 的<br />

には、<strong>Magic</strong> のチュートリアルを 勉 強 し、Pervasive でペットショップデモを 作 成 できる 程 度 の 知 識 が<br />

あることが 前 提 です。<br />

• お 使 いになる PC には、<strong>Magic</strong> をインストールしておいてください。 製 品 版 の <strong>Magic</strong> eDeveloper をお<br />

持 ちでない 場 合 には、 体 験 版 を 弊 社 ホームページなどからダウンロードしてインストールしてください。<br />

• また、PC には Pervasive.<strong>SQL</strong> (2000i 以 降 )をインストールしておいてください。<strong>Magic</strong> eDeveoloper<br />

の 製 品 CD にはバンドルされていますが、もしお 持 ちでなければ、 弊 社 ホームページなどから 体 験 版 と<br />

一 緒 に Pervasive.<strong>SQL</strong> 体 験 版 (V8SP2。90 日 期 限 付 き)をダウンロードし、インストールしてください。<br />

• 本 書 では、<strong>SQL</strong> データベースの 例 として、MS-<strong>SQL</strong> Server 2000 (SP3 以 降 ) を 使 います。もしご 利 用<br />

になる PC に MS-<strong>SQL</strong> Server を 利 用 する 環 境 がなければ、「 第 2 章 <strong>SQL</strong> 利 用 準 備 」(12 ページ)を 参 考<br />

にして、MS-<strong>SQL</strong> Server ( 評 価 版 、あるいは Desktop Engine)を 入 手 し、インストールしてください。<br />

もし、MS-<strong>SQL</strong> Server ではなく Oracle や DB2/UDB を 利 用 したい 場 合 には、 本 書 の 内 容 はほぼそのまま 応<br />

用 できますが、データベースの 設 定 でデータベースごとの 細 かな 違 いが 出 てきます。 詳 しくはリファレンス<br />

マニュアル 第 25 章 「<strong>SQL</strong> に 関 する 考 慮 事 項 」、 開 発 者 ガイド 第 1 章 「<strong>Magic</strong> の 環 境 設 定 → <strong>SQL</strong> データベ<br />

ースの 定 義 」あるいは、Readme.chm の「データベース 固 有 の 追 加 情 報 」などを 参 照 してください。<br />

1.2.2. <strong>SQL</strong> について<br />

読 者 は、<strong>SQL</strong> データベースについて 基 本 的 なことを 知 っていることを 仮 定 しています。 具 体 的 には、 次 のよ<br />

うな 簡 単 な <strong>SQL</strong> 文 です。<br />

• DDL 文<br />

‣ CREATE/DROP TABLE<br />

‣ CREATE/DROP INDEX<br />

• DML 文<br />

‣ SELECT ・・・ FROM ・・・ WHERE ・・・ ORDER BY ・・・<br />

‣ UPDATE<br />

‣ INSERT<br />

‣ DELETE<br />

• ロック (SELECT 文 へのヒント)<br />

はじめに 9


‣ UPDLOCK NOWAIT<br />

• トランザクション 制 御<br />

‣ BEGIN TRANSACTION<br />

‣ COMMIT TRANSACTION<br />

‣ ROLLBACK TRANSACTION<br />

これらの DDL/DML 文 は <strong>SQL</strong> データベースのごく 基 本 ですが、もし 知 らなければ 数 多 くの 書 籍 があります<br />

のでそちらでまず 勉 強 してください。<br />

なお、 本 書 では MS-<strong>SQL</strong> Server を 使 いますので、MS <strong>SQL</strong> Server の 知 識 と 経 験 があればなおわかりやす<br />

くなります。<br />

10 はじめに


1.3. 高 度 な 話 題<br />

本 書 で 説 明 する 内 容 に 関 連 して、より 高 度 な 説 明 がリファレンスマニュアルにありますので、 以 下 の 章 も 参<br />

考 にしてください。<br />

機 能<br />

トランザクション 一 般 に 関 する 話 題<br />

<strong>SQL</strong> に 関 する 考 慮 事 項<br />

マルチユーザ 環 境 での 考 慮 事 項<br />

リファレンスマニュアルの 箇 所<br />

第 11 章 データ 管 理<br />

第 25 章 <strong>SQL</strong> に 関 する 考 慮 事 項<br />

第 23 章 マルチユーザ 環 境<br />

また、<strong>Magic</strong> の <strong>SQL</strong> データベースサポート 機 能 の 中 で、 本 書 では 説 明 しない 主 なものは、 以 下 のようなも<br />

のがあります。 詳 しくは、セミナーコースに 参 加 されるか、あるいは 以 下 のリファレンスマニュアルを 参 照<br />

してください。<br />

機 能<br />

テーブル 定 義 の 詳 細<br />

埋 め 込 み <strong>SQL</strong><br />

<strong>SQL</strong> WHERE 句<br />

遅 延 トランザクション<br />

リファレンスマニュアルの 箇 所<br />

第 4 章 テーブル<br />

第 6 章 プログラム → 埋 め 込 み <strong>SQL</strong><br />

第 6 章 プログラム → 範 囲 と 位 置 付 ダイアログ → [<strong>SQL</strong><br />

Where]タブ<br />

第 11 章 データ 管 理 → 遅 延 トランザクション<br />

はじめに 11


2. <strong>SQL</strong> 利 用 準 備<br />

本 書 では、<strong>SQL</strong> DBMS として MS-<strong>SQL</strong> Server を 利 用 します。MS-<strong>SQL</strong>Server が 今 使 っている 環 境 で 利 用<br />

できるようになっていなければ、ここでインストールしておいてください。<br />

MS-<strong>SQL</strong> Server をお 持 ちでない 場 合 には、 以 下 のいずれかの 方 法 で、MS-<strong>SQL</strong> Server Desktop Engine<br />

(MSDE)、あるいは 期 間 限 定 の 評 価 版 を 入 手 することができます。<br />

• <strong>Magic</strong> 製 品 CD から MSDE をインストール<br />

• Microsoft サイトからダウンロード<br />

それぞれについて、 以 下 に 説 明 します。<br />

12 <strong>SQL</strong> 利 用 準 備


2.1. <strong>Magic</strong> 製 品 CD から MSDE をインストール<br />

<strong>Magic</strong> の 製 品 CD をお 持 ちであれば、MSDE2000 SP3 がバンドルされているので、CD からインストールす<br />

ることができます。<br />

インストール 時 には 以 下 の 情 報 が 必 要 となるので、 予 め 決 定 しておいてください。<br />

設 定 値<br />

管 理 者 sa のパスワード<br />

セキュリティモード<br />

デフォルト 値<br />

password<br />

Windows 認 証<br />

1. <strong>Magic</strong> 製 品 の CD-ROM を CD-ROM ドライブに<br />

セットします。 自 動 的 にインストーラが 開 始 され<br />

ます。<br />

2. RDBMS をクリックしてください。RDBMS のイ<br />

ンストール 画 面 が 表 示 されます。<br />

3. 「Microsoft <strong>SQL</strong> Server 2000 Desktop Engine<br />

SP3」をクリックしてください。インストーラが<br />

開 始 します。<br />

4. 管 理 者 sa のパスワードを 聞 いてきます。 適 当 な<br />

パスワードを 設 定 してください。<br />

<strong>SQL</strong> 利 用 準 備 13


5. セキュリティモードを 聞 いてきます。Windows 認 証 か、<br />

混 合 モード 認 証 を 選 択 してください。<br />

セキュリティモードについては、MS-<strong>SQL</strong> Server の<br />

技 術 資 料 を 参 照 してください。 簡 単 なテストの 場 合 に<br />

は、デフォルトの Windows 認 証 で 良 いでしょう。<br />

6. インストールが 実 行 されます。<br />

7. <strong>Magic</strong> という 名 前 のデータベースを 作 成 します。 確 認<br />

ダイアログが 出 ますので、「はい」で 答 えてください。<br />

以 上 で MSDE のインストールが 完 了 です。<br />

14 <strong>SQL</strong> 利 用 準 備


2.2. Microsoft サイトからダウンロード<br />

<strong>Magic</strong> の 製 品 CD-ROM をお 持 ちでない 場 合 には、MS-<strong>SQL</strong> Server の 期 限 限 定 の 評 価 版 を Microsoft 社 のサ<br />

イトからダウンロードすることができます。また、Microsoft <strong>SQL</strong> Server 2000 Desktop Engine (MSDE<br />

2000)は、 簡 単 な 登 録 を 行 うことにより 通 常 版 をダウンロードすることができます。<br />

これらの 製 品 に 関 する 情 報 およびダウンロードは、Microsoft 社 の Microsoft <strong>SQL</strong> Server のページ<br />

http://www.microsoft.com/japan/sql/default.mspx を 参 照 してください。<br />

また、インストールおよび 利 用 ・ 再 配 布 の 条 件 に 関 しては、それぞれの 製 品 に 関 するドキュメントを 参 照 し<br />

てください。<br />

<strong>SQL</strong> 利 用 準 備 15


2.3. データベースの 作 成<br />

注 意 : <strong>Magic</strong> の 製 品 CD-ROM より MSDE をインストールした 場 合 には、インストーラにより MAGIC<br />

という 名 前 のデータベースがすでに 作 成 されているので、ここでの 設 定 は 不 要 です。「2.4 簡 単 な <strong>SQL</strong> 操<br />

作 」(17 ページ)に 進 んでください。<br />

インストールした 直 後 では、システムが 使 うデータベースしか 登 録 されていませんので、テスト 用 に 別 途 デ<br />

ータベースを 作 成 します。ここでは 以 下 のようにして MAGIC という 名 前 のデータベースを 作 成 します。<br />

1. コマンドプロンプトを 開 きます。<br />

2. 以 下 のコマンドを 入 力 してください。(データベースのサイズは、ここでは 10MB としていますが、デ<br />

ータ 量 に 応 じて 適 当 に 増 減 してください)<br />

C:¥>osql -E<br />

1> create database MAGIC<br />

2> go<br />

CREATE DATABASE: ディスク 'MAGIC' に 0.75 MB 割 り 当 てています。<br />

CREATE DATABASE: ディスク 'MAGIC_log' に 0.49 MB 割 り 当 てています。<br />

1> alter database MAGIC modify file (name='MAGIC', size=10MB)<br />

2> alter database MAGIC modify file (name='MAGIC_log', size=10MB)<br />

3> go<br />

1> quit<br />

参 考 : 上 のコマンドのうち、alter database … は、データ 領 域 を 予 め 増 やしておくために 実 行 します。 本<br />

書 で 出 てくる 小 さなテーブルのみを 使 う 場 合 には、 実 行 しなくとも 構 いません。<br />

以 上 でデータベース MAGIC が MS <strong>SQL</strong> Server 上 に 作 成 されました。<br />

16 <strong>SQL</strong> 利 用 準 備


2.4. 簡 単 な <strong>SQL</strong> 操 作<br />

インストールが 済 んだら、 動 作 確 認 を 兼 ねて、O<strong>SQL</strong> を 使 って、 簡 単 な DDL/DML 文 を 実 行 させてみましょ<br />

う。すでに 動 作 を 確 認 してある 場 合 にはスキップしてかまいません。<br />

1. コマンドラインから O<strong>SQL</strong> コマンドを 起 動 します。<br />

C:¥> osql -E<br />

2. データベース MAGIC を 選 択 します。<br />

1> use magic<br />

2> go<br />

3. テーブル mytbl を 作 成 します。<br />

1> create table mytbl (a char(10))<br />

2> go<br />

4. レコードを 一 件 登 録 します。<br />

1> insert into mytbl values ('いろは')<br />

2> go<br />

(1 件 処 理 されました)<br />

5. データを 見 てみます。<br />

1> select * from mytbl<br />

2> go<br />

a<br />

----------<br />

いろは<br />

(1 件 処 理 されました)<br />

6. データを 更 新 します。<br />

1> update mytbl set a = 'あいう' where a = 'いろは'<br />

2> go<br />

(1 件 処 理 されました)<br />

7. 再 度 データを 見 てみます。<br />

<strong>SQL</strong> 利 用 準 備 17


1> select * from mytbl<br />

2> go<br />

a<br />

----------<br />

あいう<br />

(1 件 処 理 されました)<br />

8. レコードを 削 除 します。<br />

1> delete mytbl where a = 'あいう'<br />

2> go<br />

(1 件 処 理 されました)<br />

9. 再 度 データを 見 てみます。<br />

1> select * from mytbl<br />

2> go<br />

a<br />

----------<br />

(0 件 処 理 されました)<br />

10. テーブルを 削 除 します。<br />

1> drop table mytbl<br />

2> go<br />

18 <strong>SQL</strong> 利 用 準 備


3. <strong>Magic</strong> での MS-<strong>SQL</strong> 設 定 。<br />

MS-<strong>SQL</strong> Server のインストールが 済 んだので、 次 には <strong>Magic</strong> での MS-<strong>SQL</strong> に 関 する、 次 のような 設 定 を 行<br />

います。<br />

• ゲートウェイのインストール<br />

• DBMS テーブル<br />

• データベーステーブル<br />

<strong>Magic</strong> での MS-<strong>SQL</strong> 設 定 。 19


3.1. ゲートウェイのインストール<br />

<strong>Magic</strong> から MS <strong>SQL</strong> Server にアクセスするには、<strong>Magic</strong> の MS <strong>SQL</strong> Server 用 ゲートウェイをインストー<br />

ルし、<strong>Magic</strong> エンジンが 実 行 時 にロードできるようにしておく 必 要 があります。<br />

3.1.1. <strong>Magic</strong> の 新 規 インストールの 場 合<br />

MS <strong>SQL</strong> Server 用 ゲートウェイは、 標 準 のインストールを 行 った 場 合 にはインストールされません。 新 規 に<br />

インストールする 場 合 には、「カスタム」インストールを 選 択 し、MS <strong>SQL</strong> Server ゲートウェイを 選 択 しま<br />

す。<br />

1. インストール 中 、インストールタ<br />

イプの 選 択 画 面 に 来 たら、「カスタ<br />

ム」を 選 びます。<br />

2. コンポーネントの 選 択 の 画 面 で、<br />

データベースゲートウェイから<br />

MS-<strong>SQL</strong> Server ゲートウェイを<br />

選 択 します。<br />

3. その 他 は 通 常 通 りのインストール<br />

です。<br />

20 <strong>Magic</strong> での MS-<strong>SQL</strong> 設 定 。


3.1.2. アップデートインストールの 場 合<br />

<strong>Magic</strong> を 標 準 インストールでインストールした 環 境 がすでにある 場 合 には、MS<strong>SQL</strong> のゲートウェイがイン<br />

ストールされていないので、アップデートインストールでインストールする 必 要 があります。<br />

アップデートインストールは、インストーラを 用 いて 行 います。<br />

1. インストールしたときと 同 じようにインストーラを 起 動 します。<br />

2. 右 図 のような 警 告 メッセージが 出 ま<br />

すので、「はい(Y)」を 押 します。<br />

3. 続 いて、 右 のような 画 面 が 出 たら、<br />

「 現 在 のインストール 構 成 を 変 更 し<br />

てアップグレードします」を 選 択 し、<br />

「 次 へ(N)」を 押 します。<br />

4. 「アップデート 時 のコンポーネント<br />

指 定 」 画 面 で、データベースゲート<br />

ウェイから MS-<strong>SQL</strong> Server ゲート<br />

ウェイを 選 択 します。<br />

5. 後 は、 通 常 通 りインストールを 続 け<br />

てください。<br />

アップデートインストールが 完 了 すると、<br />

MS-<strong>SQL</strong> Server ゲートウェイがインス<br />

トールされています。<br />

<strong>Magic</strong> での MS-<strong>SQL</strong> 設 定 。 21


3.1.3. ゲートウエイの 確 認<br />

<strong>Magic</strong> を 起 動 して、MS<strong>SQL</strong> ゲートウェイがロードされていることを 確 認 しましょう。<br />

1. <strong>Magic</strong> を 起 動 します。<br />

2. メニュー 「ヘルプ(H)」から<br />

「<strong>Magic</strong> 情 報 (M)」を 選 びます。<br />

3. バージョン 情 報 のダイアログ<br />

( 右 図 )が 表 示 されますが、ロー<br />

ドモジュール 一 覧 の 中 に<br />

MS<strong>SQL</strong> があることを 確 認 して<br />

ください。あれば MS-<strong>SQL</strong><br />

Server ゲートウェイが 正 常 に<br />

ロードされています。<br />

参 考 : もしロードされていなければ・・・<br />

もしロードモジュール 一 覧 に MS<strong>SQL</strong> がなければ、 以 下 の 点 を 確 認 してください。<br />

ゲートウェイモジュールがあるか?<br />

<strong>Magic</strong> のゲートウェイモジュールは、<strong>Magic</strong> をインス<br />

トールしたディレクトリの 下 の Gateways サブディ<br />

レクトリに DLL の 形 で 格 納 されています。ここを 見<br />

て、MGms7.dll というモジュールがあるかどうかを<br />

チェックしてください。もしなければ、 前 記 インスト<br />

ールを 再 度 行 ってみてください。<br />

MAGIC.INI にゲートウェイが 登 録 されているか?<br />

<strong>Magic</strong> がインストールされたディレクトリに、<br />

MAGIC.INI というファイルがありますが、これは<br />

<strong>Magic</strong> の 動 作 を 制 御 する 環 境 設 定 パラメータが 多 数 定<br />

義 されています。この 中 に[MAGIC_GATEWAYS] と<br />

いうセクションがあり、ここでロードするゲートウェ<br />

イを 指 定 しています。MS-<strong>SQL</strong> Server ゲートウェイ<br />

は MGDB20 というキーワードで 指 定 されますが、こ<br />

れが 正 しくゲートウェイモジュールを 参 照 しているこ<br />

とを 確 認 してください。 特 に、 行 頭 にセミコロン「;」<br />

文 字 があると、コメントとして 無 視 されますので、コ<br />

メントがはずれていることを 確 認 してください。<br />

[MAGIC_GATEWAYS]<br />

;MGCOMM01=mgwsock.dll<br />

MGDB00=Gateways¥mgpv2k.dll<br />

;MGDB03=mdcisam.dll<br />

;MGDB05=Gateways¥mgcache.DLL<br />

;MGDB06=Gateways¥mgdb400.DLL<br />

;MGDB13=Gateways¥mgOra8.dll<br />

;MGDB14=Gateways¥mginf.dll<br />

;MGDB16=Gateways¥mgeac32.dll<br />

;MGDB18=Gateways¥mgdb2.DLL<br />

;MGDB19=Gateways¥mgodbc.dll<br />

MGDB20=Gateways¥mgms7.dll<br />

MGDB21=Gateways¥mgmemory.dll<br />

22 <strong>Magic</strong> での MS-<strong>SQL</strong> 設 定 。


3.2. DBMS テーブル<br />

MS-<strong>SQL</strong> Serve にアクセスするには、<strong>Magic</strong> でいくつかの 設 定 をする 必 要 があります。 最 初 に 設 定 するのは、<br />

DBMS テーブルです。<br />

DBMS テーブルは、 各 DBMS (MS-<strong>SQL</strong>、Oracle、Pervasive.<strong>SQL</strong>、DB2UDB、など)ごとに 共 通 な 設 定 を<br />

行 うものです。MS-<strong>SQL</strong> Server の 場 合 には 一 箇 所 だけ、 分 離 レベルの 設 定 を 変 更 します( 図 3-1 参 照 )。<br />

1. DBMS テーブルは、<strong>Magic</strong> のアプリケーションを 閉 じた 状 態 で、メニュー「 設 定 (S)」から「DBMS(D)」<br />

を 選 んで 開 くことができます。<br />

2. 名 前 欄 が「Microsoft<strong>SQL</strong>」の 行 にカーソルを 置 き、 右 クリックでポップアップメニューを 出 して「 特 性 」<br />

を 選 択 します。(あるいは、Ctrl+P でも 同 じです)。DBMS 特 性 ダイアログが 開 きます。<br />

3. 「 分 離 レベル」を 1 にします。ほかの 部 分 は 変 更 しなくてかまいません。<br />

図 3-1 DBMS テーブルの 設 定<br />

メニュー<br />

設 定 (S)<br />

→ DBMS(D)<br />

を 選 択<br />

Microsoft <strong>SQL</strong>の 行 から、<br />

ポッ プアップメニュ ーで<br />

「 特 性 」を 開 く<br />

分 離 レベルを 1 に 設 定 。<br />

<strong>Magic</strong> での MS-<strong>SQL</strong> 設 定 。 23


参 考 : 分 離 レベルについて<br />

分 離 レベルとは、 複 数 ユーザが 同 時 にトランザクションを 行 っているときに、トランザクションの 間 の 独 立 性<br />

を 決 めるものです。 詳 細 は「9.3 分 離 レベル」(66 ページ)を 参 照 してください。デフォルトは 0 (Read<br />

Uncommited) で、これは 並 列 性 が 高 いがデータ 整 合 性 に 問 題 があるので、1 (Read Commited) の 方 が 適 当<br />

です。<br />

24 <strong>Magic</strong> での MS-<strong>SQL</strong> 設 定 。


3.3. データベーステーブル<br />

データベーステーブルは、 特 定 の DBMS 上 に 作 成 されたデータベースを 参 照 するもので、 同 時 に 接 続 情 報 (サ<br />

ーバマシン 名 、 接 続 時 のユーザ ID、パスワード)、その 他 のパラメータを 設 定 します。<br />

本 書 では、ローカルマシンにある MS-<strong>SQL</strong> Server 上 に 作 成 された、MAGIC という 名 前 のデータベースを<br />

参 照 します( 図 3-2)。<br />

図 3-2 データベーステーブルの 設 定<br />

F4で1 行 作 成 名 前 は、<br />

MS<strong>SQL</strong><br />

など( 任 意 )<br />

DBMSからF5で<br />

DBMS 一 覧 を 開 き、<br />

MS<strong>SQL</strong>を 選 択 。<br />

他 の 欄 は 空 のまま<br />

メニュー<br />

設 定 (S)<br />

→ データベース(B)<br />

を 選 択<br />

右 クリックの<br />

ポップアップ<br />

メニューで<br />

「 特 性 」を 選 択<br />

MS-<strong>SQL</strong> Serverの 接 続<br />

情 報 を 設 定 。ローカルで<br />

Windows 認 証 の 場 合 には<br />

特 に 設 定 は 不 要 。<br />

<strong>Magic</strong> での MS-<strong>SQL</strong> 設 定 。 25


1. メニュー「 設 定 (S)」から「データベース(B)」を 選 択 します。データベーステーブルが 開 きます。<br />

2. F4 で 1 行 新 規 作 成 します。<br />

3. 「 名 前 」 欄 には「MS<strong>SQL</strong>」などとします。この 名 前 は <strong>Magic</strong> のテーブルリポジトリの 中 から 参 照 され<br />

るもので、 任 意 の 名 前 を 設 定 できます。 普 通 はデータベースの 目 的 がわかるような 名 前 とつけます。<br />

4. 「DBMS」 欄 から F5 キーでズームすると、 現 在 ロードされているデータベースゲートウェイの 一 覧 が<br />

表 示 されます。 今 は MS-<strong>SQL</strong> Server をアクセスするので、MS<strong>SQL</strong> を 選 択 します。<br />

5. そのほかの 欄 は 空 欄 のままにします。<br />

6. 右 マウスクリックでポップアップメニューを 出 し、「 特 性 」を 選 択 します。データベース 特 性 ダイアログ<br />

が 開 きます。<br />

7. 「ログオン」タブには、データベース 接 続 情 報 を 記 入 します。ローカルマシンに Windows 認 証 で 接 続<br />

する 場 合 には、すべて 空 欄 のままでかまいません。 別 マシンにある 場 合 には、マシン 名 と 接 続 時 のログ<br />

オン ID、パスワードをここに 指 定 します。<br />

以 上 でデータベーステーブルの 設 定 は 終 わりです。<br />

26 <strong>Magic</strong> での MS-<strong>SQL</strong> 設 定 。


4. MS<strong>SQL</strong> テーブルを <strong>Magic</strong> から 扱 ってみる<br />

本 書 の 最 終 目 標 は、ペットショップデモを MS-<strong>SQL</strong> Server 対 応 にすることですが、 最 初 に <strong>Magic</strong> の <strong>SQL</strong><br />

対 応 機 能 について 理 解 するため、テスト 用 のアプリケーションを 作 成 して 以 下 のように 実 験 してみます。<br />

• 新 規 アプリケーションの 作 成<br />

• テーブル 定 義<br />

• テーブル 作 成 とデータ 登 録<br />

• データ 再 編 成<br />

また、MS-<strong>SQL</strong> Server を 利 用 する 場 合 の 注 意 事 項 として、 以 下 の 点 について 説 明 します。<br />

• 命 名 規 則<br />

• 名 前 の 対 応<br />

• 一 意 インデックスの 定 義<br />

MS<strong>SQL</strong> テーブルを <strong>Magic</strong> から 扱 ってみる 27


4.1. 新 規 アプリケーションの 作 成<br />

<strong>Magic</strong> で 新 規 アプリケーションを 作 成 するには、 以 下 のようにします。<br />

1. メニュー「ファイル(F)」から「 新 規 作 成 (N)」を 選 びます。 新 規 アプリケー<br />

ションダイアログが 開 きます。<br />

2. 「アプリケーションの 名 前 」 欄 に 適 当 な<br />

名 前 を 指 定 します。ここでは、「MS<strong>SQL</strong><br />

TEST」とします。<br />

3. OK ボタンを 押 すと、 新 規 アプリケーシ<br />

ョン 作 成 され、オープンされます。<br />

28 MS<strong>SQL</strong> テーブルを <strong>Magic</strong> から 扱 ってみる


4.2. テーブル 定 義<br />

まずは、テーブルリポジトリで、 簡 単 なテーブルを 新 規 定 義 しましょう。<br />

1. テーブルリポジトリを 開 きます。(メニュー 「ワークスペース(W)」から「テーブル(B)」を 選 ぶか、Shift+F2<br />

で 開 きます。<br />

2. 次 のようなテーブルを 定 義 してください。<br />

名 前 : テスト、DB テーブル 名 : テスト、データベース: MS<strong>SQL</strong><br />

カラム 定 義<br />

# カラム 名 型 書 式<br />

1. 数 値 型 N= 数 値 N5<br />

2. 文 字 型 A= 文 字 10<br />

インデックス 定 義<br />

# インデックス 名 セグメント 番 号 セグメントカラム 名<br />

1 BY 数 値 1 数 値 型<br />

<strong>Magic</strong> のテーブルリポジトリでは、 下 図 のように 定 義 します。<br />

• カラム 定 義<br />

• インデックス 定 義<br />

MS<strong>SQL</strong> テーブルを <strong>Magic</strong> から 扱 ってみる 29


4.3. テーブル 作 成 とデータ 登 録<br />

テーブルリポジトリに 定 義 したテーブルは、この 時 点 では <strong>Magic</strong> 上 に 定 義 だけしか 存 在 しません。ここで<br />

MS-<strong>SQL</strong> Server 上 にテーブルを 作 成 しましょう。<br />

テーブル 作 成 について、 特 別 な 手 続 きは 必 要 ありません。 単 に APG などでテー<br />

ブルを 開 くだけで、<strong>Magic</strong> が 自 動 的 にテーブルを 作 成 します。つまり、<br />

Pervasive.<strong>SQL</strong> の 場 合 と 同 様 、<strong>Magic</strong> はテーブルのオープンに 先 だってテーブル<br />

が 存 在 しているかをチェックし、もし 存 在 しなければ 自 動 的 にテーブルを 作 成 し<br />

ます。<br />

テーブルリポジトリで、APG でテーブルを 開 いてみてください。 最 初 はレコード<br />

が 登 録 されていないので、 空 のテーブルが 表 示 されます( 右 図 )。この 時 点 で、す<br />

でに MS-<strong>SQL</strong> Server 上 にテーブルは 作 成 されています。<br />

今 の 例 では、 内 部 的 に 次 のような CREATE TABLE 文 が 発 行 され、テーブルとインデックスが 作 成 されます。<br />

CREATE TABLE MAGIC..テスト ( 数 値 型 INT NOT NULL, 文 字 型 CHAR(10) NOT NULL)<br />

CREATE UNIQUE NONCLUSTERED INDEX BY 数 値 ON MAGIC..テスト ( 数 値 型 )<br />

ここでは、MAGIC というユーザ ID で Windows にログインしているので、テーブルのオーナ 名 が MAGIC<br />

になっています。この DDL 文 は <strong>Magic</strong> が 内 部 的 に 自 動 的 に 生 成 ・ 実 行 するので、<strong>Magic</strong> のアプリケーショ<br />

ン 開 発 者 はこれを 意 識 する 必 要 がありません。<br />

何 件 かレコードを 登 録 します ( 右 図 )。 終 わったら、ESC キー(あるいはウィンド<br />

ウ 右 上 の X ボタン)で 閉 じてください。<br />

O<strong>SQL</strong> から、テーブルの 中 身 を 見 てみましょう。データが 正 しく 作 成 されている<br />

ことを 確 認 してください。<br />

1> use magic<br />

2> select * from テスト<br />

3> go<br />

数 値 型 文 字 型<br />

----------- ----------<br />

1 赤 巻 紙<br />

2 青 巻 紙<br />

3 黄 巻 紙<br />

(3 件 処 理 されました)<br />

30 MS<strong>SQL</strong> テーブルを <strong>Magic</strong> から 扱 ってみる


4.4. データ 再 編 成<br />

<strong>Magic</strong> のテーブルリポジトリの 定 義 を 変 更 すると、MS-<strong>SQL</strong> Server 上 のテーブルも 自 動 的 に 変 更 されます。<br />

これは <strong>Magic</strong> の 自 動 データ 再 編 成 機 能 です。<br />

4.4.1. テーブルを 変 更 してみる<br />

今 の 例 で、 文 字 型 カラムを 10 文 字 から 20 文 字 に<br />

増 やし、さらに、 第 3 のカラムとして「 英 語 」と<br />

いうカラムを 追 加 しましょう。データ 型 は A= 文<br />

字 、 書 式 は 5 です。<br />

Enter キーを 2 回 押 してテーブルリポジトリを 閉 じるか、 別 のテーブルのエントリに 移 動 しようとすると、<br />

自 動 データ 再 編 成 機 能 が 開 始 されます。<br />

1. 最 初 に 確 認 画 面 が 出 ますので、「はい(Y)」で 答 えてくださ<br />

い。<br />

2. 次 に、もとのテーブルをバックアップするかを 聞 いてきます。<br />

安 全 のためにはバックアップを 取 っておくほうが 良 いですが、<br />

スペースが 余 計 に 必 要 になります。 今 はテストですので「い<br />

いえ(N)」で 答 えてください。<br />

3. テーブル 変 換 オプションが 出 てきます。 今 はこのままで OK<br />

ボタンを 押 してください。 今 回 はデータ 件 数 が 少 ないので、<br />

すぐに 終 了 するはずです。<br />

これで、MS-<strong>SQL</strong> Server 上 のテーブルも 変 更 されています。<br />

MS<strong>SQL</strong> テーブルを <strong>Magic</strong> から 扱 ってみる 31


<strong>Magic</strong> から APG をかけて、テーブルを 開 いてください。「 文 字 型 」の<br />

カラムが 広 がり、 新 たに「 英 語 」カラムができています。<br />

参 考 :<br />

新 しく 作 成 された「 英 語 」カラムのデータはすべて NULL と<br />

なります。<br />

ここでデータを 修 正 して、 新 しく 作 成 された「 英 語 」カラムにもデータを 設 定 しましょう。<br />

1. APG で「テスト」テーブルを 開 きます。<br />

2. APG でテーブルを 開 いた 状 態 ではタスクは 照 会 モードなので、デ<br />

ータを 修 正 することができません。 修 正 モードに 変 更 してくださ<br />

い。<br />

参 考 : 修 正 モードに 変 更 するには、メニュー「オプション(O)」<br />

から「 修 正 (M)」を 選 ぶか、あるいは Ctrl+M キーを 押 します。<br />

3. 「 英 語 」カラムに 適 当 にデータを 入 力 します。<br />

4. ESC で 閉 じます。<br />

O<strong>SQL</strong> からこのテーブルを 見 て、 変 更 が 正 しく 反 映 されていることを 確 認 してください。<br />

1> select * from テスト<br />

2> go<br />

数 値 型 文 字 型 英 語<br />

----------- -------------------- -----<br />

1 赤 巻 紙 Red<br />

2 青 巻 紙 Blue<br />

3 黄 巻 紙 Yello<br />

(3 件 処 理 されました)<br />

4.4.2. データ 再 編 成 機 能 の 無 効 化<br />

このように、<strong>Magic</strong> の 自 動 データ 再 編 成 機 能 を 使 うと、テーブルの 定 義 変 更 に 伴 うデータ 再 編 成 に 非 常 に 簡<br />

単 に 対 処 することができ、<strong>Magic</strong> 上 の 定 義 と 実 際 の MS-<strong>SQL</strong> Server 上 のテーブルとを 常 に 同 期 させること<br />

ができます。また、 上 では 触 れませんでしたが、データ 再 編 成 機 能 の 一 環 として、<strong>Magic</strong> のテーブルリポジ<br />

トリ 上 でのテーブル 定 義 を 削 除 すると、それにあわせて、MS-<strong>SQL</strong> Server 上 のテーブルも 削 除 されるよう<br />

になっています。これは、 開 発 途 上 でしばしばテーブル 定 義 を 変 更 したり、テーブルの 追 加 削 除 をしなけれ<br />

ばならない 状 況 では 大 変 便 利 です。<br />

しかし、 逆 に 言 うと、 不 注 意 でテーブル 定 義 を 変 更 してしまった 場 合 にも MS-<strong>SQL</strong> Server 上 のテーブルが<br />

32 MS<strong>SQL</strong> テーブルを <strong>Magic</strong> から 扱 ってみる


変 更 されてしまい、 意 図 せぬデータの 破 壊 になってしまう 可 能 性 もあります。これは 実 際 の 運 用 環 境 で 起 こ<br />

ったら 大 変 な 問 題 になります。<br />

これを 防 ぐため、<strong>Magic</strong> ではデータベーステーブルの 設 定 により、 自 動 データ 再 編 成 機 能 を 無 効 化 させるこ<br />

とができます。<br />

1. アプリケーションを 閉 じてください。(メニュー「ファイル(F)」から「アプリケーション・クローズ(C)」<br />

で 閉 じます)<br />

2. データベーステーブルを 開 いてください (メニュー「 設 定 (S)」から「データベース(B)」を 選 びます)。<br />

3. 「MS<strong>SQL</strong>」のエントリに 移 動 し、デー<br />

タベース 特 性 ダイアログを 開 いてくださ<br />

い。(マウスの 右 クリックでポップアップ<br />

メニューを 開 き「 特 性 」を 選 ぶか、ある<br />

いは Ctrl+P で 開 きます)。<br />

4. 「オプション(O)」タブを 開 きます。<br />

5. 「 開 発 モードでのテーブル 変 換 」のチェ<br />

ックをはずします。<br />

これで、この MS<strong>SQL</strong> データベースに 対 しては、 自 動 データ 再 編 成 機 能 が 無 効 となります。<br />

注 意 :<br />

自 動 データ 再 編 成 機 能 を 無 効 にした 場 合 には、<strong>Magic</strong> のテーブルリポジトリでテーブル 定 義 を 変 更 しても<br />

MS-<strong>SQL</strong> Server 上 の 実 際 のテーブルに 反 映 されません。これによりテーブル 定 義 の 不 整 合 が 発 生 し、アプリ<br />

ケーション 実 行 中 にエラーが 発 生 したり、 意 図 したとおりに 動 作 しなくなる 可 能 性 もあります。<br />

このように、 自 動 データ 再 編 成 機 能 の 有 効 / 無 効 は、 作 業 の 目 的 に 合 わせて 適 切 に 選 んでください。<br />

MS<strong>SQL</strong> テーブルを <strong>Magic</strong> から 扱 ってみる 33


4.5. 命 名 規 則<br />

Pervasive.<strong>SQL</strong> の 場 合 には、DB テーブル 名 は OS 上 のファイル 名 (Pervasive.<strong>SQL</strong> 形 式 )となり、OS のファ<br />

イル 名 として 許 容 される 名 前 ならば 任 意 に 指 定 することができました。<br />

MS-<strong>SQL</strong> Server などの <strong>SQL</strong> 系 の DBMS を 利 用 する 場 合 には、DB テーブル 名 、カラム 名 、インデックス 名<br />

などに、 各 DBMS に 固 有 な 命 名 規 則 があり、<strong>Magic</strong> のテーブルリポジトリでテーブルを 定 義 する 場 合 にも、<br />

それに 則 って 命 名 する 必 要 があります。<br />

例 えば、MS-<strong>SQL</strong> Server 2000 の 場 合 には、 命 名 に 関 して 次 のような 一 般 規 則 があります。<br />

1. 最 初 の 文 字 が 次 のいずれかである 必 要 があります。<br />

• Unicode Standard 2.0 で 定 義 されている 文 字 。Unicode の 文 字 定 義 には、 各 国 言 語 の 文 字 のほか<br />

に、ラテン 文 字 a ~ z と A ~ Z も 含 まれます。<br />

• アンダースコア (_)、アット マーク (@)、または 番 号 記 号 (#)。<br />

2. 名 前 の 先 頭 以 外 では、 次 の 文 字 を 使 用 できます。<br />

• Unicode 規 格 2.0 で 定 義 されている 文 字<br />

• Basic Latin スクリプトまたはそのほかの 各 国 スクリプトの 10 進 数<br />

• アット マーク、ドル 記 号 ($)、 番 号 記 号 、またはアンダースコア<br />

3. Transact-<strong>SQL</strong> 予 約 語 を 識 別 子 として 使 用 することはできません。<strong>SQL</strong> Server では 予 約 語 は 大 文 字 、<br />

小 文 字 ともに 予 約 されています。<br />

4. 埋 め 込 み 型 スペースおよび 特 殊 文 字 は 使 用 できません。<br />

5. これらの 規 則 に 従 わない 識 別 子 を Transact-<strong>SQL</strong> ステートメントで 使 用 する 場 合 は、 二 重 引 用 符 または<br />

角 かっこで 区 切 る 必 要 があります。<br />

テーブル 名 、カラム 名 、インデックス 名 などには、それぞれまた 細 かな 制 限 があります。 詳 細 は、MS-<strong>SQL</strong><br />

Server のリファレンスマニュアルを 参 照 してください。<br />

一 般 的 な 指 針 としては、 特 殊 文 字 の 使 用 はアンダースコア「_」 程 度 に 止 めておくことと、あまり 長 い 名 前 は<br />

避 けることです。<br />

34 MS<strong>SQL</strong> テーブルを <strong>Magic</strong> から 扱 ってみる


4.6. 名 前 の 対 応<br />

<strong>Magic</strong> の 場 合 、テーブルリポジトリ 上 に 定 義 する 名 前 と、DBMS 上 に 作 成 されるテーブルでの 名 前 とを 異 な<br />

るものとして 定 義 することが 可 能 です。ここでは、<strong>Magic</strong> のテーブルリポジトリでの 名 前 の 定 義 と DBMS<br />

上 での 名 前 との 対 応 関 係 を 説 明 します。<br />

4.6.1. テーブル 名<br />

テーブルリポジトリの「 名 前 」 欄 は、<strong>Magic</strong> 内 部 だけで 使 う 名 前 で、 任 意 の 名 前 をつけることができます。<br />

一 方 、DBMS 上 に 作 成 されるテーブルの 名 前 は、「DB テーブル」 欄 に 指 定 したものが 採 用 されます。デフ<br />

ォルトでは、「 名 前 」 欄 に 指 定 したのと 同 じ 名 前 が「DB テーブル」 欄 にも 自 動 的 に 設 定 されますが、 異 なる<br />

ものに 変 更 することが 可 能 です。<br />

4.6.2. カラム 名<br />

テーブルリポジトリの 下 半 分 のカラムテーブルでは、「 名 前 」 欄 でカラム 名 を 指 定 しますが、この 名 前 は <strong>Magic</strong><br />

内 部 でだけ 使 う 名 前 で、 任 意 の 名 前 をつけることができます。DBMS 上 に 作 成 されるテーブルのカラム 名 は、<br />

カラム 特 性 の「DB カラム 名 」が 採 用 されます。<br />

デフォルトでは「 名 前 」 欄 に 指 定 したのと 同 じ 名 前 が「DB カラム 名 」 欄 にも 自 動 的 に 設 定 されますが、 異<br />

なるものに 変 更 することが 可 能 です。<br />

MS<strong>SQL</strong> テーブルを <strong>Magic</strong> から 扱 ってみる 35


4.6.3. インデックス 名<br />

テーブルリポジトリで、カーソルを「イン<br />

デックス」 欄 に 置 くと、そのテーブルに 定<br />

義 されているインデックスが 表 示 されます。<br />

ここで、インデックスの「 名 前 」 欄 に 指 定<br />

された 名 前 は <strong>Magic</strong> 内 部 でのみ 使 う 名 前<br />

で、 任 意 の 名 前 をつけることができます。<br />

DBMS 上 で 作 成 されるインデックスの 名 前 は、インデックス 特 性 で 定 義 されます。<br />

1. インデックステーブル 上 のエントリ 上<br />

にカーソルを 置 いてください。<br />

2. インデックス 特 性 ダイアログを 開 きま<br />

す。( 右 マウスクリックでポップアップ<br />

メニューを 開 き、そこから「 特 性 」を<br />

選 びます。または、Ctrl+P キーを 押<br />

します)。<br />

3. 「<strong>SQL</strong>(Q)」タブを 開 きます。ここに<br />

「DB インデックス 名 」 欄 があります。<br />

デフォルトで、インデックスの「 名 前 」 欄 と 同 じ 名 前 が 設 定 されますが、あとから 変 更 することもできます。<br />

このように、<strong>Magic</strong> では DBMS 上 での 名 前 と <strong>Magic</strong> 内 部 での 名 前 とを 別 々に 設 定 できるようになっている<br />

ので、DBMS での 命 名 規 約 を 守 りつつ、<strong>Magic</strong> の 中 ではそれに 縛 られないわかりやすい 名 前 をつけることが<br />

できるようになっています。このことは、 開 発 ・ 保 守 時 のプログラムのわかりやすさを 向 上 させるとともに、<br />

DBMS の 移 植 性 ( 異 なる DBMS にアプリケーションを 移 行 させる)を 向 上 させるのにも 役 立 っています。<br />

36 MS<strong>SQL</strong> テーブルを <strong>Magic</strong> から 扱 ってみる


4.7. 一 意 インデックスの 定 義<br />

MS-<strong>SQL</strong> Server 上 にあるテーブルを <strong>Magic</strong> からアクセスする 場 合 に、ひとつ 重 要 な 約 束 ごとがあります。<br />

それは、「ユニークインデックスを 必 ず 一 つは 定 義 しておかなければならない」ということです。<br />

<strong>Magic</strong> では、インデックスの 定 義 で「タイプ」<br />

欄 を「U= 重 複 不 可 」に 設 定 すると、MS-<strong>SQL</strong><br />

Server 上 でユニークキーが 作 成 されます。<br />

例 えば、テー ブル「テスト」のインデックス<br />

の 定 義 をもういちど 見 てみると、「BY 数 値 」<br />

という 名 前 のインデックスが「U= 重 複 不 可 」<br />

に 設 定 されています。このようなインデック<br />

スが 一 つでもあれば OK です。<br />

各 テーブルに 最 低 一 つのユニークキーを 定 義 しておく 必 要 があるかどうかは、DBMS により 異 なります。 表<br />

4-1 に、DBMS ごとの 必 要 性 をまとめました。<br />

表 4-1 ユニークインデックスの 必 要 の 有 無<br />

ユニークインデックスを 必 要 とする<br />

MS-<strong>SQL</strong> Server<br />

DB2/UDB<br />

ODBC<br />

必 要 としない<br />

Pervasive.<strong>SQL</strong><br />

Memory<br />

Oracle<br />

このようなことから、 例 えば、Pervasive.<strong>SQL</strong> で 作 成 したアプリケーションを MS-<strong>SQL</strong> Server に 移 植 する<br />

ような 場 合 にユニークインデックスの 有 無 のチェックが 必 要 で、 必 要 に 応 じてユニークインデックスを 付 加<br />

してください。<br />

なお、この 制 限 は <strong>Magic</strong> の 実 行 方 式 と DBMS の 機 能 との 兼 ね 合 いから 来 るもので、MS-<strong>SQL</strong> Server 自 身 の<br />

制 限 ではありません。<br />

MS<strong>SQL</strong> テーブルを <strong>Magic</strong> から 扱 ってみる 37


5. 定 義 取 得<br />

前 章 では、<strong>Magic</strong> のテーブルリポジトリで 定 義 したテーブルを MS-<strong>SQL</strong> Server 上 に 作 成 する、という 方 法<br />

を 説 明 しました。<br />

本 章 ではその 逆 に、MS-<strong>SQL</strong> Server にすでに 存 在 するテーブルを <strong>Magic</strong> に 取 り 込 む、 定 義 取 得 の 機 能 につ<br />

いて 説 明 します。<br />

まず、 実 験 の 準 備 として、テーブルをいくつか MS-<strong>SQL</strong> Server 上 に 作 成 しておきましょう。O<strong>SQL</strong> を 使 っ<br />

て、 簡 単 なテーブルを 二 つほど 定 義 しておきます。<br />

1. テキストファイルに 以 下 の 内 容 を 書 き 出 しておいてください。 名 前 は「 顧 客 商 品 .sql」などとしておき<br />

ます。<br />

USE MAGIC<br />

CREATE TABLE 顧 客 ( 顧 客 番 号 INT NOT NULL, 顧 客 名 CHAR(20), 顧 客 名 ヨミ CHAR(20), 住 所 CHAR(60))<br />

CREATE UNIQUE INDEX BY 顧 客 番 号 ON 顧 客 ( 顧 客 番 号 )<br />

CREATE INDEX BY 顧 客 名 ON 顧 客 ( 顧 客 名 )<br />

INSERT INTO 顧 客 VALUES(100231,' 山 口 サービス','ヤマグチサービス',' 東 京 都 武 蔵 野 市 山 田 町 2-1-23')<br />

INSERT INTO 顧 客 VALUES(100240,' 岡 村 不 動 産 ','オカムラフドウサン',' 東 京 都 豊 島 区 南 大 塚 1-2-3')<br />

INSERT INTO 顧 客 VALUES(100252,' 富 山 薬 局 ','トヤマヤッキョク',' 東 京 都 渋 谷 区 西 3-15-5')<br />

CREATE TABLE 商 品 ( 商 品 番 号 INT NOT NULL, 商 品 名 CHAR(20), 単 価 INT, 有 効 BIT)<br />

CREATE UNIQUE INDEX BY 商 品 番 号 ON 商 品 ( 商 品 番 号 )<br />

CREATE INDEX BY 商 品 名 ON 商 品 ( 商 品 名 )<br />

INSERT INTO 商 品 VALUES(5023,'ウマカコーヒー',500,0x01)<br />

INSERT INTO 商 品 VALUES(5055,' 山 梨 観 光 地 割 引 切 符 ',23500,0x01)<br />

INSERT INTO 商 品 VALUES(6034,' 加 湿 器 SVKR-703',13200,0x01)<br />

GO<br />

2. コマンドラインから、 次 のコマンドを 実 行 します。これは、 指 定 したファイルから <strong>SQL</strong> 文 を 読 み 込 み、<br />

すべて 実 行 するものです。<br />

C:¥Program Files¥<strong>Magic</strong>¥eDeveloperPlusTrial> osql -E -i 顧 客 商 品 .sql -n<br />

(1 件 処 理 されました)<br />

(1 件 処 理 されました)<br />

(1 件 処 理 されました)<br />

(1 件 処 理 されました)<br />

(1 件 処 理 されました)<br />

(1 件 処 理 されました)<br />

C:¥Program Files¥<strong>Magic</strong>¥eDeveloperPlusTrial><br />

これで、MS-<strong>SQL</strong> Server 上 に「 顧 客 」と「 商 品 」というテーブルが 作 成 され、それぞれ 3 レコードづつデ<br />

ータが 挿 入 されました。<br />

38 定 義 取 得


5.1. 複 数 のテーブルの 定 義 取 得<br />

準 備 が 整 ったので、<strong>Magic</strong> から 定 義 取 得 をしてみましょう。ここでは、MS-<strong>SQL</strong> Server 上 に 定 義 されてい<br />

るテーブルの 一 覧 をまず 取 得 し、そこから 実 際 に 定 義 取 得 するテーブルを 選 択 する 方 法 を 示 します。<br />

1. アプリケーション「MS<strong>SQL</strong> TEST」を 開 きます。<br />

2. テーブルリポジトリを 開 きます。<br />

3. カーソルをタイトル 行 においておきます。 先<br />

頭 の 行 にカーソルがある 状 態 で、さらに ↑<br />

キーを 押 すと、カーソルがタイトル 行 に 移 動<br />

します。 右 図 のように、カーソルが 三 角 形 に<br />

なって 表 示 されます。<br />

4. メニュー「オプション(O)」から、「 定 義 取 得 (G)」を 選 択 します。 定 義 取 得 ダイアログが 開 きます。( 以<br />

下 、 図 5-1 参 照 )<br />

5. 「データベース」 欄 からズーム(F5 キー、またはダブルクリック)すると、データベーステーブルに 登 録<br />

されているデータベースの 中 から、 定 義 取 得 の 機 能 をサポートするものの 一 覧 が 表 示 されます。 今 の 場<br />

合 、「MS<strong>SQL</strong>」のみですので、これを 選 択 します。<br />

6. 「タグテーブル」 欄 を「S= 選 択 」にすると、テーブル 選 択 画 面 が 表 示 されます。<br />

7. 「dbo. 顧 客 」と「dbo. 商 品 」とを 選 択 します。テーブルの 選 択 をするには、 選 択 するテーブルの 行 にカ<br />

ーソルを 合 わせ、スペースキーを 押 すと、 選 択 を 示 すチェック 記 号 「V」がトグルします。<br />

8. 「 選 択 」 ボタンを 押 すと、 選 択 したテーブルの 数 が「テーブル」 欄 に 表 示 されます。 今 の 場 合 は、 二 つ<br />

のテーブルを 選 択 しているので、「2」が 表 示 されています。<br />

9. OK ボタンを 押 すと、 定 義 取 得 が 実 行 されます。<br />

10. 定 義 取 得 が 完 了 したら、テーブルリポジトリに「 顧 客 」と「 商 品 」のエントリが 追 加 されているはずで<br />

す。<br />

正 しく 定 義 取 得 ができたかを 確 認 するために、APG でテーブルを 開 いて 内 容 を 確 認 してください。<br />

定 義 取 得 39


図 5-1 定 義 取 得 の 手 順<br />

定 義 取 得<br />

メニューを<br />

選 択<br />

データベース 欄 から<br />

ズームして、MS<strong>SQL</strong><br />

を 選 択<br />

OKを 押 すと 定 義 取 得<br />

が 実 行 される。<br />

タグテーブル 欄 をS= 選 択 にする<br />

と、テーブル 選 択 画 面 が 出 るの<br />

で、 顧 客 と 商 品 を 選 択<br />

40 定 義 取 得


5.2. 特 定 のテーブルの 定 義 取 得<br />

前 節 での 定 義 取 得 の 方 法 は、MS-<strong>SQL</strong> Server に 定 義 されているテーブルの 一 覧 をいったん 取 得 し、その 中<br />

から 実 際 に 定 義 取 得 したいものを 選 択 して 定 義 取 得 する、という 方 法 でした。この 方 法 は 便 利 なのですが、<br />

MS-<strong>SQL</strong> Server に 定 義 されているテーブルが 何 百 何 千 とあるような 場 合 には、 一 覧 を 取 得 するのに 時 間 が<br />

かかるし、また、その 中 から 選 択 するにも 時 間 がかかります。<br />

もし、すでに 名 前 のわかっているテーブルを 一 つだけ 定 義 取 得 したい、というような 場 合 には、 一 覧 を 取 得<br />

してその 中 から 選 択 する、というのは 却 ってわずらわしいこともあります。このような 場 合 には、 一 覧 を 表<br />

示 させずに、テーブル 名 を 直 接 指 定 して 定 義 取 得 する、ということもできます。<br />

1. テーブルリポジトリで、F4 キーにより 新 規 の 行 を 作 成 します。<br />

2. 「DB テーブル」 欄 に、 定 義 取 得<br />

したいテーブルの 名 前 を 指 定 しま<br />

す。<br />

3. 「データベース」 欄 からズームし、<br />

「MS<strong>SQL</strong>」を 選 択 します。<br />

4. この 行 にカーソルがある 状 態 で、メニュー「オプション(O)」から「 定 義 取 得 (G)」を 選 択 します。 定 義<br />

取 得 が 実 行 されます。<br />

5. 定 義 取 得 が 完 了 したら、カラム<br />

やインデックスに 定 義 が 設 定 さ<br />

れているはずです。( 右 図 )<br />

同 じく、 定 義 取 得 が 正 しく 行 われたかを APG で 確 認 してください。<br />

定 義 取 得 41


5.3. 定 義 取 得 の 結 果 を 見 てみる<br />

定 義 取 得 して 取 得 したテーブルのエントリの 内 容 を 見 てみましょう。<br />

「4.6 名 前 の 対 応 」(35 ページ)で 説 明 したように、MS-<strong>SQL</strong> Server 上 に 定 義 されている 名 前 と、<strong>Magic</strong> 上<br />

での 名 前 の 対 応 付 けは、 表 5-1 のようになっています。<br />

表 5-1 DBMS での 名 前 と <strong>Magic</strong> での 名 前 の 対 応 表<br />

MS-<strong>SQL</strong> Server 上 での 定 義 <strong>Magic</strong> での 定 義<br />

テーブル 名<br />

「DB テーブル」 欄<br />

カラム 名 カラム 特 性 の「DB カラム 名 」<br />

インデックス 名<br />

インデックス 特 性 の「<strong>SQL</strong>(Q)」タブの「DB インデックス 名 」 欄<br />

テーブルリポジトリで、 定 義 取 得 したテーブルのエントリを 見 て、 上 の 表 のように 設 定 がされていることを<br />

確 認 してください。<br />

ここでひとつ 抜 けている 項 目 があります。それはデータベースのオーナー 名 です。 先 ほど 定 義 取 得 したテー<br />

ブル「 顧 客 」と「 商 品 」は、O<strong>SQL</strong> で CREATE TABLE するときにオーナー 名 を 指 定 せずに 作 成 したので、<br />

デフォルトでオーナーは dbo となっています。それで 定 義 取 得 時 の「 選 択 テーブル」 一 覧 にも「dbo. 顧 客 」<br />

のような 名 前 で 表 示 されていました。このオーナー 名 「dbo」はどこに 行 ってしまったのでしょうか?<br />

答 えは、「テーブル 特 性 」です。 次 のようにしてオーナー 名 が 設 定 されていることを 確 認 してください。<br />

1. 定 義 取 得 したテーブルのエントリ<br />

にカーソルを 置 きます。<br />

2. テーブル 特 性 ダイアログを 開 きま<br />

す。テーブル 特 性 ダイアログは、<br />

右 マウスボタンクリックでポップ<br />

アップメニューを 開 き「 特 性 」を<br />

選 択 するか、あるいは Ctrl+P キ<br />

ーにより 開 きます。<br />

3. 「<strong>SQL</strong>(Q)」タブを 開 きます。「オ<br />

ーナー 名 」 欄 に「dbo」と 設 定 さ<br />

れているはずです。<br />

42 定 義 取 得


5.4. ビューの 定 義 取 得<br />

<strong>SQL</strong> データベースでは、 実 際 のデータを 格 納 している 実 テーブルのほかに、 実 テーブルの 上 に 仮 想 的 に 定 義<br />

されたビューがあります。<strong>Magic</strong> では、DBMS に 定 義 されているビューも 定 義 取 得 することができます。<br />

実 験 をするにあたり、 簡 単 なビュー 高 額 商 品 を 定 義 しておきましょう。<br />

1> use magic<br />

2> go<br />

1> create view 高 額 商 品 as select 商 品 番 号 , 商 品 名 from 商 品 where 単 価 > 10000<br />

2> go<br />

1> select * from 高 額 商 品<br />

2> go<br />

商 品 番 号 商 品 名<br />

----------- --------------------<br />

5055 山 梨 観 光 地 割 引 切 符<br />

6034 加 湿 器 SVKR-703<br />

(2 件 処 理 されました)<br />

5.4.1. ビューの 定 義 取 得<br />

ここで 高 額 商 品 ビューを 定 義 取 得 してみましょう。やりかたは 前 節 で 説 明 したのと 同 じです。<br />

1. テーブルリポジトリに、F4 で 新 規 行 を 作 成 する。<br />

2. 「DB テーブル」 欄 を「 高 額 商 品 」とし、「データベース」は「MS<strong>SQL</strong>」とする。<br />

3. メニュー「オプション(O)」から「 定 義 取 得 (G)」を 選 び、 定 義 取 得 を 実 行 する。<br />

定 義 取 得 した 結 果 を 右 図 に 示 しま<br />

す。これを 見 ると、カラム 情 報 は<br />

取 得 されていますが、インデック<br />

ス 欄 は「0」であり、ひとつもあ<br />

りません。ビューにはインデック<br />

スを 定 義 することができないので、<br />

当 然 な 結 果 です。<br />

しかし、「4.7 一 意 インデックスの 定 義 」(37 ページ)で 説 明 したとおり、MS-<strong>SQL</strong> Server のデータを <strong>Magic</strong><br />

から 扱 う 場 合 には、ユニークインデックスが 最 低 一 つが 必 要 です。 従 って、この 状 態 でシンタックスチェッ<br />

ク(F8 キー)をかけるか、あるいは APG を 行 おうとすると、 下 図 のようにエラーがでます。<br />

定 義 取 得 43


では、どうすれば 良 いのでしょうか?このような 状 況 に 対 応 するために、<strong>Magic</strong> には 仮 想 インデックスが 定<br />

義 できます。<br />

5.4.2. 仮 想 インデックスの 定 義<br />

仮 想 インデックスというのは、<strong>Magic</strong> のテーブルリポジトリ 上 で、<strong>Magic</strong> プログラムの 実 行 を 目 的 としてだ<br />

け 定 義 される 仮 想 的 なインデックスで、DBMS 上 には 対 応 するインデックスが 実 際 になくとも 構 いません。<br />

<strong>Magic</strong> のプログラムからは、 通 常 の 実 インデックスと 同 じように 扱 うことができます。<br />

今 の 例 では、「 商 品 番 号 」カラムが 重 複 不 可 のカラムであることがわかっているので、「 商 品 番 号 」カラムを<br />

重 複 不 可 の 仮 想 インデックスとして 定 義 します。 仮 想 インデックスの 定 義 は 次 のように 行 います。<br />

1. テーブルリポジトリの「インデ<br />

ックス 欄 」にカーソルをあわせ、<br />

通 常 のインデックスを 定 義 する<br />

場 合 とまったく 同 じようにイン<br />

デックスとインデックスセグメ<br />

ントとを 定 義 します。ここでは<br />

名 前 を「 商 品 番 号 」とします。<br />

2. このインデックスのインデック<br />

ス 特 性 ダイアログを 開 きます。<br />

インデックス 特 性 ダイアログを<br />

開 くには、インデックス「 商 品 番 号 」のエントリ<br />

にカーソルを 置 いて、 右 クリックでポップアップメニューを 開 き、「 特 性 」を 選 択 します。<br />

(あるいは、Ctrl+P キーでもできます)。<br />

3. 「<strong>SQL</strong>(Q)」タブを 開 きます。<br />

4. 「タイプ」 欄 を「V= 仮 想 キー」に 選 び<br />

ます。<br />

このように 仮 想 キーを 定 義 しておけば、ビューであっても、あたかもユ<br />

ニークキーが 存 在 しているかのように 扱 いますので、<strong>Magic</strong> からテーブ<br />

ルを 開 いて 見 ることができるようになります。<br />

44 定 義 取 得


5.4.3. 仮 想 インデックス 利 用 上 の 注 意<br />

仮 想 キーは、あくまで <strong>Magic</strong> の 中 でだけ 仮 想 的 に 定 義 されているものなので、 実 キーのある 場 合 と 全 く 同 じ<br />

ではありません。 仮 想 インデックスを 利 用 する 際 には、いくつかの 点 に 注 意 する 必 要 があります。<br />

• 範 囲 指 定 検 索 時 のパフォーマンス 上 のメリットが 出 るとは 限 らない。 一 般 に、 実 インデックスが 定 義 さ<br />

れているカラムに 対 して 範 囲 を 指 定 してレコード 検 索 を 行 うと、インデックスの 効 果 により 高 速 にレコ<br />

ードをアクセスすることができます。しかし、 仮 想 インデックスの 場 合 には、<strong>Magic</strong> の 中 で 仮 想 的 に 定<br />

義 されているだけであり、DMBS 上 に 実 際 にインデックスがあるわけではないので、 範 囲 を 指 定 しても<br />

インデックスを 使 った 高 速 検 索 が 行 われず、 全 数 検 索 になってしまうこともあります。<br />

• 重 複 値 のチェックが 行 われるとは 限 らない。ユニークな 実 インデックスのある 場 合 には、 重 複 値 のチェ<br />

ックが DBMS により 必 ず 行 われ、 重 複 値 のあるレコードを 挿 入 ・ 更 新 しようとすると、DBMS がエラ<br />

ーを 出 します。しかし、 仮 想 キーの 場 合 には 重 複 値 のチェックのメカニズムがないため、DBMS による<br />

重 複 値 のチェックが 働 きません。<br />

• 重 複 不 可 の 仮 想 キーを 定 義 する 場 合 には、 定 義 したインデックスセグメントの 組 み 合 わせで、 必 ずレコ<br />

ードが 一 意 に 識 別 されるようになっていなければなりません。これを 保 証 するのはアプリケーションの<br />

開 発 者 の 責 任 となります。<strong>Magic</strong> には 仮 想 キーの 一 意 性 をチェックするメカニズムはありません。<br />

例 えば、 実 際 には 重 複 がありうるカラムを 使 って、 重 複 不 可 の 仮 想 インデックスを 定 義 することは 可 能<br />

です。しかし、そのようにインデックスの 一 意 性 に 不 整 合 がある 場 合 には、 実 行 結 果 は 予 測 できないも<br />

のになります。<br />

なお、 仮 想 インデックスは、ビューだけでなく 実 テーブルに 対 しても 定 義 することが 可 能 です。この 場 合 に<br />

は、<strong>Magic</strong> が 内 部 的 に MS-<strong>SQL</strong> Server に 発 行 する SELECT 文 に、 仮 想 インデックスに 定 義 されているセ<br />

グメントを 指 定 して ORDER BY ・・・ 句 がつけられて 実 行 されます。 実 行 時 になんらかの 実 インデック<br />

スが 使 われるか 否 かなどは、DBMS のオプティマイザが 決 定 します。<br />

実 テーブルに 対 する 仮 想 インデックスの 利 用 の 用 途 としては、あるテーブルが 特 定 のレコード 順 に 処 理 され<br />

るケースが 多 いのに、 実 インデックスが 定 義 されていない 場 合 などに、 仮 想 インデックスを 定 義 して、タス<br />

ク 特 性 の「インデックス」にその 仮 想 インデックスを 指 定 する、というような 使 い 方 が 考 えられます。<br />

定 義 取 得 45


6. ペットショップサンプルの 設 定<br />

前 章 までで <strong>Magic</strong> の <strong>SQL</strong> 対 応 機 能 の 基 本 の 説 明 をしましたので、 本 章 からは、ペットショップデモを<br />

Pervasive.<strong>SQL</strong> から MS-<strong>SQL</strong> Server に 移 植 する 方 法 を 説 明 します。<br />

最 初 に、サンプルアプリケーションを 設 定 する 方 法 を 説 明 します。<br />

6.1.1. サンプルについて<br />

本 チュートリアルと 一 緒 に 配 布 され<br />

るサンプルは、ZIP 形 式 でパックさ<br />

れています。ファイルを <strong>Magic</strong> ディ<br />

レクトリで 解 凍 すると、サブディレ<br />

クトリとして petshop_sql が 作 成<br />

され、その 下 に 二 つの MCF ファイ<br />

ルと、その 他 のファイル、サブディ<br />

レクトリがあります。<br />

ファイル/ディレクトリ 名<br />

PETSHOP_CTL.MCF<br />

PETSHOP 最 終 _CTL.MCF<br />

*.MST、*.dat ファイル<br />

restore ディレクトリ<br />

text<br />

意 味<br />

Pervasive 版 のペットショップ。これが 第 7 章 「データ 移 行 」(49 ページ<br />

より)の 出 発 点 となります。<br />

MS-<strong>SQL</strong> 対 応 版 のペットショップ。 第 7 章 以 降 に 従 い 順 を 追 って 修 正 し<br />

ていった 最 終 形 です。<br />

Pervasive 形 式 のデータファイルです。<br />

このディレクトリのコピーおよびリポジトリ 出 力 形 式 が 格 納 されていま<br />

す。このファイルをコピーしなおしたり、リポジトリ 入 力 しなおしたり<br />

することにより、いつでも 初 期 状 態 に 戻 すことができます。<br />

マスターテーブルのサンプルデータをテキストファイルとして 格 納 した<br />

ものが 格 納 されています。<br />

参 考 : MCF ファイルは、<strong>V9Plus</strong> 9.40JSP3 形 式 です。 異 なるバージョン/SP の <strong>Magic</strong> をお 使 いの 場 合 には、<br />

restore ディレクトリにあるリポジトリ 出 力 形 式 より、リポジトリ 入 力 してください。<br />

46 ペットショップサンプルの 設 定


6.1.2. 論 理 名 の 設 定<br />

次 に、<strong>Magic</strong> を 起 動 して、 論 理 名 を 設 定 します。<br />

論 理 名 というのは、<strong>Magic</strong> アプリケーションの 移 行 ・ 配 布 を 容 易 化 するための 機 能<br />

のひとつです。DOS や UNIX での 環 境 変 数 に 似 た 機 能 で、 実 行 時 にファイル 名 な<br />

どの 置 き 換 えを 行 います。<br />

論 理 名 と 実 行 時 に 置 き 換 えられる 名 前 ( 実 行 名 )は、 論 理 名 テーブルで 定 義 します。<br />

論 理 名 テーブルは、メニュー「 設 定 (S)」から「 論 理 名 (N)」で 開 くことができます( 右<br />

図 )。<br />

論 理 名 テーブルで、F4 キーで 新 規 に 行 を 追 加 し、「 名 前 」<br />

を「PETSHOP<strong>SQL</strong>」、「 実 行 名 」を「.¥petshop_sql¥」と<br />

設 定 してください。<br />

このように 設 定 しておくと、<strong>Magic</strong> プログラムの 中 で、「%<br />

PETSHOP<strong>SQL</strong>%」と 指 定 してあるところでは、 実 行 時 に<br />

これが「.¥petshop_sql¥」に 変 換 されます。<br />

例 えば、<strong>SQL</strong> 化 前 の Pervasive のペットショップアプリケーションでは、テーブルリポジトリの「DB テー<br />

ブル」の 欄 で 使 われています。<br />

図 6-1 Pervasive 版 のテーブルリポジトリでの 論 理 名 の 使 用<br />

例 えば、 制 御 テーブルの DB テーブル 欄 は「%PETSHOP<strong>SQL</strong>% 制 御 .DAT」となっていますが、これが 実 行<br />

時 には「.¥petshop_sql¥ 制 御 .DAT」として 認 識 されます。<br />

なお、 論 理 名 テーブルに 定 義 した 論 理 名 と 実 行 名 の 対 応 は、MAGIC.INI<br />

[MAGIC_LOGICAL_NAMES]セクションに 格 納 されます。<br />

ファイルの<br />

Pervasive を 使 った 場 合 、DB テーブル 欄 にはファイル 名 を 指 定 するのですが、ここで 論 理 名 を 使 って 指 定<br />

しておけば、 実 際 の 運 用 環 境 で、 開 発 時 とは 異 なるディレクトリにデータファイルを 格 納 する 場 合 にも、ア<br />

プリケーションを 変 更 することなく、MAGIC.INI の 設 定 の 変 更 だけで 対 応 することができます。<br />

ペットショップサンプルの 設 定 47


6.1.3. アプリケーションテーブルの 追 加<br />

提 供 されるサンプルアプリケーションを、アプリケーションテーブルに 登 録 してください。<br />

アプリケーションテーブルは、メニュー「 設 定 (S)」→「アプリケーション(A)」で 開 くことができます。 今<br />

の 場 合 には 既 存 の MCF を 指 定 してアプリケーション 登 録 をするので、 図 6-2 のように 登 録 してください。<br />

ここでも 論 理 名 を 使 うのが 便 利 です。<br />

図 6-2 アプリケーションテーブルへの 登 録<br />

• #4 の「PETSHOP_CTL」が Pervasive 版 のスタートポイントとなる MCF で、 第 7 章 以 降 では、これ<br />

を 修 正 していきます。<br />

• #5 の「PETSHOP 最 終 _CTL」は、 本 書 に 従 って 作 成 していったときの 最 終 形 です。 読 み 進 むうちにわ<br />

からないところがあったら、 参 考 にしてください。<br />

6.1.4. フォントテーブルの 追 加<br />

ペットショップアプリケーションでは、 印 刷 プログラムでフォント 111 番 と 112 番 とを 参 照 しています。 標<br />

準 で <strong>Magic</strong> をインストールした 場 合 には、フォントは 110 番 までしか 定 義 されていないので、ここでフォン<br />

ト 111 番 と 112 番 とを 登 録 してください ( 下 図 参 照 )。111 番 は 印 刷 のタイトルですので、 少 し 大 きめのフォ<br />

ント(24 ポイントなど)とし、112 番 は 通 常 印 刷 フォントなので、11 ポイントくらいがいいでしょう。<br />

48 ペットショップサンプルの 設 定


7. データ 移 行<br />

アプリケーション 移 行 の 第 一 歩 として、Pervasive 版 の Petshop デモのデータを MS-<strong>SQL</strong> に 移 行 しましょ<br />

う。<br />

<strong>Magic</strong> は 各 DBMS ごとに 開 発 された <strong>Magic</strong> データベースゲートウェイを 使 うことにより、DBMS ごとの 違<br />

いをできるだけ 吸 収 するように 設 計 されています。そのため、<strong>Magic</strong> のテーブルリポジトリにいったん 定 義<br />

されてしまえば、 実 際 の DBMS が Pervasive.<strong>SQL</strong> であっても MS-<strong>SQL</strong> Server であっても、あるいはその<br />

他 の DBMS であっても、<strong>Magic</strong> プログラムからは 同 じように 参 照 し 利 用 することができます。そのため、<br />

データ 移 行 においても、たとえ 異 なる DBMS への 移 行 であっても、<strong>Magic</strong> であれば 比 較 的 容 易 に 行 うこと<br />

ができます。<br />

<strong>Magic</strong> を 使 ったデータ 移 行 には、 次 のような 方 法 があります。<br />

• <strong>Magic</strong> のデータ 再 編 成 機 能 を 使 う<br />

• テキスト 出 力 ・ 入 力 で 移 行<br />

• データ 移 行 用 のプログラムを 作 成 する<br />

これらについて、 本 章 で 説 明 していきます。<br />

参 考 : 以 下 の 説 明 に 先 立 って、「PETSHOP_CTL」アプリケーションを 開 いておいてください。<br />

データ 移 行 49


7.1. <strong>Magic</strong> のデータ 再 編 成 機 能 を 使 う<br />

<strong>Magic</strong> のデータ 再 編 成 機 能 については、「4.4 データ 再 編 成 」(31 ページ)に 説 明 しました。そこではカラム 定<br />

義 を 変 更 する 場 合 について 説 明 しましたが、データ 再 編 成 機 能 はデータベースを 変 更 する 場 合 にも 有 効 にな<br />

ります。つまり、テーブルリポジトリで「データベース」 欄 を 変 更 することだけで、データの 移 行 が 自 動 的<br />

に 行 われます。<br />

実 際 には、テーブルやカラムの 命 名 規 約 など DBMS 固 有 の 制 限 に 基 づくいくつかの 細 かなことを 注 意 する<br />

必 要 がありますが、 逆 に 言 えば、それさえ 押 さえておけば 設 定 一 つで 移 行 ができてしまう、というのは、 開<br />

発 時 に 大 変 便 利 な 機 能 といえます。<br />

7.1.1. データ 再 編 成 によるデータベース 移 行 の 手 順<br />

次 に、ペットショップデモのテーブルを Pervasive.<strong>SQL</strong> から MS-<strong>SQL</strong> Server へ 移 行 する 手 順 を「 制 御 テー<br />

ブル」を 例 にして 説 明 します。<br />

1. テーブルリポジトリを 開 き、「 制 御 テーブル」の 行 にカーソルをおきます。<br />

2. Tab キーを 押 して、カーソルを「カラム」 欄 に 置 きます。<br />

3. F5 キーを 押 して、カラムテーブルに 移 動 します。<br />

4. 各 カラムについて、カラム 特 性 の「DB カラム 名 」が MS-<strong>SQL</strong> Server の 命 名 規 則 に 反 していないかを<br />

確 認 します。<br />

「 制 御 テーブル」の 場 合 に<br />

は、「 消 費 税 %」カラムの<br />

「%」はダメなので、DB<br />

カラム 名 を「 消 費 税 率 」に<br />

変 更 します。 他 は OK です。<br />

5. Enter キーを 一 度 押 して、<br />

カーソルを 上 の「カラム」<br />

欄 に 戻 します。<br />

6. Tab キーを 3 回 押 して、<br />

「DB テーブル」 欄 に 移 動<br />

します。<br />

7. 「DB テーブル」の 名 前 は「%PETSHOP<strong>SQL</strong>% 制 御 .DAT」ですが、MS-<strong>SQL</strong> Server の 規 約 にあわせ、<br />

単 に「 制 御 」とします。<br />

8. Tab キーを 押 して、「データベース」 欄 に 移 動 します。<br />

9. 「データベース」 欄 からズーム(F5 キー)して、データベースを「Default Database」から「MS<strong>SQL</strong>」<br />

に 変 更 します。<br />

10. ここで APG を 実 行 してみます。(あるいは、 別 のテーブルにカーソルを 移 動 します)。このタイミングで<br />

自 動 データ 再 編 成 機 能 が 働 きます。<br />

11. 「4.4 データ 再 編 成 」に 書 いたのと 同 様 に、 次 のような 確 認 ダイアログが 出 てきます:<br />

50 データ 移 行


(ア) 「 変 換 しますか?」には「はい(Y)」で 答 えます。<br />

(イ) 「バックアップしますか?」には、「いいえ(N)」で 答 えます。(バ<br />

ックアップを 取 っておきたい 場 合 には、はいで 答 えてくださ<br />

い。)<br />

(ウ) 「インデックスをスキャンしますか?」には、そのまま OK ボ<br />

タンを 押 します。<br />

以 上 が 完 了 したら、データは MS<strong>SQL</strong> に 移 行 されたはずです。<br />

7.1.2. データベースの 確 認<br />

再 度 APG を 実 行 して、テーブルの<br />

中 身 を 確 認 してください。<br />

Pervasive.<strong>SQL</strong> の 時 とまったく 同 じ<br />

ようにデータが 表 示 されます。<br />

念 のため、O<strong>SQL</strong> からもテーブルが 確 認 されデータが 移 行 されたことを 確 認 してください。<br />

C:¥>osql –E –w 1000<br />

1> use magic<br />

2> select * from 制 御<br />

3> go<br />

制 御 キー 消 費 税 率 最 終 受 注 番 号 顧 客 へのメッセージ<br />

-------- -------- ------------ -------------------------<br />

1 3.0 103 0xAA0082B182CC937882CD81418...<br />

(1 件 処 理 されました)<br />

1><br />

注 意 : 実 際 には、O<strong>SQL</strong> の 結 果 は、 上 の 図 よりももっと 見 にくい 形 で 表 示 されます。 上 の 図 は 見 やすくす<br />

るために「 顧 客 へのメッセージ」の 部 分 のうしろの 方 を 省 略 しています。<br />

7.1.3. 「 顧 客 へのメッセージ」のデータ 型 について<br />

ここで、「 顧 客 へのメッセージ」は、バイナリ 16 進 形 式 で 表 示 されますが、これはこのカラムが <strong>Magic</strong> 上 で<br />

メモ 型 として 定 義 されているためです。メモ 型 は <strong>Magic</strong> に 固 有 なタイプなので、MS-<strong>SQL</strong> Server 上 では<br />

varbinary 型 にマッピングさるため、O<strong>SQL</strong> で 表 示 するとこのようにバイナリ 16 進 形 式 で 表 示 されます。<br />

「 制 御 」テーブルを <strong>Magic</strong> だけからアクセスする 場 合 には、このような 形 式 で 格 納 しておいても 問 題 ありま<br />

せんが、<strong>Magic</strong> 以 外 のアプリケーションとデータを 共 有 したい 場 合 には、varbinary 型 よりも char 型 で 格 納<br />

データ 移 行 51


しておくほうが 適 当 です。このような 場 合 、 一 番 簡 単 には、このカラムをメモ 型 として 定 義 するのではなく、<br />

通 常 の 文 字 型 として 定 義 すれば 対 応 できます。また、 場 合 によって <strong>Magic</strong> がデフォルトで 設 定 する 型 と 異 な<br />

る 型 で MS-<strong>SQL</strong> Server 上 で 定 義 したいと 思 うことがありますが、この 方 法 については 本 書 の 範 囲 を 超 えて<br />

しまうので、リファレンスマニュアルの 第 4 章 「テーブル」、 第 25 章 「<strong>SQL</strong> に 関 する 考 慮 事 項 」などを 参 照<br />

してください。<br />

7.1.4. 自 動 再 編 成 がうまくいかない 場 合<br />

さて、この 自 動 再 編 成 機 能 は 便 利 には 違 いありませんが、ちゃんとできたでしょうか? 自 動 再 編 成 機 能 は、<br />

実 際 には 慎 重 に 操 作 しなければ 失 敗 しがちです。 例 えば、まだ 修 正 が 全 部 済 んでいないのにマウスクリック<br />

を 間 違 えて 別 のテーブルのエントリをクリックしてしまうと、そこで 再 編 成 が 始 まってしまうので、キャン<br />

セルしなくてはなりませんが、この 状 態 は 中 途 半 端 な 状 態 なので、ここから 再 度 定 義 を 修 正 しなおして 再 編<br />

成 をかけても、うまくいかない 場 合 があります。この 場 合 には、データ(ファイル)と 定 義 を 最 初 に 戻 して、<br />

再 度 やりなおしをしなければなりません。<br />

慣 れてくると、 失 敗 しないやりかたのコツをのみこめてくると 思 いますが、 慣 れないうちには、あるいは 失<br />

敗 によるやりなおしをなるべく 避 けるには、 次 に 説 明 するデータ 出 力 ・ 入 力 を 使 ってデータ 移 行 を 行 う 方 が<br />

確 実 です。<br />

52 データ 移 行


7.2. テキスト 出 力 ・ 入 力 で 移 行<br />

この 方 法 は、データ 再 編 成 機 能 によるデータベース 移 行 を 行 うのではなく、<br />

1. 変 更 前 、もとのデータベース(Pervasive.<strong>SQL</strong>)でデータをテキストファイルで 出 力 する。<br />

2. データベースを 変 更 する。この 際 、データ 再 編 成 機 能 は 実 行 しない。<br />

3. 変 更 後 、テキストファイルからデータを 入 力 する。<br />

という 手 順 をとります。<br />

7.2.1. テキスト 出 力 ・ 入 力 によるデータベース 移 行 の 手 順<br />

ここでは、 顧 客 マスタをテキスト 出 力 ・ 入 力 方 式 によりデータベース 移 行 してみましょう。<br />

1. テーブルリポジトリを 開 きます。<br />

2. APG を 起 動 します。(メニュー「オプショ<br />

ン(O)」から「APG(G)」を 選 ぶか、あるい<br />

は Ctrl+G キーにより 起 動 します)<br />

3. 「オプション」を「E= 出 力 」として、デー<br />

タを「.¥petshop_sql¥ 顧 客 .TXT」というフ<br />

ァイルにテキスト 出 力 します。<br />

4. 前 の 例 と 同 様 に、カラム<br />

名 が MS-<strong>SQL</strong> Server の<br />

命 名 規 約 に 違 反 していな<br />

いかをチェックします。<br />

顧 客 マスタの 場 合 にはい<br />

ずれのカラムも OK です。<br />

5. 「DB テーブル」 欄 を、<br />

Pervasive.<strong>SQL</strong> での 名 前<br />

「 %PETSHOP<strong>SQL</strong>% 顧<br />

客 .MST」から、MS-<strong>SQL</strong><br />

Server の 命 名 規 約 に 適 合 したテーブル 名 「 顧 客 マスタ」に 変 更 します。<br />

6. 「データベース」 欄 を「Defautl Database」から「MS<strong>SQL</strong>」に 変 更 します。ここまでは、 前 の 例 と 同<br />

じです。<br />

7. APG を 再 度 起 動 します。ここで、データ 再 編 成 機 能 が 働 き、「 変 更<br />

しますか?」の 確 認 ダイアログが 出 ますが、 今 回 はデータ 再 編 成 機<br />

能 を 使 わないので「いいえ(N)」で 答 えます。<br />

8. APG の 起 動 がキャンセルされてしまうので、 再 度 APG を 起 動 しま<br />

す。<br />

データ 移 行 53


9. 今 度 は「オプション」として「I=<br />

入 力 」とし、「テキストファイル」<br />

には、 先 ほどデータ 出 力 したファ<br />

イ ル 名 「 .¥petshop_sql¥ 顧<br />

客 .TXT」を 設 定 します。<br />

10. OK ボタンを 押 すと、データが 入<br />

力 されます。<br />

11. データの 確 認 のため、 再 度 APG を<br />

起 動 してくだしい。 今 度 は「オプシ<br />

ョン」として「B= 照 会 」とします。<br />

データが 正 しく 格 納 されていること<br />

を 確 認 してください。<br />

12. 念 のため、O<strong>SQL</strong> コマンドでもデータを 確 認 してください。( 下 に 示 した 実 行 結 果 で、 実 際 には「 条 件 」<br />

以 後 にもカラムが 続 きますが、 見 易 さのために 省 略 しています)。<br />

c¥> osql –E –w 1000<br />

1> use magic<br />

2> select * from 顧 客 マスタ<br />

3> go<br />

顧 客 番 号 顧 客 名 住 所 割 引 率 条 件<br />

---------- ---------------- ------------------------------ -------------- -----------------<br />

1008 千 葉 ペットショップ 千 葉 県 千 葉 市 高 柳 1234-1 9.0 30 日 後 支 払 い<br />

1234 ペットセンター 神 田 東 京 都 千 代 田 区 神 田 1-2-3 10.0 現 金<br />

3201 コジマペット 東 京 都 足 立 区 綾 瀬 3-11-5 5.0 現 金<br />

3220 ペットショッワンワン 東 京 都 江 戸 川 区 南 篠 崎 町 3-322 10.0 30 日 後 支 払 い<br />

3321 ヤザキ 金 魚 東 京 都 杉 並 区 高 井 戸 東 3-5-6 5.0 30 日 後 支 払 い<br />

3440 ペットサロンヤザワ 東 京 都 文 京 区 小 石 川 2-5-7 3.0 現 金<br />

( 省 略 )<br />

(24 件 処 理 されました)<br />

以 上 で、テキスト 出 力 ・ 入 力 によるデータ 移 行 ができました。<br />

54 データ 移 行


7.3. データ 移 行 用 のプログラムを 作 成 する<br />

前 節 に 説 明 したテキスト 出 力 ・ 入 力 による 方 法 は、ミスによるやり 直 し( 最 悪 の 場 合 データ 損 失 )がなくなる、<br />

という 利 点 がありますが、 手 順 がワンステップ 多 くなるので 大 量 のデータがある 場 合 には 時 間 がかる 上 に、<br />

テキストデータ 用 のディスクスペースが 必 要 になる、という 欠 点 があります。データ 量 の 少 ない 開 発 ・テス<br />

ト 環 境 では 良 いですが、 時 間 的 にもハードウェア 資 源 の 点 でも 制 約 がありがちな 実 際 の 運 用 環 境 で 行 うのは<br />

問 題 になることもあります。<br />

そのため、 大 量 のデータをなるべく 早 く 間 違 えなく 移 行 するためには、 移 行 用 のプログラムを 作 成 するのが<br />

便 利 です。 移 行 プログラムと 言 っても、 単 にデータをコピーするだけのバッチプログラムですから、<strong>Magic</strong><br />

を 使 えば 簡 単 に 作 成 できます。このようにしておけば、テーブル 数 が 多 い 場 合 にも、ひとつづつ 手 作 業 です<br />

る 必 要 がなくなります。<br />

また、データ 移 行 / 入 力 用 のバッチタスクを 作 っておくことは、テスト 時 にも 有 効 です。テスト 時 には、ある<br />

操 作 を 行 った 前 後 のデータ 値 が 正 しいかを 確 認 することが 必 要 になりますが、 常 にデータを 初 期 状 態 に 復 元<br />

できるようにプログラムをひとつ 作 っておくと 確 認 が 容 易 になります。<br />

サンプルアプリケーションでは、テスト 用 にデータ 入 力 バッチタスクが 作 成 されています。プログラム 34<br />

番 の「データ 入 力 ( 受 注 は 空 )」というもので、これを 実 行 すると、 制 御 テーブル、 顧 客 ・ 商 品 マスタはテキ<br />

ストファイルから 入 力 して 初 期 状 態 になり、 受 注 および 受 注 明 細 データは 空 になります。このプログラムは、<br />

受 注 入 力 の 動 作 確 認 のために 後 でよく 使 います。<br />

では、いずれの 方 法 でも 構 いませんので、ペットショップアプリケーションのテーブルリポジトリをすべて<br />

MS<strong>SQL</strong> 用 に 移 行 してください。<br />

データ 移 行 55


8. 移 行 直 後 の 動 作 確 認<br />

前 節 でテーブルの 移 行 は 終 了 しましたので、 次 にプログラムの 変 更 と 動 作 確 認 に 進 みましょう。<br />

ここでは、 最 初 にトランザクションの 変 更 を 行 います。Pervasive.<strong>SQL</strong> を 使 ったペットショップアプリケー<br />

ションではトランザクションを 使 っていなかったので、トランザクションの 設 定 に 気 を 使 う 必 要 はありませ<br />

んでしたが、MS-<strong>SQL</strong> Server などのリレーショナル DBMS を 使 う 場 合 には、 必 ずトランザクションの 設 定<br />

が 必 要 になります。この 違 いに 起 因 して、プログラムもいろいろ 変 更 する 必 要 が 出 てきます。 詳 しいことは<br />

「11 章 受 注 入 力 プログラムの 変 更 」(76 ページ)で 説 明 します。<br />

今 の 時 点 でまずしておかなければならないことは、「 遅 延 トランザクション」の 設 定 を「 物 理 トランザクショ<br />

ン」に 変 更 しておくことです。 遅 延 トランザクションというのは、<strong>Magic</strong> が 内 部 で 独 自 に 実 装 しているトラ<br />

ンザクション 機 能 で、 大 変 高 度 で 便 利 な 機 能 なのですが、 使 いこなすにはトランザクションについてよく 理<br />

解 していなければならないため、 本 書 では 使 いません。 物 理 トランザクションというのは、MS-<strong>SQL</strong> Server<br />

などの DBMS がサポートしているトランザクションのことで、 本 書 ではこちらのトランザクションのみを<br />

使 います。 設 定 の 変 更 については、「8.1 トランザクション 設 定 の 変 更 」(57 ページ)に 解 説 します。<br />

次 に、「8.3 マルチユーザ 環 境 での 問 題 点 」(59 ページ)で、マルチユーザ 環 境 で 移 行 直 後 のアプリケーション<br />

を 実 行 してみて、どのような 問 題 が 起 こるかを 見 ていきます。<br />

56 移 行 直 後 の 動 作 確 認


8.1. トランザクション 設 定 の 変 更<br />

オンラインプログラムでは、デフォルトの「トランザクションモード」が「D= 遅 延 」となっています。これ<br />

は 遅 延 トランザクションを 意 味 します。<br />

本 書 では 遅 延 トランザクションを 使 わないので、アプリケーションのオンラインプログラムのトランザクシ<br />

ョンモードの 設 定 をすべて「P= 物 理 」に 変 更 してください。<br />

トランザクションモードの 設 定 は、 次 のように 行 います。<br />

1. プログラムリポジトリを 開 き、 変 更 した<br />

いプログラムにカーソルを 置 きます。<br />

2. F5 キーでプログラムを 開 きます。<br />

3. タスク 特 性 ダイアログを 開 きます。タス<br />

ク 特 性 ダイアログは、 右 マウスクリック<br />

でポップアップメニューを 開 き「 特 性<br />

(P)」を 選 ぶか、あるいは Ctrl+P キーに<br />

より 開 きます。<br />

4. 「 拡 張 (E)」タブを 開 きます。<br />

5. 「トランザクションモード」が「D= 遅 延 」<br />

になっていたら、「P= 物 理 」に 変 更 して<br />

ください。<br />

アプリケーション 中 のすべてのオンラインタスクについて、トランザクションモードを 確 認 し、D= 遅 延 にな<br />

っていたら P= 物 理 に 変 更 してください。<br />

参 考 :<br />

• 受 注 入 力 プログラムのように、サブタスクのある 場 合 には、サブタスクのトランザクションモードは<br />

「W= 親 と 同 一 」にしてください。<br />

• バッチタスクでは、デフォルトでトランザクションモードが「P= 物 理 」になっているので、 変 更 す<br />

る 必 要 はありません。<br />

参 考 : <strong>V9Plus</strong> 9.40JSP3 より、MAGIC.INI ファイルの [MAGIC_SPECIALS] セクションに 以 下 の 設<br />

定 を 行 うことにより、トランザクションモードのデフォルト 設 定 が「P= 物 理 」になるようになりました。<br />

遅 延 トランザクションを 使 わない 場 合 には、いちいち「D= 遅 延 」から「P= 物 理 」に 変 更 する 必 要 がなく<br />

なります。 本 書 でもこの 設 定 を 行 った MAGIC.INI を 使 います。<br />

[MAGIC_SPECIALS]<br />

SpecialDefaultTransactionMode = P<br />

移 行 直 後 の 動 作 確 認 57


8.2. マルチユーザ 環 境 での 実 行<br />

マルチユーザ 環 境 での 動 作 テストを 行 うには、 複 数 の <strong>Magic</strong> セッションで 同 一 アプリケーションを 開 き、 同<br />

一 データベースをアクセスすることが 必 要 です。 実 際 の 運 用 環 境 では、 通 常 データベースサーバがあって、<br />

各 ユーザは 自 分 のパソコンに <strong>Magic</strong> クライアントをインストールし、データベースを 共 用 アクセスする、と<br />

いう 形 になります。しかし、 開 発 時 には 自 分 のパソコン 上 にデータベースがあり、<strong>Magic</strong> のクライアント 版<br />

を 二 つ 起 動 することにより、マルチユーザ 環 境 を 模 擬 的 に 作 成 してテストすることができます。<br />

8.2.1. <strong>Magic</strong> クライアント 版<br />

<strong>Magic</strong> クライアント 版 というのは、<strong>Magic</strong> アプリケーションを 実 行 する 機 能 のみ 持 っているプログラムであ<br />

り、アプリケーションを 開 発 ・ 修 正 する 開 発 機 能 は 持 っていません。 実 際 の 運 用 の 場 では、<strong>Magic</strong> クライア<br />

ント 版 を 使 うことになります。<strong>Magic</strong> クライアント 版 は、<strong>Magic</strong> をインストールしたディレクトリにある<br />

mgrntw.exe というプログラムです。<br />

一 方 、アプリケーションを 開 発 ・ 修 正 する 開 発 版 は、mggenw.exe という 名 前 のプログラムです。<strong>Magic</strong><br />

eDeveloper 製 品 や 体 験 版 をインストールすると、デスクトップに <strong>Magic</strong> のアイコンが 登 録 されますが、こ<br />

れにより 起 動 されるのは 開 発 版 です。 開 発 版 は、アプリケーションを 開 発 ・ 修 正 する 機 能 と、 実 行 する 機 能<br />

とを 両 方 備 えています。<br />

参 考 : <strong>Magic</strong> クライアント 版 mgrntw.exe はデスクトップやメニューに 登 録 がされないので、エクスプ<br />

ローラなどから 自 分 でショートカットを 作 成 してください。<br />

8.2.2. アプリケーションの 同 時 オープン<br />

マルチユーザ 環 境 のテストを 行 うには、 同 一 アプリケーションを 二 つ 以 上 の <strong>Magic</strong> セッションで 開 いて 実 行<br />

させることが 必 要 です。<br />

同 一 アプリケーションを 同 時 に 開 きたい 場 合 には、<strong>Magic</strong> クライアント 版 を 使 います。<strong>Magic</strong> クライアント<br />

版 はアプリケーションの 修 正 を 行 わないので、アプリケーションファイル(MCF ファイル)を 共 有 ロックをか<br />

けて、 読 込 専 用 で 開 きます。 共 有 ロックなので、 複 数 の <strong>Magic</strong> セッションが 同 時 にオープンすることが 可 能<br />

です。<br />

一 方 、 開 発 版 では、アプリケーションを 修 正 するためにアプリケーションファイルに 排 他 ロックをかけます。<br />

このため、 開 発 版 で 開 いているアプリケーションは、 他 の 開 発 版 、あるいはクライアント 版 で 開 くことがで<br />

きません。<br />

従 って、マルチユーザのテストを 行 う 場 合 には、 開 発 版 ではアプリケーションを 閉 じ、 実 行 版 で 開 きます。<br />

逆 に、プログラムの 修 正 を 行 いたい 場 合 には、 開 発 版 で 開 く 前 に、 実 行 版 でアプリケーションを 閉 じる 必 要<br />

があります。<br />

以 下 、 本 章 では、 実 行 版 を 二 つ 同 時 に 起 動 し、ペットショップアプリケーションを 実 行 していきます。<br />

58 移 行 直 後 の 動 作 確 認


8.3. マルチユーザ 環 境 での 問 題 点<br />

8.3.1. テーブルを 一 つだけ 使 うタスクの 場 合<br />

最 初 に、テーブルを 一 つだけ 使 う 単 純 なタスクについて、 動 作 確 認 しましょう。<br />

ここでの 例 としては、「 制 御 テーブル 更 新 」プログラムを 使 います。<br />

下 図 は、クライアント 版 を 二 つ 起 動 し、それぞれで 制 御 テーブル 更 新 プログラムを 開 いたところです。<br />

マルチユーザ 環 境 で 重 要 な 確 認 事 項 は、<br />

ロックが 適 切 にかかっているかという<br />

ことと、データの 損 失 が 起 こらない、<br />

ということです。<br />

1. 左 側 の <strong>Magic</strong> ( 二 人 のユーザにな<br />

ぞらえて、ユーザ A と 呼 びます)<br />

で、「 顧 客 へのメッセージ」を 適 当<br />

に 修 正 します。<br />

2. 右 の <strong>Magic</strong>(ユーザ B と 呼 びます)<br />

で、 同 じように「 顧 客 へのメッセ<br />

ージ」を 変 更 しようとすると、「レ<br />

コードロック 解 除 待 ち」が 出 ます。<br />

移 行 直 後 の 動 作 確 認 59


このことから、ロックは 正 しくかかっていることがわかりま<br />

す。<br />

3. ユーザ A の 方 を、ESC キーで 終 了 させます。すると、ロッ<br />

クが 解 除 されるので、ユーザ B が 再 開 されます。しかし、レ<br />

コードはユーザ A により 変 更 されているので、「このレコー<br />

ドは 他 のユーザが 更 新 しました – 再 読 込 を 行 います」とい<br />

うエラーがでて、レコードのデータが 最 新 のものに 変 更 され<br />

ます。<br />

以 上 の 動 作 は、マルチユーザ 環 境 での 排 他 制 御 の 動 作 として 適 切 です。 従 って、テーブル 一 つだけをアクセ<br />

スする 単 純 なプログラムでは、テーブルを Pervasive.<strong>SQL</strong> から MS-<strong>SQL</strong> Server に 移 行 しても 特 に 問 題 は<br />

見 られない、ということになります。<br />

他 のマスターメンテナンスプログラム( 顧 客 マスター 更 新 、 商 品 マスター 更 新 )でも 同 様 に、MS-<strong>SQL</strong> Server<br />

に 移 行 しても 特 に 問 題 はありません。<br />

60 移 行 直 後 の 動 作 確 認


8.3.2. テーブルを 複 数 使 うタスクの 場 合<br />

次 には、もう 少 し 複 雑 な 受 注 入 力 プログラムについて 確 認 してみましょう。<br />

1. 二 つの <strong>Magic</strong> クライアント 版 を 起 動 し、ペットショップ<br />

アプリケーションを 開 きます。 以 下 、それぞれを「ユー<br />

ザ A」、「ユーザ B」と 呼 びます。<br />

2. それぞれで、ポップアップメニューから、「 受 注 入 力 」→<br />

「 受 注 入 力 (マルチユーザ)」を 選 択 します。これは、<br />

Pervasive.<strong>SQL</strong> において、マルチユーザ 環 境 に 対 応 した<br />

受 注 入 力 プログラムで、Pervasive.<strong>SQL</strong> をデータベースに 使 っているときにはマルチユーザ 環 境 下 でも<br />

正 しく 動 作 していました。<br />

3. ユーザ A の 方 で、 顧 客 番 号<br />

#1008 を 選 択 します。カー<br />

ソルは 子 タスクの 最 初 の 行<br />

に 移 動 します。<br />

4. ユーザ B の 方 で、 顧 客 番 号<br />

#1234 を 選 択 します。する<br />

と、カーソルは 子 タスクに<br />

は 行 かず、しかもユーザ B<br />

の 方 の <strong>Magic</strong> は「 応 答 な<br />

し」になってしまいます。<br />

5. ユーザ A に 戻 り、 商 品 番 号<br />

#1002 (プードル)を 一 つ 注<br />

文 し、ESC を 2 回 押 して、<br />

受 注 入 力 プログラムを 終 了<br />

します。<br />

6. ユーザ A の 方 でタスクが 終<br />

了 した 瞬 間 、ユーザ B が 動<br />

き 出 します。<br />

このように、 受 注 入 力 プログラムでは、データベースを MS-<strong>SQL</strong> Server に 移 行 すると、 今 までは 正 しく 動<br />

いていたプログラムが 動 かなくなってしまいます。<br />

このようなことの 起 こる 原 因 は、MS-<strong>SQL</strong> Server のトランザクションのしわざによるものです。これを 理<br />

解 するために、まず 次 章 「トランザクション」でトランザクションを 基 本 から 簡 単 に 解 説 します。その 後 、<br />

第 10 章 「 受 注 入 力 で 何 が 起 こっているのか?」(73 ページ)で 上 のような 現 象 の 起 こる 理 由 を 解 析 し、 第 11<br />

章 「 受 注 入 力 プログラムの 変 更 」(76 ページ)で、トランザクションにも 対 応 させるために 受 注 入 力 プログラ<br />

ムをどう 修 正 するかを 説 明 します。<br />

移 行 直 後 の 動 作 確 認 61


9. トランザクション<br />

前 章 で 見 たような、マルチユーザ 環 境 での「 応 答 なし」に 対 応 するためにはプログラムを 少 し 変 更 する 必 要<br />

がありますが、それに 先 立 って、まずは MS-<strong>SQL</strong> Server で 何 が 起 こっているために「 応 答 なし」になるか<br />

を 正 確 に 理 解 しておく 必 要 があります。<br />

そのために、まずトランザクションの 基 本 について 本 章 で 簡 単 に 説 明 します。<br />

参 考 :<br />

• トランザクションとロックの 概 念 についてすでによく 理 解 している 読 者 は、 本 章 をスキップして「10 受<br />

注 入 力 で 何 が 起 こっているのか?」(73 ページ)に 進 んでください。<br />

• 本 章 では、 以 後 の 説 明 に 必 要 な 最 低 限 の 事 柄 しか 解 説 しません。トランザクションについてはデータベー<br />

スの 解 説 書 籍 などに 必 ず 載 っているので、 詳 しいことは 書 籍 などを 読 んでください。<br />

62 トランザクション


9.1. トランザクションとは?<br />

トランザクションというのは、データの 整 合 性 を 保 証 するための DBMS のメカニズムで、MS-<strong>SQL</strong> Server、<br />

Oracle、DB2/UDB などのリレーショナルデータベース 管 理 システムでは 例 外 なくサポートされています。<br />

9.1.1. トランザクションの 定 義<br />

トランザクションとは「 全 体 としてコミットされるかアボートされなければならない、 一 連 のデータ 修 正 処<br />

理 から 成 る 作 業 単 位 」と 定 義 されます。ここで、<br />

• 「 一 連 のデータ 修 正 処 理 」というのは、リレーショナルデータベースでは、SELECT 文 、UPDATE 文 、<br />

INSERT 文 、DELETE 文 などの DML です。この DML 文 による 修 正 内 容 は、すぐにはデータベース<br />

に 反 映 されません。<br />

• 「コミット」というのは、 修 正 内 容 ををすべてデータベースに 反 映 してトランザクションを 終 了 するこ<br />

とです。<br />

• 「ロールバック」というのは、 修 正 内 容 をすべて 破 棄 し、データベースは 一 切 変 更 せずにトランザクシ<br />

ョンを 終 了 することです。<br />

トランザクションは、 処 理 全 体 として 成 功 (コミット)するか 失 敗 (ロールバック)するかのどちらかとなります。<br />

中 途 半 端 はありません。<br />

9.1.2. トランザクションの 例<br />

トランザクションについてよく 出 てくる 例 は、 銀 行 の 振 込 みの 例 です。 例 えば、A さんが B さんに 5000 円<br />

振 り 込 みをすることを 考 えて 見 ます。データベースのレベルでは、 振 込 みの 作 業 は 次 のような 処 理 に 分 解 さ<br />

れます。<br />

1. A さんの 口 座 の 残 金 を 読 み 込 む。(SELECT 文 )<br />

2. A さんの 口 座 の 残 金 が 十 分 ならば、5000 円 を 引 く。(UPDATE 文 )<br />

3. B さんの 口 座 の 残 金 お 読 み 込 む。(SELECT 文 )<br />

4. B さんの 口 座 に 5000 円 を 加 える。(UPDATE 文 )<br />

トランザクションを 使 わない 場 合 、ちょうど 処 理 2 と 3 の 間 でマシントラブルが 起 こり、データベースが 停<br />

止 してしまったとします。この 状 態 では、A さんは 5000 円 引 かれているが、B さんには 5000 円 加 えられて<br />

いません。したがって、A さんは 振 込 みしたつもりだが B さんの 口 座 には 入 っていない、ということになり<br />

ます。これはデータ 整 合 性 が 壊 れてしまうことになります。<br />

このようなことを 防 ぐために、 上 の 1 から 4 までの 処 理 をトランザクションで 囲 みます。4 まですべて 成 功<br />

したらトランザクションはコミットし、 途 中 で 何 か 問 題 が 起 こったらロールバックします。コミットするま<br />

では、データベースには 一 切 の 変 更 が 加 えられません。データベースがなんらかの 理 由 で 途 中 で 停 止 してし<br />

まった 場 合 には、 処 理 途 中 のトランザクションはすべてロールバックされ 破 棄 されます。 従 って、 上 の 例 の<br />

ように、 処 理 2 と 3 の 間 で 障 害 が 起 こっても、 途 中 の 変 更 内 容 (A さんの 口 座 から 5000 円 を 出 したこと)はロ<br />

ールバックされ、 障 害 から 回 復 した 時 点 では 振 込 み 前 の 状 態 に 戻 され、データの 整 合 性 が 保 たれることにな<br />

ります。<br />

トランザクション 63


9.2. O<strong>SQL</strong> を 使 ってトランザクションを 試 してみる<br />

O<strong>SQL</strong> コマンドを 使 って、 実 際 にトランザクションを 試 して 見 ましょう。 例 としては、「 第 5 章 定 義 取 得 」<br />

(38 ページ)で 作 った、 簡 単 な 商 品 テーブルを 使 って 見 ます。<br />

最 初 に、データの 初 期 状 態 を 見 てみます。<br />

C:\>osql -E<br />

1> use magic<br />

2> select * from 商 品<br />

3> go<br />

商 品 番 号 商 品 名 単 価 有 効<br />

----------- --------------- ----- -------- ----<br />

5023 ウマカコーヒー 500 1<br />

5055 山 梨 観 光 地 割 引 切 符 23500 1<br />

6034 加 湿 器 SVKR-703 13200 1<br />

(3 件 処 理 されました)<br />

次 に、トランザクションを 使 ってデータを 変 更 してみます。トランザクションの 最 後 はコミットします。<br />

1> begin transaction<br />

2> update 商 品 set 単 価 = 600 where 商 品 番 号 = 5023<br />

3> update 商 品 set 単 価 = 24000 where 商 品 番 号 = 5055<br />

4> commit work<br />

5> go<br />

(1 件 処 理 されました)<br />

(1 件 処 理 されました)<br />

1> select * from 商 品<br />

2> go<br />

商 品 番 号 商 品 名 単 価 有 効<br />

----------- -------------------- -------- ----<br />

5023 ウマカコーヒー 600 1<br />

5055 山 梨 観 光 地 割 引 切 符 24000 1<br />

6034 加 湿 器 SVKR-703 13200 1<br />

(3 件 処 理 されました)<br />

上 に 示 したように、トランザクションは begin transaction で 始 まり、commit work でコミットします。<br />

コミットしたら、update 文 により 修 正 した 内 容 はデータベースに 反 映 されます。<br />

次 には、コミットせずにロールバックします。<br />

1> begin transaction<br />

2> update 商 品 set 単 価 = 700 where 商 品 番 号 = 5023<br />

3> update 商 品 set 単 価 = 25000 where 商 品 番 号 = 5055<br />

4> rollback work<br />

64 トランザクション


5> go<br />

(1 件 処 理 されました)<br />

(1 件 処 理 されました)<br />

1> select * from 商 品<br />

2> go<br />

商 品 番 号 商 品 名 単 価 有 効<br />

----------- -------------------- -------- ----<br />

5023 ウマカコーヒー 600 1<br />

5055 山 梨 観 光 地 割 引 切 符 24000 1<br />

6034 加 湿 器 SVKR-703 13200 1<br />

(3 件 処 理 されました)<br />

この 場 合 には、 二 つの update 文 で 行 ったデータ 修 正 の 内 容 は 両 方 とも 破 棄 され、データベースはトランザ<br />

クションの 前 の 状 態 に 戻 っています。<br />

このように begin transaction ・・・ commit/rollback work を 使 うことにより、 複 数 の DML 文 の 処 理 内 容 を<br />

いっぺんに 反 映 あるいは 破 棄 させることができることがわかります。<br />

トランザクション 65


9.3. 分 離 レベル<br />

次 に 知 っておく 必 要 があるのが、マルチユーザ 環 境 でのトランザクションの 振 る 舞 いについてです。<br />

今 、ユーザ A と B とが 同 一 のデータベースを 共 有 しているとします。ユーザ A がトランザクション 実 行 中<br />

に UPDATE 文 でレコードを 更 新 し、まだコミットあるいはロールバックしていない 状 態 の 時 に、ユーザ B<br />

が 同 じレコードを SELECT 文 で 読 み 込 もうとしたらどうなるでしょうか?<br />

これはトランザクションの 分 離 レベルの 設 定 により 結 果 が 異 なってきます。 分 離 レベルというのは、 異 なる<br />

ユーザによるトランザクションが、どれだけ 分 離 されているか、という 度 合 いを 表 すものです。<br />

分 離 レベルは、DBMS により 実 装 レベルが 異 なりますが、MS-<strong>SQL</strong> Server では、 分 離 度 の 低 い 順 に、 次 の<br />

四 つが 定 義 されています。<br />

• 非 コミット 読 込 (Read Uncommited)<br />

• コミット 済 み 読 み 取 り(Cursor Stability、あるいは Read Commited)<br />

• 反 復 可 能 読 み 取 り (Repeatable Read)<br />

• 直 列 化 (Serializable)<br />

分 離 レベルが 非 コミット 読 込 に 設 定 されている 場 合 には、ユーザ A が 変 更 した 修 正 内 容 が、たとえコミット<br />

前 であっても、ユーザ B から 見 ることができます。しかし、コミット 前 の 修 正 内 容 は、ロールバックにより<br />

取 り 消 されてしまう 可 能 性 のある 不 確 定 なものなので、ダーティ・リードと 呼 ばれます。トランザクション<br />

がロールバックされる 可 能 性 を 考 えると、 非 コミット 読 込 のレベルはデータの 一 貫 性 で 問 題 があります。<br />

分 離 レベルがコミット 済 み 読 み 取 りに 設 定 されている 場 合 には、ユーザ A が 変 更 した 修 正 内 容 は、コミット<br />

されるまで、ユーザ B から 見 ることができません。 具 体 的 には、ユーザ A の 修 正 したレコードにはロックが<br />

かけられるので、ユーザ B がこのレコードを 対 象 とする SELECT 文 を 発 行 するとロック 待 ちとなります。<br />

ロックは、ユーザ A がトランザクションを 終 了 するまで 続 きます。トランザクションがコミットあるいはロ<br />

ールバックされた 時 点 で、ロックは 解 除 され、 変 更 された 値 (コミットの 場 合 )、あるいは 変 更 前 の 値 (ロール<br />

バック)が 読 み 込 まれます。カーソル 固 定 の 分 離 レベルでは、 非 コミット 読 込 の 場 合 と 比 べ、ロック 待 ちが 発<br />

生 するため 同 時 並 行 性 は 減 りますが、 未 確 定 のデータを 読 み 込 む 危 険 性 がなく、データの 一 貫 性 では 望 まし<br />

い 設 定 といえます。<br />

反 復 可 能 読 み 取 りと 直 列 化 については、ここでは 説 明 を 省 略 します。これらの 分 離 レベルは、より 高 度 なデ<br />

ータ 一 貫 性 を 保 証 しますが、ロックの 衝 突 が 起 こりやすく 並 列 度 が 減 少 します。<br />

66 トランザクション


9.4. O<strong>SQL</strong> を 使 って 分 離 レベルを 試 してみる<br />

O<strong>SQL</strong> を 使 って、 試 してみましょう。ここでも「 商 品 」テーブルを 例 に 使 います。<br />

複 数 ユーザでのアクセスを 想 定 しているので、コマンドプロンプトを 二 つ 開 き、それぞれで O<strong>SQL</strong> を 起 動 し<br />

ます。それぞれを 二 人 のユーザと 見 立 てて、ユーザ A、ユーザ B と 呼 びます。<br />

最 初 に 商 品 テーブルの 内 容 を 見 ておきます。<br />

c:\> osql –E<br />

1> use magic<br />

2> select * from 商 品<br />

3> go<br />

商 品 番 号 商 品 名 単 価 有 効<br />

----------- -------------------- ----------- ----<br />

5023 ウマカコーヒー 600 1<br />

5055 山 梨 観 光 地 割 引 切 符 24000 1<br />

6034 加 湿 器 SVKR-703 13200 1<br />

(3 件 処 理 されました)<br />

9.4.1. 非 コミット 読 込 の 場 合<br />

ユーザ A、B の 双 方 で、 分 離 レベルを 非 コミット 読 込 (read uncommitted)に 設 定 します。 以 下 のコマンドを、<br />

それぞれの O<strong>SQL</strong> で 実 行 してください。<br />

(ユーザ A、ユーザ B の 双 方 で 実 行 )<br />

1> set transaction isolation level read uncommitted<br />

2> go<br />

ユーザ A でトランザクションを 開 始 、 商 品 単 価 を 変 更 します。<br />

(ユーザ A での 操 作 )<br />

1> begin transaction<br />

2> update 商 品 set 単 価 = 700 where 商 品 番 号 = 5023<br />

3> update 商 品 set 単 価 = 25000 where 商 品 番 号 = 5055<br />

4> go<br />

(1 件 処 理 されました)<br />

(1 件 処 理 されました)<br />

1> select * from 商 品<br />

2> go<br />

商 品 番 号 商 品 名 単 価 有 効<br />

----------- -------------------- ----------- ----<br />

5023 ウマカコーヒー 700 1<br />

5055 山 梨 観 光 地 割 引 切 符 25000 1<br />

6034 加 湿 器 SVKR-703 13200 1<br />

トランザクション 67


(3 件 処 理 されました)<br />

この 時 点 ではまだコミットしていませんので、データベースにこの 修 正 は 反 映 されていません。<br />

ここでユーザ B が 商 品 の 内 容 を SELECT 文 で 見 てみます。<br />

(ユーザ B での 操 作 )<br />

1> select * from 商 品<br />

2> go<br />

商 品 番 号 商 品 名 単 価 有 効<br />

----------- -------------------- ----------- ----<br />

5023 ウマカコーヒー 700 1<br />

5055 山 梨 観 光 地 割 引 切 符 25000 1<br />

6034 加 湿 器 SVKR-703 13200 1<br />

(3 件 処 理 されました)<br />

ユーザ A がトランザクションをコミットしていないにも 関 わらず、 変 更 内 容 が 見 えてしまっています。これ<br />

が「 非 コミット 読 込 」 分 離 レベルの 効 果 です。<br />

では、ユーザ A がトランザクションをロールバックします。<br />

(ユーザ A での 操 作 )<br />

1> rollback work<br />

2> go<br />

これで、データ 変 更 は 取 り 消 されます。ここで 再 度 ユーザ B から 商 品 テーブルを 見 てみると、どうなるでし<br />

ょうか?<br />

(ユーザ B での 操 作 )<br />

1> select * from 商 品<br />

2> go<br />

商 品 番 号 商 品 名 単 価 有 効<br />

----------- -------------------- ----------- ----<br />

5023 ウマカコーヒー 600 1<br />

5055 山 梨 観 光 地 割 引 切 符 24000 1<br />

6034 加 湿 器 SVKR-703 13200 1<br />

(3 件 処 理 されました)<br />

当 然 ながら、データ 変 更 は 取 り 消 されて、トランザクション 前 の 値 となります。<br />

9.4.2. コミット 済 み 読 み 取 りの 場 合<br />

コミット 済 み 読 み 取 りの 場 合 、 他 のユーザがコミットしていない 修 正 内 容 は、 他 のユーザから 見 ることがで<br />

きません。<br />

68 トランザクション


まず、ユーザ A とユーザ B の 双 方 で、 分 離 レベルをコミット 済 み 読 み 取 り(read committed)に 設 定 します。<br />

(ユーザ A、ユーザ B の 双 方 で 実 行 )<br />

1> set transaction isolation level read committed<br />

2> go<br />

ユーザ A がトランザクションを 開 始 し、 商 品 の 単 価 を 更 新 します。まだコミットはしません。<br />

(ユーザ A での 操 作 )<br />

1> begin transaction<br />

2> update 商 品 set 単 価 = 700 where 商 品 番 号 = 5023<br />

3> update 商 品 set 単 価 = 25000 where 商 品 番 号 = 5055<br />

4> select * from 商 品<br />

5> go<br />

(1 件 処 理 されました)<br />

(1 件 処 理 されました)<br />

商 品 番 号 商 品 名 単 価 有 効<br />

----------- -------------------- ----------- ----<br />

5023 ウマカコーヒー 700 1<br />

5055 山 梨 観 光 地 割 引 切 符 25000 1<br />

6034 加 湿 器 SVKR-703 13200 1<br />

(3 件 処 理 されました)<br />

ここで、ユーザ B で 商 品 テーブルを 見 てみます。<br />

(ユーザ B での 操 作 )<br />

1> select * from 商 品<br />

2> go<br />

(・・・ 反 応 なし・・・)<br />

SELECT 文 を 実 行 すると、 結 果 は 表 示 されず、 待 ち 状 態 になっています。これが 分 離 レベルがコミット 済 み<br />

読 み 取 りの 場 合 の 効 果 です。すなわち、 商 品 テーブルのレコード(#5023 と#5055)が 更 新 され、ロックがかか<br />

っているため、 他 のユーザが 見 れないようになっています。<br />

ここで、ユーザ A がトランザクションをロールバックします。<br />

(ユーザ A での 操 作 )<br />

1> rollback work<br />

2> go<br />

するとユーザ B の 方 のロック 待 ちが 解 除 され、SELECT 文 の 結 果 が 表 示 されます。<br />

(ユーザ B での 操 作 )<br />

1> select * from 商 品<br />

2> go<br />

トランザクション 69


商 品 番 号 商 品 名 単 価 有 効<br />

----------- -------------------- ----------- ----<br />

5023 ウマカコーヒー 600 1<br />

5055 山 梨 観 光 地 割 引 切 符 24000 1<br />

6034 加 湿 器 SVKR-703 13200 1<br />

(3 件 処 理 されました)<br />

この 場 合 、ユーザ A はロールバックしたので、 商 品 テーブルの 内 容 はトランザクション 前 の 値 と 同 じです。<br />

ユーザ A がロールバックではなく、コミットした 場 合 には、 当 然 のことながら、ユーザ B の 方 では UPDATE<br />

による 修 正 が 反 映 された 結 果 が 表 示 されます。<br />

このように、コミット 済 み 読 み 取 りの 場 合 には、 不 確 定 なデータが 読 み 込 まれる 可 能 性 がないけれども、ロ<br />

ック 待 ちが 起 こるので、アプリケーションの 設 計 にあたっては、ユーザがロック 待 ちで 長 い 間 待 たされるこ<br />

とがないよう、ロックの 衝 突 に 注 意 して 設 計 する 必 要 があります。<br />

70 トランザクション


9.5. ロックとトランザクション<br />

最 後 にトランザクションに 関 連 して 理 解 しておかなければならないことは、ロックとトランザクションの 関<br />

連 です。<br />

9.5.1. MS-<strong>SQL</strong> Server でのロック<br />

MS-<strong>SQL</strong> Server ではいろいろなレベルのロック 機 能 を 備 えていますが、<strong>Magic</strong> でよく 利 用 されるのは、 次<br />

のレコードロックです。<br />

• UPDATE によるロック<br />

• UPDLOCK 付 き SELECT 文 によるロック<br />

UPDATE によるロックについては、 前 節 の 分 離 レベルのところで 説 明 しました。UPDLOCK 付 き SELECT<br />

文 によるロックは、 更 新 することを 前 提 としてレコードを 読 み 込 む 場 合 、SELECT 文 に(UPDLOCK)という<br />

ヒントを 付 けて 実 行 することにより、そのレコードにロックを 掛 けるものです。これにより、 他 のユーザが<br />

同 一 レコードをロックしたり 更 新 したりすることができなくなります。<br />

<strong>Magic</strong> のロックメカニズムでは、オンラインタスクでユーザがキー 入 力 をしたときに、そのレコードがロッ<br />

クされます。 例 えば、 制 御 テーブルの 場 合 には 次 のような SELECT 文 が 発 行 されます。<br />

SELECT 制 御 キー, 消 費 税 率 , 最 終 受 注 番 号 , 顧 客 へのメッセージ<br />

FROM MAGIC.. 制 御 (UPDLOCK NOWAIT)<br />

WHERE 制 御 キー = 1<br />

9.5.2. ロックとトランザクションの 関 係<br />

では、このロックとトランザクションとは、どのような 関 係 にあるのでしょうか?<br />

結 論 から 言 うと、トランザクションを 使 わずとも 済 む Pervasive と 対 照 して、 次 のようになります。<br />

トランザクション<br />

の 利 用<br />

ロックを 掛 ける<br />

タイミング<br />

Pervasive MS-<strong>SQL</strong> Server ( 他 RDBMS も 同 じ)<br />

任 意 ( 使 わない 場 合 が 多 い)<br />

必 須<br />

ファイルがオープンされていれば、 任 意 トランザクション 中 であることが 必 要 。トラ<br />

の 時 点 でかけられる。<br />

ンザクション 中 ならば 任 意 の 時 点 でかけられ<br />

る。<br />

トランザクション 71


ロックを 解 除 する<br />

タイミング<br />

任 意 の 時 点 でアンロックできる。<br />

トランザクションの 終 了 時 (ロールバックあ<br />

るいはコミット)にのみ、すべてのロックが 一<br />

括 して 解 除 される。 任 意 の 時 点 で 解 除 するこ<br />

とはできない。<br />

注 意 : ここで Pervasive と 書 いているのは、<strong>Magic</strong> が 利 用 するトランザクショナルアクセスを 使 った<br />

場 合 のことです。Pervasive にはこの 他 にリレーショナルアクセスという <strong>SQL</strong> ベースのアクセス 方 式 が<br />

あり、このインターフェースを 使 った 場 合 には MS-<strong>SQL</strong> Server と 同 じになります。<strong>Magic</strong> からリレー<br />

ショナルアクセスのインターフェースを 使 って Pervasive のテーブルをアクセスするには、ODBC ゲ<br />

ートウェイ( 現 在 ベータ 版 )を 使 いますが、 本 書 では 説 明 を 省 略 します。<br />

上 記 の 性 質 は、MS-<strong>SQL</strong> Server に 限 らず、トランザクションをサポートするすべての DBMS で 共 通 なもの<br />

で、トランザクションの 本 質 的 な 機 能 に 由 来 する 性 質 です。<br />

ここからわかることは、「トランザクション 中 のロックは 累 積 される」ということです。すなわち、Pervasive<br />

を 使 っていた 場 合 には、 必 要 な 時 点 でロックをかけ、 必 要 がなくなったらロックを 解 除 することができるの<br />

で、ロックの 期 間 は 必 要 最 低 限 にすることができます。ところが、MS-<strong>SQL</strong> Server のようなリレーショナ<br />

ル DBMS の 場 合 には、ロックに 先 立 ってトランザクションを 開 始 しなければならず、しかもロックの 解 除<br />

は 任 意 の 時 点 で 行 うことができなくて、トランザクションの 終 了 時 に 一 括 して 行 われます。このため、トラ<br />

ンザクションの 開 始 から 終 了 までの 期 間 をよく 検 討 して 設 計 しなければ、 非 常 に 長 い 間 レコードロックがか<br />

かったままになってしまう 可 能 性 があります。<br />

「8.3.2 テーブルを 複 数 使 うタスクの 場 合 」(61 ページ)で 見 たように、Pervasive から MS-<strong>SQL</strong> Server に 行<br />

こうしたての 状 態 で、 受 注 入 力 プログラムでロック 待 ちが 発 生 してユーザ B が 操 作 できなくなってしまいま<br />

したが、これもトランザクションによってロックが 長 引 いてしまったためです。<br />

それでは、 受 注 入 力 プログラムで 内 部 ではどのようなことが 起 こっていたのかを、 次 章 でトランザクション<br />

とロックの 観 点 から 分 析 してみましょう。<br />

72 トランザクション


10. 受 注 入 力 で 何 が 起 こっているのか?<br />

「8.3.2 テーブルを 複 数 使 うタスクの 場 合 」(61 ページ)で 見 たように、Pervasive から MS-<strong>SQL</strong> Server に 行<br />

こうしたての 状 態 で、 受 注 入 力 プログラムでロック 待 ちが 発 生 してユーザ B が 操 作 できなくなってしまいま<br />

した。これが 何 故 起 こったのかを、 前 章 で 習 ったトランザクションの 知 識 をもとにして 解 析 していきましょ<br />

う。<br />

受 注 入 力 を 行 った 場 合 には、 受 注 レコード、 受 注 明 細 レコードのほかに、 次 のレコードがロックの 対 象 とな<br />

ります。<br />

テーブル 名 ロック 対 象 レコード ロックの 理 由<br />

制 御 テーブル 「キー」= 1 のレコード 新 しい 受 注 番 号 を 発 番 するたびに「 最 終 受 注 番 号 」を 更 新 す<br />

るためにロックします。<br />

商 品 マスタ 各 明 細 行 で 選 択 されてい 商 品 マスタの「 受 注 数 」を 更 新 するためにロックします。<br />

る 商 品 のレコード<br />

顧 客 マスタ 発 注 者 として 選 択 されて<br />

いる 顧 客 のレコード<br />

受 注 入 力 を 確 定 してデータベースに 格 納 するときに、 顧 客 マ<br />

スタの「 累 積 受 注 額 」と「 受 注 回 数 」を 更 新 するためにロッ<br />

クします。<br />

まず 最 初 に、Pervasive を DBMS として 使 ったとき、トランザクションを 使 わないで 処 理 していましたが、<br />

このときのこれらのレコードのロックの 状 況 を「10.1 Pervasive の 場 合 」で 見 ていきます。 次 に、MS-<strong>SQL</strong><br />

Server に 移 行 した 場 合 に 同 じ 操 作 をするとロックがどうなるのかを「10.2 MS-<strong>SQL</strong> Server の 場 合 」で 見 て<br />

いきます。<br />

受 注 入 力 で 何 が 起 こっているのか? 73


10.1. Pervasive の 場 合<br />

Pervasive.<strong>SQL</strong> を DBMS として 利 用 した 場 合 、トランザクションの 利 用 は 任 意 であり、ペットショップア<br />

プリケーションではトランザクションを 全 く 利 用 しませんでした。<br />

トランザクションを 利 用 しなかった 場 合 には、ロックもロック 解 除 も、 任 意 のタイミングで 掛 けることがで<br />

きました。このため、ロックをかける 期 間 はは 必 要 最 小 限 に 留 めることができます。<br />

それぞれのレコードのロック 期 間 を 図 で 示 したのが 図 3-1 です。<br />

図 に 示 したように、Pervasive の 場 合 には、 任 意 のタイミングでロックを 解 除 できるので、 更 新 処 理 が 終 わ<br />

ると 直 ちにロックは 解 除 されます。これらのロックは、すべて 極 めて 短 時 間 に 終 了 するバッチタスクで 実 行<br />

するものなので、ロックの 期 間 は 必 要 最 小 限 に 短 いものとなり、マルチユーザ 環 境 であってもロックの 衝 突<br />

の 可 能 性 は 非 常 に 低 くなります。<br />

図 10-1 Pervasive.<strong>SQL</strong> の 場 合 のレコードロックの 期 間<br />

ユーザの 作 業<br />

<strong>Magic</strong>の 処 理<br />

制 御<br />

#1<br />

商 品<br />

#1002<br />

商 品<br />

#1003<br />

顧 客<br />

#1008<br />

顧 客 選 択<br />

商 品 1 選 択<br />

受 注 番 号 発 番 タスク<br />

レコード 後 処 理 → 更 新<br />

商 品 2 選 択<br />

明 細 行 1 商 品 マスタ 更 新<br />

レコード 後 処 理 → 更 新<br />

確 定<br />

明 細 行 2 商 品 マスタ 更 新<br />

レコード 後 処 理 → 更 新<br />

顧 客 マスタ 更 新<br />

レコード 後 処 理 → 更 新<br />

レコードロックのかかる 期 間<br />

74 受 注 入 力 で 何 が 起 こっているのか?


10.2. MS-<strong>SQL</strong> Server の 場 合<br />

MS-<strong>SQL</strong> Server を DBMS として 使 う 場 合 には、 事 情 が 異 なってきます。MS-<strong>SQL</strong> Server では、トランザ<br />

クションの 使 用 が 必 須 であり、また、トランザクションの 一 般 的 な 性 質 として、ロックされたレコードはト<br />

ランザクションが 終 了 するまでロック 解 除 できない、という 条 件 があります。<br />

このため、 同 じように 受 注 入 力 操 作 を 行 った 場 合 には、レコードのロックの 状 況 は 図 10-2 のようになりま<br />

す。<br />

このように MS-<strong>SQL</strong> Server の 場 合 にはロックが 累 積 され、その 間 にオンラインのユーザ 入 力 待 ちが 入 りま<br />

すので、レコードは 非 常 に 長 い 間 ロックされたままになる 可 能 性 があります。<br />

もし、2 人 のユーザ(ユーザ A とユーザ B)が 同 時 に 受 注 入 力 を 行 うとどうなるでしょうか? 最 初 にユーザ A<br />

が 入 力 し、 受 注 番 号 発 番 タスクを 実 行 すると、そこで 制 御 テーブルのレコードがロックされてしまいます。<br />

このレコードはシステム 中 に 一 つだけしかないものなので、これがロックされると、 他 のユーザが 一 切 先 に<br />

進 めなくなってしまいます。このためユーザ B はユーザ A のロック 解 除 待 ち、すなわち、 一 連 の 入 力 が 終 わ<br />

ってトランザクションがコミットされるまで 待 たされることとなります。これが、「8.3.2 テーブルを 複 数 使<br />

うタスクの 場 合 」(61 ページ)で 起 こった 現 象 の 正 体 です。<br />

図 10-2 MS-<strong>SQL</strong> Server の 場 合 のロックの 期 間<br />

ユーザの 作 業<br />

<strong>Magic</strong>の 処 理<br />

制 御<br />

#1<br />

商 品<br />

#1002<br />

商 品<br />

#1003<br />

顧 客<br />

#1008<br />

顧 客 選 択<br />

トランザクション 開 始<br />

商 品 1 選 択<br />

受 注 番 号 発 番 タスク<br />

レコード 後 処 理 → 更 新<br />

商 品 2 選 択<br />

明 細 行 1 商 品 マスタ 更 新<br />

レコード 後 処 理 → 更 新<br />

確 定<br />

明 細 行 2 商 品 マスタ 更 新<br />

レコード 後 処 理 → 更 新<br />

顧 客 マスタ 更 新<br />

レコード 後 処 理 → 更 新<br />

トランザクションコミット<br />

レコードロックのかかる 期 間<br />

受 注 入 力 で 何 が 起 こっているのか? 75


11. 受 注 入 力 プログラムの 変 更<br />

前 章 で 見 たように、トランザクションを 使 うようになるとレコードロックが 長 い 間 かけられたままになるこ<br />

とがあり、マルチユーザ 環 境 での 並 列 性 を 下 げる 原 因 となります。<br />

この 問 題 に 対 応 するためには、 一 時 テーブルを 使 って、 入 力 や 変 更 はすべて 一 時 テーブルに 溜 めて 置 き、 最<br />

後 に 確 定 した 時 点 でいっぺんにバッチタスクで 一 時 テーブルの 内 容 をデータベースに 反 映 する、という 手 法<br />

がよく 用 いられています。<br />

本 章 ではこの 手 法 を 使 って 受 注 入 力 プログラムを 書 き 直 していきます。<br />

76 受 注 入 力 プログラムの 変 更


11.1. 考 え 方<br />

一 時 テーブルを 使 ってロック 待 ちを 回 避 する 方 法 の 基 本 的 な 考 え 方 は、 以 下 の 通 りです( 図 11-1 参 照 )。<br />

• 受 注 明 細 ファイルにリンクされている 商 品 ファイルのロックを 避 けるため、 明 細 レコードは 一 時 テーブ<br />

ル(メモリテーブルや、ローカルの Pervasive ファイル)に 蓄 えておきます。 具 体 的 には、<br />

‣ 受 注 レコード( 親 タスク)のレコード 前 処 理 で、 登 録 モードの 場 合 には 一 時 テーブルを 空 にします。<br />

修 正 モードの 時 には 現 在 の 受 注 番 号 の 明 細 レコードを 一 時 テーブルにコピーします。この 処 理 は、<br />

一 時 テーブルの 準 備 用 のバッチタスクで 行 います。<br />

‣ ユーザの 明 細 行 に 関 する 入 力 ( 登 録 モード)/ 修 正 ( 修 正 モード)は、 一 時 テーブルに 記 録 しておきます。<br />

‣ 一 枚 の 注 文 票 に 対 するユーザの 入 力 が 終 了 したら、 親 タスクのレコード 後 処 理 で、 一 時 テーブルの<br />

追 加 ・ 変 更 内 容 を DBMS の 明 細 レコードに 反 映 させます。このときに 同 時 に、 商 品 ファイルの 受<br />

注 数 も 更 新 します。(これは、 一 時 テーブルの 修 正 反 映 用 のバッチタスクで 行 います)。<br />

• 受 注 レコードにリンクされている 顧 客 レコードのロックおよび 連 番 発 行 のための 制 御 ファイルのレコー<br />

ドのロックを 避 けるための 手 法 は、Pervasive の 時 にやったのと 同 じです。すなわち、<br />

‣ 顧 客 レコードについては、 受 注 登 録 プログラムでは「アクセス」=「R= 読 込 」でオープンし、デー<br />

タ 更 新 は 更 新 用 のバッチタスクを 呼 び 出 して 行 います。<br />

‣ 制 御 ファイルのレコードについては、 連 番 作 成 のバッチタスクを 呼 び 出 して 行 います。 ただし、 制<br />

御 ファイルのレコードロックがトランザクションコミットまで 残 るので、 連 番 作 成 のタイミングを<br />

変 え、ユーザの 入 力 がすべて 済 んで 一 時 ファイルに 蓄 積 したデータをデータベースに 反 映 する 直 前<br />

に 連 番 作 成 を 行 います。<br />

図 11-1 受 注 入 力 タスクの 変 更<br />

受 注 入 力<br />

( 親 タスク)<br />

受 注 入 力<br />

( 親 タスク)<br />

受 注<br />

データ<br />

受 注<br />

データ<br />

受 注 明 細<br />

( 子 タスク)<br />

受 注 明 細<br />

( 子 タスク)<br />

受 注 明 細<br />

データ<br />

受 注 明 細<br />

一 時 ファイル<br />

受 注 明 細<br />

データ<br />

変 更 前<br />

受 注 データ、 受 注 明 細 データを 直 接<br />

操 作 していた。<br />

変 更 後 : 明 細 レコードは・・・<br />

レコード 前 処 理 で 一 時 ファイルにコピーし、<br />

レコード 後 処 理 で 一 時 ファイルの 内 容 をデータ<br />

ベースに 反 映 する。<br />

受 注 入 力 プログラムの 変 更 77


この 方 式 を 使 うと、ロック 待 ちの 問 題 がどう 解 決 されるかを 示 したのが、 図 11-2 です。<br />

図 11-2 一 時 テーブルを 使 う 方 法 でのロックの 状 況<br />

ユーザの 操 作<br />

顧 客 選 択<br />

<strong>Magic</strong>の 処 理<br />

制 御<br />

#1<br />

商 品<br />

#1002<br />

商 品<br />

#1003<br />

顧 客<br />

#1008<br />

顧 客 選 択<br />

商 品 1 選 択<br />

商 品 2 選 択<br />

明 細 行 作 成 1 ( 一 時 ファイル)<br />

読 込 専 用<br />

なので、<br />

ロックはか<br />

からない。<br />

明 細 行 作 成 2 ( 一 時 ファイル)<br />

確 定<br />

一 時 ファイル→DBMS 反 映<br />

バッチタスク<br />

( 短 時 間 )<br />

トランザ<br />

クション<br />

開 始<br />

受 注 番 号 発 番 タスク<br />

レコード 後 処 理 → 更 新<br />

明 細 行 1 商 品 マスタ 更 新<br />

レコード 後 処 理 → 更 新<br />

明 細 行 2 商 品 マスタ 更 新<br />

レコード 後 処 理 → 更 新<br />

顧 客 マスタ 更 新<br />

レコード 後 処 理 → 更 新<br />

トランザ<br />

クション<br />

コミット<br />

レコードロックのかかる 期 間<br />

1. ユーザの 入 力 により、<br />

• 顧 客 選 択 ( 顧 客 レコードが 読 み 込 まれる)<br />

• 明 細 行 作 成 ( 商 品 レコードが 読 み 込 まれ、 明 細 行 データは 一 時 テーブルに 書 き 込 まれる)<br />

が 起 こりますが、 顧 客 マスタ、 商 品 マスタは 読 込 専 用 なのでロックは 起 こらず、 明 細 行 データは、 一 時<br />

テーブルへの 書 き 込 みなのでやはりロックはかかりません。<br />

2. 入 力 が 終 了 したら、 一 時 テーブルの 内 容 を MS-<strong>SQL</strong> Server へ 反 映 するためのバッチタスクが 走 ります<br />

( 上 図 の「 一 時 テーブル→DBMS 反 映 バッチタスク」と 書 かれている 部 分 )。この 中 で、<br />

78 受 注 入 力 プログラムの 変 更


• 受 注 番 号 の 発 番 のため、 制 御 レコードがロック・ 更 新 されます。<br />

• 各 明 細 行 の 受 注 数 を 反 映 するため、 商 品 レコードがロック・ 更 新 されます。<br />

• 累 積 受 注 額 、 受 注 回 数 を 更 新 するため、 顧 客 レコードがロック・ 更 新 されます。<br />

ここでも、レコードロックが 発 生 し、トランザクションの 間 中 累 積 され、コミットによって 始 めてロック 解<br />

除 される、という 点 では 前 と 同 じです。しかし、この 方 法 が 前 の 方 法 と 異 なるところは、ロックからロック<br />

解 除 までの 処 理 がすべてバッチタスクの 中 で、 極 めて 短 時 間 のうちに 行 われることで、ユーザの 入 力 待 ちの<br />

間 にはどのレコードにもロックがかかっていない、ということです。<br />

このため、ロックの 期 間 は 非 常 に 短 くなりロック 衝 突 の 可 能 性 が 低 くなるし、 万 一 タイミングが 悪 くてロッ<br />

クが 衝 突 してしまった 場 合 でも、 次 のリトライのタイミングで 書 き 込 みが 可 能 になります。<br />

受 注 入 力 プログラムの 変 更 79


11.2. 一 時 テーブルの 定 義<br />

では、 実 際 に 上 の 考 え 方 にしたがって 受 注 入 力 プログラムを 改 造 していきましょう。<br />

最 初 にすることは、 明 細 レコードを 一 時 的 に 格 納 する 一 時 テーブルをテーブルリポジトリに 定 義 することで<br />

す。これはメモリーテーブルとして 定 義 します。<br />

メモリテーブルというのは、<strong>Magic</strong> 独 自 のデータベースで、 次 のような 性 質 を 持 っています。<br />

• レコードはすべてメインメモリ 上 に 格 納 し、ディスク 上 に 保 存 しません。<br />

• アクセスが 非 常 に 高 速 です。<br />

• ディスクに 保 存 されないため <strong>Magic</strong> が 終 了 すると 同 時 にメモリテーブルの 内 容 も 消 えてしまいます。<br />

• 大 量 のデータを 保 存 するとメモリを 圧 迫 する 原 因 ともなります。<br />

• 本 質 的 に 複 数 ユーザ 間 で 共 有 することがありません。そのためロックなどを 掛 ける 必 要 がありません。<br />

メモリテーブルはこのような 性 質 を 持 っているので、 基 本 的 に 少 量 の 個 人 用 の 一 時 データを 格 納 するために<br />

用 います。 受 注 入 力 プログラムで 使 う 一 時 テーブルなどとしては 最 適 です。<br />

カラムの 定 義 は、 受 注 明 細 ファイルと 同 じですので、<strong>Magic</strong> の 複 写 登 録 機 能 を 利 用 して 受 注 明 細 ファイルの<br />

定 義 をコピーして、「データベース」を「Memory」に 変 更 するのが、 簡 単 な 方 法 です。<br />

1. テーブルリポジトリを 開 き、 最 下 行 にカーソルを 置 きます。<br />

2. メニュー「 編 集 (E)」から「 複 写 登 録 (R)」を 選 択 します。<br />

複 写 登 録 ダイアログが 開 きます。<br />

3. 開 始 番 号 、 終 了 番 号 とも、「5」( 受 注 明 細 テーブルの 番<br />

号 )を 指 定 します。<br />

4. OK ボタンを 押 すと、 受 注 明 細 テーブルのコピーが 6 番<br />

目 のエントリに 作 成 されます。<br />

5. 「データベース」を「Memory」に 変 更 してください。<br />

6. ここでデータ 再 編 成 機 能 が 働 き、「 変 更 しますか?」と<br />

確 認 ダイアログが 表 示 されます。 今 はデータの 移 行 で<br />

はないので、「いいえ(N)」で 答 えます。<br />

7. 区 別 するために、 名 前 を「 受 注 明 細 データ TMP」に<br />

変 更 します。<br />

最 終 的 には、 図 11-3 ( 次 ページ)のようになります。<br />

80 受 注 入 力 プログラムの 変 更


図 11-3 一 時 テーブル「 受 注 明 細 データ TMP」の 定 義<br />

受 注 入 力 プログラムの 変 更 81


11.3. 一 時 テーブル 操 作 用 バッチタスク<br />

一 時 テーブルに 対 するいくつかの 簡 単 な 操 作 を 行 うバッチタスクを 作 成 しましょう。 以 下 、 一 時 テーブルを<br />

「 受 注 明 細 データ TMP」と 呼 びます。<br />

11.3.1. 一 時 テーブルのレコード 削 除<br />

これは、 受 注 明 細 TMP のレコードをすべて 削 除 するものです。 初 期 化 の 一 環 としてデータをクリアする 場<br />

合 に 用 います。<br />

注 意 : 本 章 以 下 では、<strong>Magic</strong> のプログラムロジックを 説 明 するために、 下 記 のような 表 記 法 で 説 明 して<br />

いきますが、<strong>Magic</strong> にこのようなスクリプト 言 語 があるわけではありません。 実 際 に <strong>Magic</strong> のプログラ<br />

ムを 作 成 ・ 修 正 する 場 合 には、<strong>Magic</strong> 開 発 版 でプログラムリポジトリを 開 いて 行 います。<br />

タスク 特 性<br />

名 前 : B_ 受 注 明 細 TMP 削 除<br />

タスクタイプ: B=バッチ<br />

初 期 モード: D= 削 除<br />

メインテーブル: 6 ( 受 注 明 細 データ TMP)<br />

インデックス: 1 ( 受 注 番 号 )<br />

トランザクションモード: P= 物 理<br />

トランザクション 開 始 : T=タスク 前 処 理 の 前<br />

レコードメイン<br />

セレクト R= 実 データ 1 ( 受 注 番 号 )<br />

初 期 モードが D= 削 除 なので、 処 理 対 象 となるレコードのすべてが 削 除 されます。 今 の 場 合 、レコードメイ<br />

ンのセレクトコマンドなどで 範 囲 指 定 がなされていないため、テーブルの 全 レコードが 対 象 になります。 従<br />

って、このバッチタスクを 実 行 することにより、テーブルのレコードがすべて 削 除 されます。<br />

11.3.2. データベースから 一 時 テーブルへのレコードコピー<br />

受 注 番 号 をパラメータとして 受 け、その 受 注 番 号 に 対 応 する 受 注 明 細 レコードを、データベースから 一 時 テ<br />

ーブルにコピーします。このとき、 一 時 テーブルは 空 であることが 前 提 です。<br />

タスク 特 性<br />

名 前 :B_ 受 注 明 細 本 →TMP コピー<br />

タスクタイプ: B=バッチ<br />

初 期 モード: D= 修 正<br />

メインテーブル: 5 ( 受 注 明 細 データ)<br />

82 受 注 入 力 プログラムの 変 更


インデックス: 1 ( 受 注 番 号 )<br />

トランザクションモード: P= 物 理<br />

トランザクション 開 始 : T=タスク 前 処 理 の 前<br />

レコードメイン<br />

セレクト P=パラメータ P_ 受 注 番 号 モデル: 9 ( 受 注 番 号 )<br />

セレクト R= 実 データ 1 ( 受 注 番 号 ) 範 囲 小 : P_ 受 注 番 号 、 範 囲 大 : P_ 受 注 番 号<br />

セレクト R= 実 データ 2 ( 受 注 明 細 番 号 )<br />

セレクト R= 実 データ 3 ( 商 品 番 号 )<br />

セレクト R= 実 データ 4 ( 商 品 タイプ)<br />

セレクト R= 実 データ 5 ( 数 量 )<br />

セレクト R= 実 データ 6 ( 単 価 )<br />

セレクト R= 実 データ 7 ( 合 計 )<br />

リンク C= 登 録 6 ( 受 注 明 細 データ TMP)、インデックス: 1<br />

セレクト R= 実 データ 1 ( 受 注 番 号 )<br />

セレクト R= 実 データ 2 ( 受 注 明 細 番 号 )<br />

セレクト R= 実 データ 3 ( 商 品 番 号 )<br />

セレクト R= 実 データ 4 ( 商 品 タイプ)<br />

セレクト R= 実 データ 5 ( 数 量 )<br />

セレクト R= 実 データ 6 ( 単 価 )<br />

セレクト R= 実 データ 7 ( 合 計 )<br />

リンク 終 了<br />

レコード 後 処 理<br />

項 目 更 新 I ( 受 注 番 号 ) 式 : B( 受 注 番 号 )<br />

項 目 更 新 J ( 受 注 明 細 番 号 ) 式 : C( 受 注 明 細 番 号 )<br />

項 目 更 新 K ( 商 品 番 号 ) 式 : D( 商 品 番 号 )<br />

項 目 更 新 L ( 商 品 タイプ) 式 : E ( 商 品 タイプ)<br />

項 目 更 新 M ( 数 量 ) 式 : F ( 数 量 )<br />

項 目 更 新 N ( 単 価 ) 式 : G ( 単 価 )<br />

項 目 更 新 O ( 合 計 ) 式 : H ( 合 計 )<br />

コピー 元 のテーブルをメインテーブルとして 設 定 し、コピー 先 のテーブルは、「 登 録 」モードのリンクコマン<br />

ドで 参 照 します。レコードメインでは 各 テーブルの 全 カラムをセレクトコマンドで 選 択 し、レコード 後 処 理<br />

で 全 カラムについて 値 をコピーします。コピーレコードを 絞 り 込 むため、パラメータで 受 注 番 号 を 受 け 取 り、<br />

セレクトコマンドの「 範 囲 小 / 大 」で 範 囲 指 定 を 行 っています。このような 形 は、レコードをテーブルからテ<br />

ーブルにコピーする 場 合 の 常 套 手 段 です。<br />

受 注 入 力 プログラムの 変 更 83


11.3.3. 受 注 明 細 レコード 削 除<br />

これは、 受 注 番 号 をパラメータとして 受 け、その 受 注 番 号 に 属 する 受 注 明 細 レコードを 削 除 します。このと<br />

き、 各 明 細 の 商 品 のレコードについて、 受 注 番 号 を 調 整 します。<br />

タスク 特 性<br />

名 前 :B_ 受 注 明 細 削 除<br />

タスクタイプ: B=バッチ<br />

初 期 モード: D= 削 除<br />

メインテーブル: 5 ( 受 注 明 細 データ)<br />

インデックス: 1 ( 受 注 番 号 )<br />

トランザクションモード: P= 物 理<br />

トランザクション 開 始 : T=タスク 前 処 理 の 前<br />

レコードメイン<br />

セレクト P=パラメータ P_ 受 注 番 号 モデル:9 ( 受 注 番 号 )<br />

セレクト R= 実 データ 1 ( 受 注 番 号 ) 範 囲 小 : P_ 受 注 番 号 、 範 囲 大 : P_ 受 注 番 号<br />

セレクト R= 実 データ 2 ( 受 注 明 細 番 号 )<br />

セレクト R= 実 データ 3 ( 商 品 番 号 )<br />

セレクト R= 実 データ 5 ( 数 量 )<br />

リンク Q= 照 会 3 ( 商 品 マスタ) インデックス: 1<br />

セレクト R= 実 データ 1 ( 商 品 番 号 ) 位 置 付 小 : C ( 商 品 番 号 )、 位 置 付 大 :C ( 商 品 番 号 )<br />

セレクト R= 実 データ 6 ( 受 注 数 )<br />

リンク 終 了<br />

レコード 後 処 理<br />

項 目 更 新 F ( 受 注 数 ) 式 : F-D ( 受 注 数 – 数 量 )<br />

11.3.1 の「 一 時 テーブルのレコード 削 除 」の 場 合 と 同 じく、 初 期 モードが「D= 削 除 」のバッチタスクとして<br />

組 みます。メインテーブルは、 削 除 の 対 象 となる「 受 注 明 細 データ」テーブルです。<br />

11.3.1 の「 一 時 テーブルのレコード 削 除 」の 場 合 には、レコード 後 処 理 に 何 も 処 理 が 入 りませんでしたが、<br />

今 回 は 商 品 マスタの「 受 注 数 」を 調 整 する 必 要 があります。ここでは、 受 注 明 細 を 削 除 しているので、 単 純<br />

な 引 き 算 となります。レコードメインでは、この 明 細 レコードの 商 品 番 号 カラムで 指 定 されている 商 品 のレ<br />

コードをリンクし、レコード 後 処 理 で 受 注 数 を 減 らしています。<br />

84 受 注 入 力 プログラムの 変 更


11.3.4. 一 時 テーブルのデータをデータベースに 反 映<br />

これは、 一 時 テーブルに 格 納 されている 仮 の 受 注 明 細 データをデータベースにコピーするものです。コピー<br />

に 伴 って、 各 受 注 明 細 の 商 品 について 商 品 マスターの 受 注 数 を 調 節 します。<br />

タスク 特 性<br />

名 前 :B_ 受 注 明 細 TMP→ 本 コピー<br />

タスクタイプ: B=バッチ<br />

初 期 モード: M= 修 正<br />

メインテーブル: 6 ( 受 注 明 細 データ TMP)<br />

インデックス: 1 ( 受 注 番 号 )<br />

トランザクションモード: P= 物 理<br />

トランザクション 開 始 : T=タスク 前 処 理 の 前<br />

レコードメイン<br />

セレクト P=パラメータ P_ 受 注 番 号 モデル: 9 ( 受 注 番 号 )<br />

セレクト R= 実 データ 1 ( 受 注 番 号 )<br />

セレクト R= 実 データ 2 ( 受 注 明 細 番 号 )<br />

セレクト R= 実 データ 3 ( 商 品 番 号 )<br />

セレクト R= 実 データ 4 ( 商 品 タイプ)<br />

セレクト R= 実 データ 5 ( 数 量 )<br />

セレクト R= 実 データ 6 ( 単 価 )<br />

セレクト R= 実 データ 7 ( 合 計 )<br />

リンク C= 登 録 5 ( 受 注 明 細 データ)、インデックス: 1<br />

セレクト R= 実 データ 1 ( 受 注 番 号 )<br />

セレクト R= 実 データ 2 ( 受 注 明 細 番 号 )<br />

セレクト R= 実 データ 3 ( 商 品 番 号 )<br />

セレクト R= 実 データ 4 ( 商 品 タイプ)<br />

セレクト R= 実 データ 5 ( 数 量 )<br />

セレクト R= 実 データ 6 ( 単 価 )<br />

セレクト R= 実 データ 7 ( 合 計 )<br />

リンク 終 了<br />

リンク Q= 照 会 3 ( 商 品 マスタ) インデックス: 1<br />

セレクト R= 実 データ 1 ( 商 品 番 号 ) 位 置 付 小 : D ( 商 品 番 号 )、 位 置 付 大 :D ( 商 品 番 号 )<br />

セレクト R= 実 データ 6 ( 受 注 数 )<br />

受 注 入 力 プログラムの 変 更 85


リンク 終 了<br />

レコード 後 処 理<br />

項 目 更 新 I ( 受 注 番 号 ) 式 : A(パラメータ)<br />

項 目 更 新 J ( 受 注 明 細 番 号 ) 式 : C( 受 注 明 細 番 号 )<br />

項 目 更 新 K ( 商 品 番 号 ) 式 : D( 商 品 番 号 )<br />

項 目 更 新 L ( 商 品 タイプ) 式 : E ( 商 品 タイプ)<br />

項 目 更 新 M ( 数 量 ) 式 : F ( 数 量 )<br />

項 目 更 新 N ( 単 価 ) 式 : G ( 単 価 )<br />

項 目 更 新 O ( 合 計 ) 式 : H ( 合 計 )<br />

項 目 更 新 Q ( 受 注 数 ) 式 : Q + F ( 受 注 数 + 数 量 )<br />

このプログラムは、11.3.2 の「データベースから 一 時 テーブルへのレコードコピー」とは 反 対 方 向 の 処 理 を<br />

行 うもので、プログラムの 作 りは 良 く 似 ています。<br />

ただし、「 受 注 明 細 データ」テーブルにレコードを 追 加 していくので、 商 品 マスターレコードの「 受 注 数 」を<br />

調 整 する 必 要 があります。この 場 合 には、レコードの 追 加 なので、 単 純 な 加 算 となります。これをレコード<br />

後 処 理 で 行 っています。<br />

以 上 、 単 純 なバッチタスクを 4 つ 用 意 しましたが、これを 使 ってどのようにして 一 時 テーブルを 使 った 受 注<br />

入 力 プログラムを 作 ることができるでしょうか? 次 節 以 降 に、プログラムの 修 正 点 を 説 明 します。<br />

86 受 注 入 力 プログラムの 変 更


11.4. 親 タスクのレコード 前 処 理 の 修 正<br />

参 考 : ここから 受 注 入 力 プログラムを 変 更 していきますが、 念 のために、 既 存 の 受 注 入 力 プログラムを<br />

直 接 修 正 するのではなく、プログラムをコピーしてコピーしたものを 修 正 していくことをお 勧 めします。<br />

ここでは、コピー 後 のタスクを「 受 注 入 力 (<strong>SQL</strong>)」という 名 前 にしておきます。<br />

一 時 テーブルを 利 用 する 方 法 では、 各 受 注 レコードについて、 明 細 レコードをデータベースから 一 時 テーブ<br />

ルにコピーしてやらなければなりません。これは、 受 注 入 力 プログラムの 親 タスク 側 のレコード 前 処 理 で 行<br />

います。<br />

一 時 テーブルは、まず 内 容 をクリアする 必 要 があります。これには「11.3.1 一 時 テーブルのレコード 削 除 」<br />

(82 ページ)で 説 明 したプログラム「B_ 受 注 明 細 TMP 削 除 」を 呼 び 出 します。<br />

次 に、「11.3.2 データベースから 一 時 テーブルへのレコードコピー」(82 ページ)で 説 明 した、コピープロ<br />

グラム「B_ 受 注 明 細 本 → TMP コピー」を 呼 び 出 します。<br />

ただし、タスクが 登 録 モードの 場 合 には、データベースに 明 細 レコードがまだ 入 力 される 前 ですから、コピ<br />

ープログラムは 呼 び 出 す 必 要 はありません。 従 って、NOT Stat(0,’C’MODE) を 条 件 に 設 定 します。<br />

以 上 まとめると、 親 タスクのレコード 前 処 理 は 次 のような 内 容 となります。<br />

レコード 前 処 理<br />

コール プログラム 38(B_ 受 注 明 細 TMP 削 除 )<br />

コール プログラム 39(B_ 受 注 明 細 本 → TMP コピー) 条 件 : NOT Stat(0,’C’MODE)<br />

パラメータ: A ( 受 注 番 号 )<br />

コール タスク 1 ( 受 注 明 細 データ)<br />

図 11-4 親 タスクのレコード 前 処 理<br />

受 注 入 力 プログラムの 変 更 87


11.5. 親 タスクのコントロール 後 処 理 の 削 除<br />

<strong>SQL</strong> 対 応 前 の 受 注 入 力 プログラムでは、「 顧 客 番 号 」のコントロール 後 処 理 で 受 注 番 号 を 発 番 していました。<br />

しかし、<strong>SQL</strong> 対 応 の 基 本 方 針 として、 受 注 番 号 はユーザの 入 力 が 終 わりレコードを 一 時 ファイルからデータ<br />

ベースに 書 き 込 む 直 前 に 行 うようにしました。<br />

この 変 更 に 従 い、 親 タスクの「 顧 客 番 号 」のコントロール 後 処 理 のハンドラは 削 除 します。<br />

連 番 作 成 のバッチタスクは、レコード 後 処 理 に 移 動 します。(11.7.1「 受 注 番 号 の 発 番 」(91 ページ)を 参 照 。)<br />

修 正 前<br />

修 正 後<br />

88 受 注 入 力 プログラムの 変 更


11.6. 受 注 明 細 タスク( 子 タスク)の 変 更<br />

先 に、 子 タスク( 受 注 明 細 を 扱 うタスク)から 考 えます。 子 タスクは 商 品 マスターへの 更 新 がなくなるので、<br />

すっきりとします。<br />

11.6.1. 受 注 明 細 タスクのメインテーブルの 変 更<br />

<strong>SQL</strong> 化 の 基 本 方 針 は、 明 細 レコードを 一 時 テーブルにコピーして 扱 う、ということなので、 受 注 明 細 のタス<br />

クのメインテーブルとしては、DBMS の 受 注 明 細 ファイルを 指 定 するのではなく、 一 時 テーブルを 使 うよう<br />

にします。これは、タスク 特 性 の「メインテーブル」を 受 注 明 細 テーブル(テーブル 5 番 )から 受 注 明 細 テー<br />

ブル TMP (テーブル 6 番 ) に 変 更 するだけです。この 二 つのテーブルは、カラムの 定 義 が 全 く 同 じなので、<br />

レコードメインやその 他 の 部 分 には 手 をつける 必 要 はありません。<br />

修 正 前<br />

修 正 後<br />

11.6.2. レコード 後 処 理<br />

次 に、<strong>SQL</strong> 化 のもうひとつの 方 針 として、 商 品 マスターへの 更 新 ( 受 注 個 数 の 更 新 )は、 入 力 が 確 定 したとき<br />

に、 最 後 にバッチタスクでいっぺんに 行 う、ということでした。したがって、 子 タスクの 中 では 商 品 マスタ<br />

ーに 変 更 をかけることをしません。<br />

レコード 後 処 理 で 商 品 ファイルの「 受 注 数 」を 変 更 するには、バッチプログラム「B_ 商 品 マスタ 更 新 バッチ」<br />

を 呼 び 出 していましたが、このコールコマンドを 削 除 します。<br />

修 正 前<br />

修 正 後<br />

受 注 入 力 プログラムの 変 更 89


11.6.3. トランザクションの 設 定<br />

もう 一 つの 修 正 事 項 ( 確 認 事 項 )は、トランザクションの 設 定 です。 親 タスクと 同 一 のトランザクション 内 で<br />

実 行 するために、タスク 特 性 の「 高 度 (A)」タブで、トランザクションモードの 設 定 が「W= 親 と 同 一 」とな<br />

っていなければなりません。デフォルトで 子 タスクのトランザクションはこの 設 定 となっているはずですが、<br />

確 認 してください。<br />

90 受 注 入 力 プログラムの 変 更


11.7. 親 タスクのレコード 後 処 理 の 変 更<br />

受 注 明 細 の 一 時 テーブルに 対 する 入 力 ・ 修 正 内 容 は、 受 注 入 力 ( 登 録 、 修 正 )が 確 定 したタイミングでデータ<br />

ベースに 反 映 させます。これは、プログラムで 言 えば、 親 タスクのレコード 後 処 理 になります。ここでは、<br />

親 タスクのレコード 後 処 理 で 行 うべき 処 理 について 説 明 します。<br />

11.7.1. 受 注 番 号 の 発 番<br />

最 初 に、 登 録 モードのときにはまだ 受 注 番 号 が 確 定 されていないので、 新 しい 受 注 番 号 を 発 番 する 必 要 があ<br />

ります。これは、 以 前 にマルチユーザ 対 応 のために 作 成 したバッチタスク「B_ 受 注 番 号 発 番 」をそのまま 利<br />

用 します。これは 登 録 モードのときだけ 実 行 されるものなので、 条 件 としては Stat(0,’C’MODE) となりま<br />

す。<br />

11.7.2. 明 細 レコードをデータベースに 反 映<br />

一 時 テーブルの 内 容 をデータベースに 反 映 する 際 には、 登 録 モードの 場 合 には 単 に 一 時 テーブルの 内 容 をデ<br />

ータベースに 追 加 すればよいのですが、 修 正 モードの 場 合 も 考 えると、データベース 中 の 明 細 レコードと 一<br />

時 テーブル 中 の 明 細 レコードとをつき 合 わせてマージする 必 要 があります。<br />

レコードのマージを 行 うのに、ひとつひとつ 受 注 明 細 番 号 が 同 じという 条 件 でレコードをつき 合 わせる、と<br />

いう 方 法 もあるのですが、 明 細 レコードが 追 加 された 場 合 、 削 除 された 場 合 、 追 加 も 削 除 もされなかったが<br />

修 正 された 場 合 、 変 更 のなかった 場 合 、 商 品 番 号 が 変 わった 場 合 、 変 わらなかった 場 合 、というように 場 合<br />

分 けするのが 面 倒 で 誤 りやすいものです。しかもこのときに 同 時 に、 明 細 レコードに 指 定 されている 商 品 に<br />

ついて、 受 注 数 の 調 整 を 行 いますので、 複 雑 化 します。<br />

ここでは 単 純 化 のために、データベース 中 に 格 納 されている 現 在 の 受 注 に 関 する 既 存 の 明 細 レコードをいっ<br />

たん 全 部 削 除 してから、 一 時 テーブルの 内 容 をデータベースに 追 加 コピーするという 方 法 を 使 って、 最 終 的<br />

にマージを 行 ったのと 同 じ 結 果 になるようにします。<br />

よって、このステップは 次 のような 二 つの 操 作 となります。<br />

1. 修 正 モード、あるいは 削 除 モードの 場 合 には、データベースにある 既 存 の 明 細 レコードを「0 受 注 明 細<br />

レコード 削 除 」(84 ページ)で 説 明 したバッチタスク「B_ 受 注 明 細 削 除 」により 削 除 します。<br />

2. 登 録 モード、あるいは 修 正 モードの 場 合 には、 一 時 テーブルにあるレコードを、データベースに 追 加 し<br />

ます。これは「0 一 時 テーブルのデータをデータベースに 反 映 」(85 ページ)で 説 明 したバッチタスク「B_<br />

受 注 明 細 TMP→ 本 」で 行 います。<br />

これらのバッチタスクは、 同 時 に 商 品 マスタレコードの 受 注 数 の 更 新 も 行 いますので、 商 品 マスタの「 受 注<br />

数 」も 正 しく 維 持 されます。<br />

受 注 入 力 プログラムの 変 更 91


11.7.3. 顧 客 レコードの 累 計 受 注 額 と 受 注 回 数 の 更 新<br />

最 後 に、 顧 客 レコードの 累 積 受 注 額 と 受 注 回 数 の 更 新 も 行 います。<br />

この 処 理 については <strong>SQL</strong> 化 する 前 と 同 じで、バッチタスク「B_ 顧 客 マスタ 更 新 バッチ」を 呼 び 出 すことに<br />

より 行 います。<br />

11.7.4. まとめると<br />

以 上 をまとめると、レコード 後 処 理 は 次 のようになります。<br />

レコード 前 処 理<br />

コールプログラム 23(B_ 受 注 番 号 発 番 ) 条 件 : Stat(0,’C’MODE)<br />

パラメータ: A ( 受 注 番 号 )<br />

コールプログラム 40(B_ 受 注 明 細 削 除 ) 条 件 : Stat(0,’MD’MODE)<br />

パラメータ: A ( 受 注 番 号 )<br />

コールプログラム 41(B_ 受 注 明 細 TMP→ 本 ) 条 件 : Stat(0,’CM’MODE)<br />

パラメータ: A ( 受 注 番 号 )<br />

コールプログラム 25 (B_ 顧 客 マスタ 更 新 バッチ)<br />

条 件 : Stat(0,’MD’MODE)<br />

パラメータ: VarPrev(’C’VAR), VarPrev(’Q’VAR), ’FALSE’LOG<br />

コールプログラム 25 (B_ 顧 客 マスタ 更 新 バッチ)<br />

条 件 : Stat(0,’MD’MODE)<br />

パラメータ: C( 顧 客 番 号 ), Q( 受 注 合 計 額 ), ’TRUE’LOG<br />

図 11-5 親 タスクのレコード 後 処 理<br />

92 受 注 入 力 プログラムの 変 更


11.8. 実 行 してみる<br />

プログラムができたので、 実 行 して 確 認 しましょう。<br />

11.8.1. メニューへの 登 録<br />

先 に 作 った 受 注 入 力 プログラムをメニューに 登 録 します。メニューリポジトリを 開 き、「 受 注 入 力 」のサブメ<br />

ニューとして、 今 作 った「 受 注 入 力 (<strong>SQL</strong>)」を 登 録 してください。<br />

11.8.2. テスト 準 備<br />

開 発 版 ではアプリケーションを 閉 じます。<br />

マルチユーザのテストをするので、 実 行<br />

版 を 二 つ 起 動 し、それぞれでアプリケー<br />

ションを 開 いておきます。 複 数 のユーザ<br />

になぞらえて、それぞれをユーザ A、ユ<br />

ーザ B と 呼 びます。<br />

テスト 用 のデータを 初 期 化 するため、ポ<br />

ップアップメニューから「データ 入 力 ( 受<br />

注 は 空 )」を 選 んで 実 行 してください。<br />

これにより、 受 注 データは 空 になり、マ<br />

スターの 受 注 関 係 データはすべてクリア<br />

されます。<br />

11.8.3. テストパターン<br />

テストは、 大 きくわけて 次 のようなポイントを 確 認 しましょう。ここではひとつひとつについて 細 かく 書 き<br />

ませんが、 実 際 に 行 って 試 してください。<br />

• 一 人 で 使 っている 場 合 に、 登 録 ・ 修 正 ・ 削 除 を 行 い、 正 しくデータが 計 算 ・ 登 録 されること。<br />

‣ 新 規 で 受 注 データ( 明 細 行 を 複 数 含 む)を 登 録 する。<br />

受 注 入 力 プログラムの 変 更 93


‣ 既 存 の 受 注 データについて、 以 下 のことを 行 う。<br />

明 細 行 を 1 行 追 加 する。<br />

既 存 の 明 細 行 の 商 品 番 号 と 個 数 を 変 更 する。<br />

明 細 行 を 1 行 削 除 する。<br />

明 細 行 の 商 品 番 号 と 個 数 を 変 更 した 後 にその 行 を 削 除 する。<br />

親 タスクにカーソルがある 状 態 で、<br />

• 顧 客 番 号 を 変 更 する。<br />

• 明 細 行 がすべて 削 除 した 後 、F3 キーで 削 除 する。<br />

• 二 人 で 同 時 に 使 っている 場 合 に、 利 用 を 妨 げるようなロック 待 ちなどや 不 正 更 新 などが 発 生 しないこと。<br />

‣ 同 時 登 録 の 場 合 :<br />

ユーザ A が 受 注 の 入 力 を 行 い、タスクを 終 了 しないでそのまま 待 っている 状 態 で、ユーザ B が<br />

同 一 顧 客 番 号 、 同 一 明 細 内 容 で 入 力 を 行 う。このとき、ロック 待 ちが 発 生 しないことを 確 認 。<br />

ユーザ A がタスクを 終 了 した 後 、ユーザ B がタスクを 終 了 する。このとき、ロック 待 ちが 発 生<br />

せず、データが 両 方 とも 正 しく 入 力 されていることを 確 認 。<br />

‣ 同 時 修 正 の 場 合 :<br />

ユーザ A、ユーザ B が、それぞれ 自 分 が 入 力 したデータを 開 き、 先 に 一 人 で 使 っている 場 合 に<br />

行 ったような 修 正 を 同 時 に 行 う。このときにロック 待 ちが 発 生 しないことを 確 認 。<br />

ユーザ A、ユーザ B がそれぞれタスクを 終 了 する。データが 正 しく 更 新 されていることを 確 認 。<br />

このようなテストがすべてパスすれば、 受 注 入 力 プログラムの <strong>SQL</strong> 化 は 完 成 です。<br />

94 受 注 入 力 プログラムの 変 更


12. トランザクション 設 定 の 注 意 事 項<br />

前 章 では、 受 注 入 力 プログラムについて、<strong>SQL</strong> 対 応 を 行 いました。<br />

本 章 では、 前 章 で 説 明 した 事 項 のほかに、トランザクションを 使 う <strong>Magic</strong> プログラムを 開 発 ・ 設 計 する 上 で<br />

注 意 すべき 次 のような 点 について 簡 単 に 説 明 します。<br />

• トランザクションの 開 始 と 終 了 のタイミング<br />

• 物 理 トランザクションのネストはできない<br />

• トランザクションの 対 象 となるデータベース<br />

• テーブルを 使 わないタスク<br />

トランザクション 設 定 の 注 意 事 項 95


12.1. トランザクションの 開 始 と 終 了 のタイミング<br />

<strong>Magic</strong> のプログラムでのトランザクションの<br />

開 始 と 終 了 は、タスク 特 性 の「 高 度 」タブの<br />

「トランザクション 開 始 」パラメータにより<br />

決 定 されます。<br />

このパラメータの 意 味 は、 以 下 の 通 りです。<br />

トランザクション 開 始<br />

トランザクション 開 始<br />

トランザクション 終 了<br />

パラメータ<br />

T=タスク 前 処 理 の 前 タスク 前 処 理 の 前 タスクタスク 前 処 理 の 後<br />

L=レコードロック 時 レコードがロックされる 直 前 レコードが 更 新 された 後<br />

P=レコード 前 処 理 の 前 レコード 前 処 理 の 前 レコードが 更 新 された 後<br />

S=レコード 後 処 理 の 前 レコード 後 処 理 の 前 レコードが 更 新 された 後<br />

U=レコード 更 新 前 レコード 後 処 理 の 後 、データベースに レコードが 更 新 された 後<br />

対 して 更 新 処 理 が 行 われる 直 前<br />

N=なし<br />

トランザクションは 開 始 されません<br />

G=グループ グループ 前 処 理 の 前 グループ 後 処 理 の 後<br />

参 考 : 「G=グループ」は、バッチタスクで「グループレベル」が 定 義 されている 場 合 に 指 定 できます。こ<br />

の 場 合 には、グループ 項 目 を[ 項 目 ] 欄 に 定 義 します<br />

トランザクションの 開 始 と 終 了 は、タスクのレベルで 対 称 になっていることに 注 意 してください。 具 体 的 に<br />

は、<br />

• 「T=タスク 前 処 理 の 前 」ならば、タスク 前 処 理 の 前 に 開 始 し、タスク 後 処 理 の 後 に 終 了 します。すなわ<br />

ち、タスクレベルで 始 まり、 終 わります。<br />

• 「L=レコードロック 時 」から「U=レコード 更 新 時 」は、 開 始 時 期 はそれぞれ 異 なりますが、いずれも<br />

一 つのレコードの 処 理 の 中 であり、 終 了 時 期 もそのレコードが 更 新 されたときとなっており、いずれの<br />

場 合 にもレコード 単 位 で 閉 じています。<br />

• 「G=グループ」の 場 合 には、 同 一 のグループの 前 処 理 の 前 に 始 まり、 後 処 理 の 後 に 終 わります。すなわ<br />

96 トランザクション 設 定 の 注 意 事 項


ち、グループの 中 で 始 まり 終 わります。<br />

となっています。<br />

逆 に 言 うと、 異 なるレベルにまたがってトランザクションの 開 始 ・ 終 了 が 対 応 することはありません。 例 え<br />

ば、 次 のようなトランザクションの 設 定 はすることができません:<br />

あるレコードの 前 処 理 の 前 に 始 まり、タスクの 後 処 理 の 後 で 終 了 する<br />

子 タスクのレコード 前 処 理 の 前 で 始 まり、 親 タスクのタスク 後 処 理 の 後 で 終 了 する。<br />

トランザクション 設 定 の 注 意 事 項 97


12.2. 物 理 トランザクションのネストはできない<br />

あるタスクでトランザクションの 設 定 がされており(つまり、「N=なし」 以 外 に 設 定 されている)、そのタス<br />

クが 別 のタスクを 呼 び 出 したとき、そのタスクにもトランザクションの 設 定 がされている 場 合 には、トラン<br />

ザクションはどのように 扱 われるのでしょうか? 親 タスクでトランザクションが 開 始 され、 子 タスクでも 別<br />

のトランザクション(ネストされたトランザクション)が 開 始 されるのでしょうか?<br />

結 論 から 言 うと、<strong>Magic</strong> では、 物 理 トランザクションの 場 合 には、トランザクションのネストを 行 いません。<br />

今 の 例 では、 親 の 方 でトランザクションが 開 始 されたら、それ 以 降 は、 呼 び 出 されるタスクのトランザクシ<br />

ョンの 設 定 のいかんにかかわらず、すべての 処 理 は 親 タスクのトランザクションの 中 で 処 理 されます。<br />

受 注 入 力 タスクの 例 で、 具 体 的 に 説 明 しましょう。 図 12-1 は、 前 章 で 作 成 した 受 注 入 力 プログラム(<strong>SQL</strong><br />

対 応 版 )から 呼 び 出 されるタスクと、それぞれのトランザクション 設 定 を 表 しています。<br />

図 12-1 受 注 入 力 (<strong>SQL</strong>)から 呼 び 出 されるタスクのトランザクション 設 定<br />

親 タスク<br />

(L=レコードロック 時 )<br />

すべての 処 理 は 親 タスクの<br />

トランザクション 中 で 実 行 される。<br />

顧 客 選 択<br />

(N=なし)<br />

受 注 番 号 発 番<br />

(T=タスク 前 処 理 の 前 )<br />

受 注 明 細 削 除<br />

(T=タスク 前 処 理 の 前 )<br />

子 タスク<br />

(W= 親 と 同 一 )<br />

受 注 明 細 TMP→ 本<br />

(T=タスク 前 処 理 の 前 )<br />

商 品 選 択<br />

(N=なし)<br />

顧 客 マスタ 更 新<br />

(T=タスク 前 処 理 の 前 )<br />

受 注 入 力 タスクでは、 親 タスクで「L=レコードロック 開 始 時 」にトランザクションが 開 始 されます。これは、<br />

顧 客 選 択 を 行 ってデータの 変 更 を 行 ったりした 時 点 で 始 まります。<br />

以 後 、 受 注 入 力 では、 子 タスクに 移 って 商 品 選 択 ・ 個 数 の 入 力 をし、 親 タスクに 戻 ってからレコード 後 処 理<br />

で 一 連 のバッチタスクを 実 行 します。<br />

このとき、 子 タスクは「W= 親 タスクの 中 」のトランザクション 設 定 となっており、 受 注 番 号 発 番 などの 一<br />

連 のバッチタスクでは、それぞれで「T=タスク 前 処 理 の 前 」と 設 定 されています。<br />

しかし、これらのタスクのトランザクションの 設 定 にかかわらず、すでに 最 初 のタスク( 親 タスク)でトラン<br />

98 トランザクション 設 定 の 注 意 事 項


ザクションが 開 始 されてしまっているので、すべての 処 理 はこのトランザクションの 中 で 行 われます。この<br />

トランザクションは 親 タスクのレコードの 更 新 が 終 了 した 時 点 で 終 了 します。このときに、 下 位 のタスクで<br />

行 った 修 正 がすべていっぺんにコミットされます。 逆 に 言 うと、このときまでは、 修 正 内 容 はコミットされ<br />

ていないので、 他 の 人 からは 見 ることができません。また、「9.5.2 ロックとトランザクションの 関 係 」(71<br />

ページ)で 説 明 したように、トランザクションの 中 ではロックが 累 積 され、トランザクションをコミットする<br />

ときにすべてのロックが 一 度 に 解 除 される、というようになっていますので、 下 位 のタスクでロックしたレ<br />

コードも、 親 タスクでレコード 書 き 込 みが 行 われてコミットされるまで 解 除 されないことになります。<br />

これは 単 純 な 約 束 事 ですが、 実 際 にいろいろなタスクを 呼 び 出 す 複 雑 なプログラムになると、どこでトラン<br />

ザクションが 開 始 されるのかをあらかじめよく 考 えて 設 定 しておかなければ、 書 き 込 んだつもりでいるレコ<br />

ードがコミットされずに 他 から 見 えなかったり、あるいはロックが 解 除 されないでロック 待 ちが 頻 発 したり<br />

などの 事 態 が 起 こります。この 手 の 不 具 合 は、 単 体 テストでは 見 つかりにくく、 複 数 のユーザが 同 時 に 使 い<br />

始 めて 初 めて 気 がつく、というケースが 多 く、また、 原 因 を 追 究 するのも 面 倒 になりがちなものです。<br />

トランザクション 設 定 の 注 意 事 項 99


12.3. トランザクションの 対 象 となるデータベース<br />

次 に 注 意 すべき 点 は、トランザクションが 開 始 されるとき、「どのデータベースがトランザクションの 対 象 に<br />

なるか?」ということです。<br />

あるタスクで 異 なるデータベース 上 のテーブルを 利 用 していたとします。 受 注 入 力 の 場 合 には、MS-<strong>SQL</strong><br />

Server 上 のテーブルと、 明 細 データの 一 時 格 納 場 所 としてメモリゲートウェイを 利 用 していました。もう 少<br />

し 複 雑 な 構 成 では、 例 えば 社 員 マスタと 受 注 データとを 異 なるサーバマシンの MS-<strong>SQL</strong> Server に 格 納 して<br />

あるのを 同 時 にアクセスし、 一 時 ファイルとして Pervasive.<strong>SQL</strong> をローカルに 保 存 したり、 小 さなデータは<br />

メモリゲートウェイに 保 存 する、などといった 使 い 方 もするかも 知 れません。ことによると、<strong>Magic</strong> の「デ<br />

ータベーステーブル」には、もっと 多 くのデータベースが 登 録 されているかもしれません。<br />

このタスクでトランザクションが 開 始 されるとき、どのデータベースにトランザクション 開 始 を 伝 達 するの<br />

でしょうか?<br />

12.3.1. DB テーブルに 登 録 されているテーブルに 属 するデータベース<br />

答 えは、トランザクションを 開 始 する 時 点 で、オープンされているテーブルが 格 納 されているデータベース<br />

に 対 して、トランザクション 開 始 を 伝 達 します。すなわち、<br />

• このタスクの「DB テーブル」に 登 録 されているテーブルの 属 するデータベース<br />

• このタスクを 呼 び 出 ししたタスク(あるいはその 先 祖 のタスク)の「DB テーブル」に 登 録 されている<br />

テーブルの 属 するデータベース<br />

にはトランザクションが 伝 達 され、それ 以 外 のデータベースには 伝 達 されません。<br />

この 規 則 を 具 体 的 な 例 で 考 えて 見 ましょう。 図 12-2 を 見 てください。<br />

図 12-2 トランザクション 開 始 の 伝 達 されるデータベース<br />

人 事 DB<br />

注 文 DB<br />

タスクA<br />

集 計 TMP<br />

DB<br />

タスクAでトランザクションが 開 始<br />

されると、 集 計 TMP DBと 人 事<br />

DBにはトランザクション 開 始 が<br />

伝 達 される。<br />

タスクB<br />

しかし、 注 文 DBには 伝 達 されな<br />

いので、タスクBで 注 文 DBをアク<br />

セスしても、 注 文 DBはトランザク<br />

ションなしの 状 態 で 実 行 される。<br />

100 トランザクション 設 定 の 注 意 事 項


これは 今 までのペットショップデモよりも 複 雑 で、 二 つの MS-<strong>SQL</strong> Server のデータベース「 人 事 データベ<br />

ース」と「 注 文 データベース」およびローカルの Pervasive.<strong>SQL</strong> を 集 計 の 一 時 テーブルとして 使 っていると<br />

します。<br />

ここで、タスク A では 集 計 の 一 時 テーブル(Pervasive.<strong>SQL</strong>)と、 社 員 マスタ( 人 事 データベース)とを 利 用 して<br />

います。ここでタスク A がトランザクションを 開 始 したら、Pervasive.<strong>SQL</strong> と 人 事 データベースにはトラ<br />

ンザクション 開 始 (BEGIN TRANSACTION 命 令 )が 伝 達 され、トランザクションが 開 始 されます。しかし、<br />

受 注 データのある 受 注 データベースは、タスク A が 利 用 していないので、 上 の 規 則 に 従 いトランザクション<br />

開 始 は 伝 達 されません。<br />

次 に、タスク A がタスク B を 呼 び 出 します。タスク B は 受 注 テーブルを 使 うので、 受 注 データベースをア<br />

クセスします。しかしこのような 設 定 では、 受 注 データベースにはトランザクションが 開 始 されないままア<br />

クセスされる 状 態 になります。<br />

MS-<strong>SQL</strong> サーバの 場 合 、トランザクションを 使 わずに、つまり 明 示 的 に BEGIN TRANSACTION を 発 行 っ<br />

せずに DML 文 (SELECT、UPDATE、DELETE、INSERT など)を 実 行 すると、 各 DML 文 ごとにトランザ<br />

クションが 自 動 コミットされるものとなります。トランザクションが DML 文 ごとにコミットされてしまう<br />

ので、レコードロックはすぐに 解 除 されてしまい、 実 質 的 にはロックがかからずに 実 行 されることになりま<br />

す。<br />

もし、タスク B で 受 注 テーブルにロックをかけて 排 他 制 御 を 行 うことを 意 図 して 設 計 されているとするなら<br />

ば、 実 際 には 意 図 に 反 して、 受 注 テーブルへのロックはかからないことになってしまいます。このような 動<br />

作 の 不 正 は、テストでなかなかひっかかりにくいもので、 本 番 で 多 くの 人 が 使 い 始 め、データの 不 正 が 不 定<br />

期 的 に 散 見 されるようになり 始 めて 露 呈 するようなものです。<br />

このような 状 況 の 場 合 の 解 決 法 は、 注 文 DB に 属 するテーブルを、タスク A の DB テーブルに 追 加 登 録 して<br />

おくことです。DB テーブルは 普 通 、そのタスクでメインテーブルかリンクテーブルとして 使 っているテー<br />

ブルが 自 動 的 に 登 録 されていくのですが、それ 以 外 にも、F4 キーで 新 しくエントリを 追 加 し、 任 意 のテーブ<br />

ルを 追 加 することができます。これは「これから 呼 び 出 すタスクでこのテーブルを 使 います」ということを<br />

あらかじめ 宣 言 しておくことになります。<br />

上 の 例 で 言 えば、タスク A の DB テーブルにエントリを 追 加 し、 受 注 テーブルを 登 録 しておきます。このよ<br />

うにしておけば、タスク A でトランザクションが 開 始 されるときに、Perevasive.<strong>SQL</strong>、 人 事 データベース<br />

のほかに、 注 文 データベースにもトランザクションの 開 始 が 伝 達 されますので、タスク B においてもトラン<br />

ザクションの 中 で 動 作 することになり、 意 図 していた 通 り、ロックなどもかかるようになります。<br />

よって、 開 発 時 の 留 意 点 を 大 雑 把 に 言 えば、<br />

• トランザクションが 開 始 されるタスクを 正 しく 把 握 する。<br />

• そのタスクの「DB テーブル」に、トランザクション 中 に 利 用 するテーブルをすべて 登 録 し<br />

ておく<br />

ということになります。<br />

トランザクション 設 定 の 注 意 事 項 101


12.3.2. <strong>SQL</strong> データベースと ISAM データベースの 違 い<br />

<strong>SQL</strong> データベースでは、データロックやデータ 更 新 にトランザクションの 利 用 が 必 須 です。このため、<strong>SQL</strong><br />

データベースに 対 しては、 先 に「12.3.1 DB テーブルに 登 録 されているテーブルに 属 するデータベース」 説<br />

明 した 規 則 に 従 い、トランザクションの 開 始 が 伝 達 されます。<br />

一 方 、ISAM データベース (Pervasive.<strong>SQL</strong> やメモリゲートウェイ)では、データロックやデータ 更 新 にトラ<br />

ンザクションの 利 用 が 必 須 ではありません。このため、ISAM データベースではトランザクションをかけな<br />

いで 利 用 することが 多 いです。<br />

ISAM データベースでトランザクションを 利 用 するかしないかは、 動 作 環 境 の「マルチユーザ」タブの「ISAM<br />

トランザクション」パラメータの 設 定 により 制 御 することができます。( 図 12-3)<br />

図 12-3 ISAM トランザクションの 設 定<br />

このパラメータが No (デフォルト)の 場 合 には、ISAM データベースに 対 してトランザクションを 利 用 しませ<br />

ん。Yes の 場 合 には、トランザクション 開 始 が 伝 達 されます。<br />

なお、<strong>SQL</strong> データベースの 場 合 には、トランザクションの 利 用 が 必 須 なので、これを 制 御 するパラメータは<br />

ありません。<br />

ところで、 前 にも 書 いたとおり、トランザク<br />

ションを 利 用 する 場 合 には、レコードロック<br />

はすべてトランザクション 内 で 行 われること<br />

になります。すなわち、レコードロックに 先<br />

立 ってトランザクションが 開 始 されていなけ<br />

ればなりません。<br />

ところが、トランザクション 開 始 のタイミン<br />

グとレコードロックのタイミングとは、それ<br />

ぞれ 独 立 して 設 定 することができます。<br />

右 図 は、タスク 特 性 の「 拡 張 (E)」タブで、こ<br />

こで、<br />

102 トランザクション 設 定 の 注 意 事 項


• トランザクション 開 始 (トランザクション 開 始 のタイミングを 指 定 )<br />

• ロック 方 式 (ロックのタイミングを 指 定 )<br />

をそれぞれ 指 定 できます。<br />

これは 独 立 しているので、 設 定 によっては、「ロックはトランザクションの 中 で」という 規 則 に 反 する 設 定 を<br />

することもできます。 例 えば、「トランザクション 開 始 」が「レコード 後 処 理 の 前 」なのに、ロック 方 式 が「 入<br />

力 時 」だと、ロックの 開 始 がトランザクションの 開 始 に 先 立 ってしまい、 矛 盾 します。<br />

このような 規 則 違 反 は、<strong>Magic</strong> の 文 法<br />

チェック 機 能 (プログラムリポジトリ<br />

で F8 で 実 行 )により 検 出 することが<br />

でき、 違 反 している 場 合 には「チェック 結 果 」ウィンドウにエラーが 報 告 されます。<br />

このチェック 機 能 は、うっかりミスを 検 出 する 上 で 役 に 立 つのですが、ISAM データベースでトランザクシ<br />

ョンを 利 用 しない 場 合 には、この 規 則 違 反 のチェックは 不 要 になります。このような 場 合 、「ロックとトラン<br />

ザクションの 開 始 の 関 係 のチェックはしなくても 良 いよ」と <strong>Magic</strong> に 対 して 指 示 するのが、 同 じく 図 12-3<br />

動 作 環 境 のマルチユーザタブにある「ロック 前 にトランザクション 開 始 (ISAM)」というパラメータです。こ<br />

れが No になっている 場 合 には、ISAM データベースのみを 使 うタスクについては 規 則 違 反 のチェックを 行<br />

いません。Yes の 場 合 には、ISAM データベースのみを 使 うタスクでもチェックを 行 います。<br />

簡 単 には、「ISAM トランザクション」は 実 行 時 のパラメータ、「ロック 前 にトランザクション 開 始 (ISAM)」<br />

は 開 発 時 のパラメータと 覚 えておくとよいでしょう。 通 常 はこれらのパラメータの 値 は 同 じ( 両 方 No、ある<br />

いは 両 方 Yes)に 設 定 しておきます。<br />

12.3.3. トランザクションをサポートしない DBMS<br />

<strong>Magic</strong> が 扱 う DBMS には、トランザクションをサポートしない DBMS もあります。 例 えばメモリゲートウ<br />

ェイは、メモリ 上 での 一 時 データのみを 扱 い、 複 数 ユーザでデータの 共 有 も 行 わないものなので、トランザ<br />

クションの 必 要 性 もないので、トランザクションはサポートしていません。 当 然 のことながら、このような<br />

DBMS の 場 合 には、「ISAM トランザクション」の 設 定 に 関 わらず、 実 行 時 にトランザクションは 伝 達 され<br />

ません。<br />

12.3.4. まとめると・・・<br />

以 上 のことをまとめると、<strong>Magic</strong><br />

がトランザクションを 開 始 する 場 合 に DBMS にもトランザクション 開 始<br />

が 伝 達 されるかどうかは、 下 表 のようにまとめられます。<br />

DBMS<br />

のタイプ<br />

<strong>SQL</strong><br />

ISAM<br />

DBMS のトランザ ISAM トランザクション 設 定 トランザクションが DBMS に 伝 達 される?<br />

クションサポート<br />

サポートする<br />

サポートする<br />

(いずれでも)<br />

Yes<br />

サポートする No ×<br />

サポートしない ( いず れでも)<br />

×<br />

○<br />

○<br />

トランザクション 設 定 の 注 意 事 項 103


12.4. テーブルを 使 わないタスク<br />

アプリケーションの 中 には、まったくテーブルを 使 わないタスク、というものもあります。このようなタス<br />

クの 場 合 には、トランザクションの 設 定 はどのようにすればよいでしょうか?<br />

例 えば、ペットショップアプリケーションに、「 価 格 変 更 」のタスクが<br />

ありました。 右 図 がその 初 期 画 面 です。このタスクでは、ボタンが 三<br />

つメニューとして 定 義 されており、 自 動 価 格 変 更 の 場 合 には 変 更 のパ<br />

ーセントを 指 定 する 数 値 型 の 変 数 項 目 があります。このタスクでは 一<br />

切 テーブルは 使 いません。<br />

このような、メニューのような 役 目 で 使 われ<br />

ているタスクでは、 一 般 にはトランザクショ<br />

ンを 開 始 しないように 設 定 します。トランザ<br />

クションを 開 始 しないようにするには、タス<br />

ク 特 性 の「 拡 張 (E)」タブでの 設 定 で、<br />

• 「トランザクションモード」を「P= 物 理 」<br />

• 「トランザクション 開 始 」を「N=なし」<br />

• 「ロック 方 式 」を「N=なし」<br />

にします。<br />

このようにしておけば、 親 のメニューのタス<br />

クではトランザクションが 開 始 されません。<br />

このタスクから 呼 び 出 される「 商 品 マスタ<br />

更 新 」のオンラインタスクや、「 自 動 価 格 変<br />

更 」のバッチタスクでは、それぞれにトラ<br />

ンザクションの 設 定 がされているので、そ<br />

れぞれのタスクの 中 でトランザクションが<br />

開 始 され 終 了 します。<br />

このため、 親 に 戻 ってきたときには、すで<br />

にトランザクションがコミットされた 状 態<br />

なので、 処 理 中 のロックなどもすべて 解 放<br />

され、 変 更 はデータベースに 反 映 された 状<br />

態 となっています。<br />

もし、 親 の「 価 格 変 更 」タスクでトランザクションを 開 始 するような 設 定 にしてしまったら、どういった 不<br />

都 合 が 起 こるでしょうか? 例 えば、トランザクション 開 始 を「S=レコード 前 処 理 の 前 」などにしたらどうな<br />

るでしょう?<br />

商 品 マスタ 更 新<br />

(オンライン)<br />

価 格 変 更<br />

(オンライン)<br />

トランザクションはそれ<br />

ぞれのタスクで 閉 じる<br />

テーブルを 使 わな<br />

いタスクではトラン<br />

ザクションなし<br />

自 動 価 格 変 更<br />

(バッチ)<br />

親 タスクでは、レコードサイクルの 最 初 (レコード 前 処 理 の 前 )にトランザクションが 開 始 されます。このと<br />

104 トランザクション 設 定 の 注 意 事 項


き、このタスクの DB テーブルには 何 もテーブルが 登 録 されていません。このため、<strong>Magic</strong> の 実 行 エンジン<br />

としては「トランザクションは 開 始 された」という 状 態 になっているものの、 実 際 にトランザクション 開 始<br />

を 伝 達 されたデータベースはひとつもありません。<br />

ここでユーザが「 手 動 」ボタンを 押 して、オンラインの「 商 品 マスタ 更 新 」タスクが 呼 び 出 されたとします。<br />

このタスクでは、オンラインのデフォルトとして、トランザクション 開 始 が「O= 入 力 時 」になっていますの<br />

で、ユーザがキー 入 力 をした 瞬 間 、<strong>Magic</strong> はレコードロックをかけようとします。 本 来 ならばここで、MS-<strong>SQL</strong><br />

Server に BEGIN TRANSACTION が 送 ってトランザクション 開 始 を伝 達 しなければならないのですが、<br />

<strong>Magic</strong> の 実 行 エンジンとしては、すでに「トランザクションは 開 始 された」という 状 態 になっていますので、<br />

「トランザクションのネストはできない」という 規 則 により、<strong>Magic</strong> はトランザクション 開 始 を 伝 達 しませ<br />

ん。<br />

このため、MS-<strong>SQL</strong> Server はトランザクションなしの 状 態 で 動 くことになります。この 状 態 では、 前 にも<br />

説 明 したとおり、 各 DML 文 ごとにトランザクションが 自 動 コミットされるモードなので、ロックがかから<br />

なくなってしまいます。 従 って、 排 他 制 御 に 問 題 がでてくることになります。<br />

バッチタスク「 自 動 価 格 変 更 」の 場 合 も、トランザクション 開 始 のタイミングが、バッチのデフォルトとし<br />

て、レコード 前 処 理 の 前 であるところが 異 なりますが、トランザクションなしで 動 作 するようになることは<br />

同 じで、 同 じく 排 他 制 御 の 問 題 が 起 こります。<br />

トランザクション 設 定 の 注 意 事 項 105


13. おわりに<br />

本 書 では、<strong>Magic</strong> の <strong>SQL</strong> 対 応 機 能 について、ペットショップデモを 題 材 に 説 明 してきました。<br />

<strong>SQL</strong> データベースとしてここでは MS-<strong>SQL</strong> Server を 例 にとって 説 明 してきましたが、 本 書 の 内 容 は 他 の<br />

<strong>SQL</strong> データベース(Oracle や DB2/UDB など)にも 応 用 が 利 くものです。<br />

<strong>SQL</strong> データベースを 使 ったプログラムを 設 計 ・ 開 発 する 上 で、 一 番 問 題 になるのはトランザクションの 利 用<br />

についてのことで、 本 書 では、Pervasvie から 移 行 してきた 開 発 者 が 一 番 ひっかかる 内 容 、すなわちトラン<br />

ザクションとロック 関 係 について 重 点 的 に 説 明 してきました。<br />

この 他 にも、トランザクションについては、テーブルレベルのロック、パフォーマンスとの 兼 ね 合 い、デー<br />

タベース 管 理 システムでのチューニングに 関 する 問 題 などいろいろなトピックがあるのですが、 本 書 の 範 囲<br />

を 超 えてしまうので、ここでは 扱 いません。<br />

また、<strong>Magic</strong> の <strong>SQL</strong> 対 応 機 能 として、 任 意 の DML 文 を 指 定 して 実 行 することのできる 埋 め 込 み <strong>SQL</strong> の 機<br />

能 や、 複 雑 な 条 件 文 を 指 定 できる <strong>SQL</strong> WHERE 句 、<strong>Magic</strong> 独 自 の 高 度 なトランザクション 機 能 である 遅 延<br />

トランザクションなどがありますが、これも 紙 面 の 都 合 で 割 愛 いたしました。<br />

これらのより 高 度 なトピックについては、 弊 社 のセミナーコース、 自 習 テキスト、サポートセンターの 技 術<br />

資 料 などではより 広 く 深 い 範 囲 で 扱 っておりますので、ぜひご 利 用 ください。<br />

<strong>SQL</strong> データベースは、 大 規 模 なエンタープライズ 基 幹 システムなどでは 必 ずといってよいほど 使 われるもの<br />

ですので、<strong>Magic</strong> の 持 つ <strong>SQL</strong> 対 応 機 能 を 十 分 に 生 かすことにより、システム 開 発 の 範 囲 が 大 きくひろがる<br />

ものと 確 信 しております。 今 後 とも、<strong>Magic</strong> <strong>eBusiness</strong> <strong>Platform</strong> <strong>V9Plus</strong> をご 愛 用 くださいますようお 願 い<br />

申 し 上 げます。<br />

106 おわりに


14. 参 考 資 料 : 移 行 時 の 注 意 事 項<br />

ここでは 参 考 情 報 として、Pervasive.<strong>SQL</strong>(リレーショナルアクセス) 対 応 のアプリケーションから、MS-<strong>SQL</strong><br />

対 応 アプリケーションに 移 行 するためのポイントをまとめました。 本 書 では 説 明 していない 機 能 も 多 数 出 て<br />

きますが、それらについてはリファレンスマニュアルやセミナーなどを 通 して 習 得 してください。<br />

参 考 資 料 : 移 行 時 の 注 意 事 項 107


14.1. テーブルリポジトリに 関 する 変 更<br />

14.1.1. デフォルト 値 の 違 い<br />

テーブルリポジトリとプログラムの 各 特 性 に 設 定 されるデフォルト 値 は、DBMS ごとに 細 かな 違 いがあり、<br />

それらは、テーブルリポジトリの 各 テーブルのデータベース 欄 の 設 定 時 、または 変 更 時 に 決 定 されます。こ<br />

れらはアプリケーションの 特 徴 によって、ユーザが 変 更 できるように 設 計 されていますが、 一 つひとつの 仕<br />

様 を 正 しく 理 解 せずに 変 更 すると、 意 図 した 動 作 が 行 われないことがあります。<br />

したがって、 最 初 にデータベースを 変 更 する 際 は、テーブルのデータベース 欄 を 一 つひとつ 変 更 していただ<br />

き、 必 要 に 応 じて 手 動 で 設 定 していただくことを 推 奨 いたします。<br />

14.1.2. DB テーブル<br />

Pervasive.<strong>SQL</strong> のデータベースは、テーブル 名 を 空 白 にしてもエラーになりませんが、MS-<strong>SQL</strong> のデータベ<br />

ースを 定 義 すると、テーブル 名 を 必 ず 定 義 する 必 要 があります。 更 にテーブル 名 は、MS-<strong>SQL</strong> のテーブル 名<br />

の 規 約 に 沿 って 命 名 する 必 要 があります。サイズはデータベース 名 、スキーマ 名 を 含 めて、128 バイトまで<br />

です。 使 用 できる 文 字 も 決 められており、 例 えば.(ドット)はスキーマ 名 とテーブル 名 の 区 切 文 字 として 認 識<br />

されるため、テーブル 名 に 含 めることはできません。すなわち「~.dat」という 名 前 は、すべて.を 除 く 必 要<br />

があります。 記 号 は@_$#が 使 用 できますが、 先 頭 に@,@@,#,##をつけると 特 別 な 意 味 がありますので、 通 常<br />

は 使 用 しないことをお 勧 めします。 更 に MS-<strong>SQL</strong> で 決 められた 予 約 語 (CHECK, ORDER など)も 避 ける 必 要<br />

があります。 詳 しくは、MS-<strong>SQL</strong> の <strong>SQL</strong> リファレンス 等 を 参 照 してください。 命 名 の 規 約 は、DB カラム<br />

名 、DB インデックス 名 にもあてはまります。<br />

14.1.3. テーブルの 存 在 チェック<br />

通 常 プログラムでテーブルアクセス 時 にテーブルが 存 在 しなかった 場 合 、 自 動 的 にテーブルを 作 成 します。<br />

MS-<strong>SQL</strong> データベースにアクセスするときには、これらの 処 理 のために SELECT コマンドと CREATE コ<br />

マンドを 発 行 しますが、アプリケーション 環 境 でテーブルが 存 在 することがわかっている 場 合 は、これらの<br />

処 理 はパフォーマンスを 劣 化 させる 原 因 になります。<br />

アクセス 時 に 作 成 を 行 う 必 要 がないテーブルに 対 しては、テーブル 特 性 のテーブル 存 在 チェックパラメータ<br />

を No にし、すべてのテーブルでその 必 要 がない 場 合 、データベース 特 性 のテーブル 存 在 チェックパラメー<br />

タを No にし、テーブル 存 在 チェックパラメータを[テーブル 特 性 に 依 存 ]とすることを 推 奨 します。<br />

逆 に 存 在 しないテーブルに 対 して、この 設 定 のままアクセスすると、MS-<strong>SQL</strong> からエラーが 返 りますので 注<br />

意 が 必 要 です。<br />

14.1.4. カラム/DB カラム 名<br />

Pervasive の 物 理 的 なテーブルにはカラムの 名 前 はありませんが、MS-<strong>SQL</strong> のテーブルには 存 在 します。テ<br />

ーブルリポジトリの 通 常 のカラムの 名 前 はアプリケーションの 中 だけで 有 効 な 名 前 であり、MS-<strong>SQL</strong> のテー<br />

ブルのカラム 名 は、[カラム 特 性 ]/[DB カラム 名 ]で 設 定 します。つまり、この DB カラム 名 は、MS-<strong>SQL</strong> の<br />

テーブルのカラム 名 に 対 応 するため、 両 者 に 相 違 があるか、MS-<strong>SQL</strong> のカラム 名 の 規 約 に 違 反 するか、1つ<br />

のテーブルで 同 じ 名 前 が 複 数 設 定 されていると 正 しくアクセスできません。<br />

また、 開 発 時 には 次 の3つの 場 合 、 自 動 的 にカラムの 名 前 が DB カラム 名 として 設 定 されます。(1) 新 規 に<br />

テーブルを 定 義 したとき (2) リポジトリ 入 力 したとき (3) Pervasive.<strong>SQL</strong> から MS-<strong>SQL</strong> に 変 更 したとき。<br />

したがってカラムの 名 前 が 規 約 に 違 反 していた 場 合 、 不 正 な DB カラム 名 が 設 定 されることがあるので、 確<br />

認 する 必 要 があります。<br />

14.1.5. カラム/カラムタイプ<br />

Pervasive.<strong>SQL</strong> からの 移 行 時 には 設 定 されませんが、あらかじめ 作 成 された MS-<strong>SQL</strong> テーブルを 利 用 する<br />

場 合 、あるいは 項 目 の 型 に 対 応 したカラムタイプ 以 外 のタイプを 利 用 する 場 合 、この 欄 に MS-<strong>SQL</strong> のカラム<br />

108 参 考 資 料 : 移 行 時 の 注 意 事 項


タイプを 指 定 します。<br />

14.1.6. 日 付 型 カラム<br />

Pervasive.<strong>SQL</strong> では、 内 部 では 数 値 のデータ(0001/01/01 を 基 点 とする 日 数 )ですが、デフォルトでは MS-<strong>SQL</strong><br />

の DATETIME タイプとして 定 義 されます。この 場 合 、 存 在 しない 日 付 (0000/00/00, 0000/01/01 など)がデ<br />

ータとして 格 納 できないため、システム 上 0000/00/00 等 を 日 付 データとして 利 用 している 場 合 は、 次 のよ<br />

うな 方 法 で 対 応 できます。<br />

1 カラムタイプに CHAR(8)と 記 述 して、アプリケーションでは 日 付 型 データ、MS-<strong>SQL</strong> のカラムでは<br />

CHAR 型 として 格 納 する。<br />

2 NULL 値 許 可 Yes として、NULL 計 算 値 に 0000/00/00 とする。<br />

ただし2の 場 合 、 NULL 値 としての 細 かな 仕 様 を 理 解 しておく 必 要 があります。(14.3.1「NULL 値 」(113<br />

ページ)を 参 照 してください)<br />

14.1.7. インデックス/ 仮 想 キーの 設 定<br />

Pervasive.<strong>SQL</strong> では 常 にデータファイルの 物 理 的 なキーとして 定 義 され、レコードの 位 置 情 報 を 管 理 してい<br />

ますが、MS-<strong>SQL</strong> では、テーブルとは 別 のオブジェクトとしてインデックスが 存 在 します。したがって、テ<br />

ーブルの 作 成 と 削 除 、あるいはレコードの 挿 入 と 削 除 を 頻 繁 に 行 うテーブルでは、インデックスが 多 いほど<br />

パフォーマンスに 影 響 します。したがって、アプリケーションで 使 用 するものの、 必 ずしも MS-<strong>SQL</strong> のイン<br />

デックスとして 必 要 ではないと 思 われるものは、[インデックス 特 性 ]/[タイプ]で 仮 想 キーに 設 定 します。<br />

それを 判 断 する 指 針 は 次 の 点 を 参 考 にしてください。<br />

• ユニー クインデックスに 設 定 されていないもの。またはインデックスの 重 複 チェックをアプリケーショ<br />

ンで 行 う 必 要 がないもの。<br />

• データ 数 が 少 ないもの。<br />

• そのインデックスを 使 う 処 理 が 高 いパフォーマンスを 必 要 としないもの<br />

• これらの 条 件 を 満 たすインデックスは、 [ インデックス 特 性 ]/[<br />

タイプ]で 仮 想 キーに 変 更 し、 既 にインデ<br />

ックスが 作 成 されている 場 合 は MS-<strong>SQL</strong> ツール 等 で 削 除 します。<br />

参 考 :<br />

仮 想 キーをプログラムのインデックスに 設 定 した 場 合 、<strong>Magic</strong> では 範 囲 や 位 置 付 処 理 、または 並 び 順 を 制 御<br />

する 際 に 生 成 される SELECT 文 は、 実 キーと 何 ら 変 わることはありません。 動 作 が 変 更 されるとすれば、<br />

MS-<strong>SQL</strong> サーバの 中 で、その <strong>SQL</strong> 文 を 解 析 して 結 果 を 返 すプロセスの 中 でインデックスを 使 わずに 実 行 さ<br />

れることです。 アプリケーションのパフォーマンスを 考 慮 する 場 合 には、MS-<strong>SQL</strong> のパフォーマンスチュー<br />

ニングの 手 法 を 習 得 した 上 でインデックスを 設 計 してください。<br />

14.1.8. DB インデックス 名<br />

MS-<strong>SQL</strong> のインデックスは、テーブルとは 別 のオブジェクトとして 管 理 されているため、テーブルやカラム<br />

と 同 様 の 注 意 が 必 要 です。インデックス 名 の 規 約 はテーブル 名 と 同 じです。 開 発 時 には 次 の3つの 場 合 、 自<br />

動 的 にインデックスの 名 前 が DB インデックス 名 として 設 定 されます。<br />

• 新 規 にテーブルを 定 義 したとき<br />

• リポジトリ 入 力 した とき<br />

• Pervasive.<strong>SQL</strong> から MS-<strong>SQL</strong> に 変 更 したとき。<br />

したがってインデックスの 名 前 が MS-<strong>SQL</strong> の 規 約 に 反 する 場 合 、 不 正 な DB インデックス 名 が 設 定 されるた<br />

め、 正 しくアクセスできませんので、インデックスの 名 前 と DB インデックス 名 を1つひとつ 確 認 する 必 要<br />

があります。また1つのテーブルの 中 で 同 じインデックス 名 が 重 ならないように 注 意 が 必 要 です。<br />

参 考 資 料 : 移 行 時 の 注 意 事 項 109


14.1.9. 重 複 不 可 インデックスの 定 義<br />

Pervasive.<strong>SQL</strong> では、テーブルに 重 複 不 可 インデックスがなくてもエラーは 起 こりませんが、MS-<strong>SQL</strong> デー<br />

タベースでは 最 低 1つ 重 複 不 可 インデックスが 必 要 です。このため、 重 複 不 可 になるカラムを 組 み 合 わせる<br />

か、 新 しいカラムを 追 加 して 新 たな 重 複 不 可 インデックスを 作 成 する 必 要 があります。<br />

参 考 :<br />

重 複 不 可 データを 自 動 作 成 する 方 法 として、カラムタイプに ... IDENTITY を 付 加 して、MS-<strong>SQL</strong> の<br />

IDENTITY を 利 用 することもできます。<br />

14.1.10. セグメントのサイズ<br />

Pervasive.<strong>SQL</strong> では、インデックス(キー)はレコードの 位 置 とサイズで 指 定 されるので、 文 字 型 項 目 の 場 合 、<br />

セグメントのサイズもテーブルリポジトリで 指 定 することができます。しかし、MS-<strong>SQL</strong> ではインデックス<br />

のセグメントは「カラム」の 集 まりなので「サイズ」は 必 ずカラムサイズと 同 じでなければなりません。も<br />

し、Pervasive.<strong>SQL</strong> のテーブル 定 義 で「サイズ」をカラムのサイズより 小 さくしている 場 合 、 修 正 する 必 要<br />

があります。<br />

14.1.11. 論 理 型 カラムのインデックス<br />

論 理 型 のカラムをインデックスのセグメント 項 目 として 定 義 されたテーブルはエラーになることがあります。<br />

これは、デフォルトの 論 理 型 のカラムは、MS-<strong>SQL</strong> の BIT タイプに 割 り 当 てられますが、BIT タイプはイ<br />

ンデックス 項 目 に 定 義 できないためです。これを 回 避 する 方 法 の1つは、[カラム 特 性 ]/[サイズ]を 2 に 変 更<br />

することです。これにより、 論 理 型 カラムが BIT タイプでなく SMALLINT タイプに 割 り 当 てられますので、<br />

インデックスのセグメント 項 目 に 設 定 することができます。<br />

14.1.12. 重 複 不 可 データのチェック<br />

Pervasive.<strong>SQL</strong> のテーブルでは 重 複 不 可 インデックスを 定 義 した 場 合 には、 実 行 時 に 重 複 したデータを 入 力<br />

した 場 合 、 無 条 件 に 重 複 エラーが 発 生 しましたが、MS-<strong>SQL</strong> ではエラーが 発 生 しなかったり、エラーの 発 生<br />

するタイミングが 異 なることがあります。<br />

仮 想 キーでは 重 複 エラーが 発 生 しない<br />

仮 想 キーは、アプリケーションの 中 だけの 定 義 であり、MS-<strong>SQL</strong> にユニークインデックスが 定 義 されていま<br />

せん。したがって MS-<strong>SQL</strong> のデータ 処 理 の 際 には 重 複 エラーが 発 生 しませんので、<strong>Magic</strong> アプリケーショ<br />

ンでもエラーを 発 生 させることができません。レコードの 修 正 時 や 登 録 時 に 重 複 データのチェックをプログ<br />

ラムで 行 わず、<strong>Magic</strong> の 機 能 でチェックする 場 合 は、 実 キーとして 定 義 する 必 要 があります。<br />

同 一 レコードのカラム 間 の 移 動 時 に 重 複 エラーが 発 生 しない<br />

Pervasive.<strong>SQL</strong> では、インデックスセグメントのカラムに 重 複 した 値 を 入 力 して、 次 のカラムに 移 動 した 直<br />

後 に 重 複 エラーが 発 生 しますが、MS-<strong>SQL</strong> のデフォルトの 設 定 では、すべてのカラムを 入 力 してレコードを<br />

格 納 する 直 前 にエラーが 発 生 します。これは、Pervasieve ではクライアントエンジンがあることを 想 定 して、<br />

カラム 間 の 移 動 時 に Pervasive.<strong>SQL</strong> エンジンに 重 複 データのチェックを 行 いますが、MS-<strong>SQL</strong> ではクライ<br />

アントサーバ 環 境 を 想 定 して、そのパフォーマンスの 劣 化 を 考 慮 し、サーバエンジンへの 余 計 な 重 複 データ<br />

のチェックを 抑 止 しているためです。<br />

パフォーマンスよりも、Pervasive.<strong>SQL</strong> と 同 等 の 動 作 を 優 先 する 場 合 は、[ 設 定 ]/[データベース]の MS-<strong>SQL</strong><br />

に 対 するデータベース 特 性 にある[データーベース 情 報 ]に CHECK_KEY=Y を 設 定 してください。<br />

110 参 考 資 料 : 移 行 時 の 注 意 事 項


14.2. プログラムに 関 する 変 更<br />

14.2.1. レコードアクセス<br />

レコードアクセス 処 理 に 関 して、Pervasive.<strong>SQL</strong> から MS-<strong>SQL</strong> にそのまま 移 行 すると、 次 のようなケース<br />

でエラーになることがあります。<br />

レコー ド 登 録 時 にテーブルが 存 在 しないとき<br />

「テーブルの 存 在 チェック」で 述 べたように、テーブルの 作 成 とレコードの 作 成 は 異 なるレベルの 処 理 です。<br />

存 在 しないテーブルに 対 してレコード 登 録 する 場 合 、テーブル 作 成 とレコード 作 成 の2つの 処 理 を 実 行 しな<br />

ければなりませんが、 次 の 場 合 、テーブル 作 成 が 行 うことができませんので、 実 行 環 境 を 確 認 する 必 要 があ<br />

ります。<br />

• 「テーブルの 存 在 チェック」が No の 場 合 。これは <strong>Magic</strong> の 設 定 を 変 更 します。<br />

• MS-<strong>SQL</strong> サーバの 権 限 により、サーバログオンユーザに CREATETABLE 権 限 がない 場 合 。これは<br />

CREATETABLE 権 限 を 付 与 するか、 許 可 されない 場 合 、あらかじめ 別 のアカウントで 作 成 しておきま<br />

す。<br />

• トランザクションが 開 始 されたプログラムからコールした 子 プログラムでテーブルを 作 成 しようとした<br />

場 合 。この 場 合 、トランザクションを 開 始 するタスクで 新 規 作 成 します。(トランザクションについては<br />

後 述 します。)<br />

レコード 登 録 時 にすべてのカラムがセレクトコマンドに 定 義 されていないとき<br />

テーブルに 定 義 されたすべてのカラムをセレクトコマンドとして 定 義 しないで、レコード 登 録 を 行 うプログ<br />

ラムでエラーになることがあります。 <strong>Magic</strong> では、レコード 登 録 を 行 う Insert 文 を 生 成 する 際 、セレクト<br />

コマンドに 定 義 されたカラムのみ 付 加 されるため、それ 以 外 のカラムに 対 して、MS-<strong>SQL</strong> が NULL 値 、あ<br />

るいはデータベースデフォルト 値 を 格 納 しようとします。Pervasive.<strong>SQL</strong> から 移 行 したテーブル 定 義 のデフ<br />

ォルトの 状 態 では、どちらも 許 可 されていないためにエラーが 発 生 します。これを 解 決 するためには、 次 の<br />

いずれかの 変 更 を 行 います。<br />

• レコード 登 録 を 行 うプログラムで、すべてのカラムをセレクトコマンドに 定 義 する。<br />

• [カラム 特 性 ]/[NULL 値 可 ]を Yes に 変 更 して、 物 理 テーブルの 定 義 を 変 更 する。(NULL 値 可 のカラム<br />

について、 下 記 「NULL 値 」を 参 照 してください。)<br />

• [カラム 特 性 ]/[データベースデフォルト 値 ]に 任 意 の 値 を 設 定 して、 物 理 テーブルの 定 義 を 変 更 する。<br />

[タスク 環 境 ]/[DB テーブル]/[ 式 ]でテーブル 名 を 設 定 しているとき<br />

テーブル 名 は MS-<strong>SQL</strong> の 規 約 にあったテーブル 名 に 変 更 する 必 要 があります。<br />

14.2.2. ロックとトランザクション<br />

ロック<br />

Pervasive.<strong>SQL</strong> ではトランザクションの 設 定 を 行 わずにアプリケーションの 作 成 できますが、MS-<strong>SQL</strong> の 場<br />

合 は、MS-<strong>SQL</strong> でレコードロックを 行 う 場 合 、 必 ずトランザクション 処 理 を 開 始 する 必 要 があるため、トラ<br />

ンザクションを 常 に 考 慮 する 必 要 があります。したがって、[タスク 特 性 ]/[ロック 方 式 ]が「 入 力 時 」の 場 合 、<br />

同 じダイアログにある[トランザクション 開 始 ]が 入 力 時 より 前 の 時 期 に 設 定 することが 基 本 です。ロックト<br />

ランザクションに 関 するその 他 の 詳 細 はリファレンスマニュアルの「13 章 データ 管 理 」を 参 照 してくださ<br />

い。<br />

参 考 資 料 : 移 行 時 の 注 意 事 項 111


トランザクション<br />

複 数 のタスクで 構 成 されたプログラムでは、トランザクションの 設 定 によっては、 予 期 しないエラーが 発 生<br />

したり、 正 しくデータ 更 新 やロールバックが 行 われないことがあります。このようなことを 未 然 に 防 ぐため、<br />

トランザクション 設 定 のポイントを以 下 に 挙 げます。<br />

• 「 物 理 」と「 遅 延 」のどちらか 一 方 のトランザクションモードにあわせる: 既 存 のアプリケーションを<br />

移 行 する 場 合 は、 同 じモードが 引 き 継 がれますが、 新 規 作 成 のデフォルトではオンラインタスクが「 遅<br />

延 」、バッチタスクが「 物 理 」に 設 定 されます。このままオンラインとバッチを 組 み 合 わせてプログラム<br />

を 構 成 すると、これらのモードが 混 在 してしまうことがあります。この 場 合 、「 物 理 」のタスクから「 遅<br />

延 」のタスクをコールするとエラーになりますので、どちらかのモードにあわせることが 必 要 です。<br />

• トランザクションの 開 始 と 終 了 (コミット)、およびネストを 把 握 する: タスクの 構 成 が 複 雑 な 場 合 は、<br />

次 のような 順 序 でプログラムを 確 認 して、トランザクションの 開 始 と 終 了 がいつ 行 われるかを 確 認 しま<br />

す。<br />

• 親 のプログラムの DB テーブルの 設 定 とトランザクション 開 始 と 終 了 を 確 認 します。DB テーブルの 設<br />

定 がないと、トランザクションの 開 始 が 行 われないことも 考 慮 します。<br />

• プログラムの 中 のコールタスクおよびコールプログラムを 確 認 し、それらがトランザクションの 開 始 前<br />

なのか、トランザクションの 中 なのか、トランザクションの 終 了 後 なのかを 確 認 します。 例 えば、 親 が<br />

レコード前 処 理 に 開 始 した 場 合 、タスク 前 処 理 テーブルのコールコマンドでのタスクは 独 立 した 別 のト<br />

ランザクションとして 処 理 されますが、レコード 前 処 理 のタスクは 親 と 同 じトランザクションの 中 で 処<br />

理 されます。 更 に、ユーザイベントハンドラの 処 理 テーブルの 場 合 は、デフォルトでは 同 じトランザク<br />

ションの 中 で 処 理 されますが、イベントの[ 強 制 終 了 ]パラメータが「レコード」の 場 合 はレコード 後 処<br />

理 の 後 でコールコマンドが 実 行 されます。これによりトランザクションが 終 了 (コミット)してから、コ<br />

ールプログラムが 実 行 されることがありますので、 特 に 注 意 が 必 要 です。<br />

• トランザクション 中 にコールされるタスクのトランザクションモードおよび 開 始 パラメータにより、そ<br />

の 中 でデータベースへの 更 新 が 子 の 終 了 時 か、 親 の 終 了 時 かを 確 認 する。<br />

• トランザクションの 開 始 前 、および 終 了 後 にコールされるタスクが、 親 のトランザクションとは 独 立 し<br />

たトランザクションであることを 確 認 する。<br />

14.2.3. 関 数<br />

データベース 処 理 を 行 う 次 のような 関 数 の 処 理 は 確 認 が 必 要 です。<br />

• IO 関 数 (IODEL など)によって、Pervasive.<strong>SQL</strong> のテー ブルを 操 作 している 場 合 、DB 関 数 に 置 き 換 え<br />

るなどの 変 更 が 必 要 です。<br />

• DB 関 数 (DBDEL など)で 第 2 引 数 にファイル 名 を 指 定 している 場 合 、MS-<strong>SQL</strong> のテーブル 名 への 変 更<br />

が 必 要 です。<br />

• OS コマンドや<br />

CALL UDF、CALLDLL などによって、Pervasive.<strong>SQL</strong> のユーティリティを 実 行 してい<br />

る 場 合 は、 処 理 を 検 討 する 必 要 があります。<br />

112 参 考 資 料 : 移 行 時 の 注 意 事 項


14.3. その 他 の 違 い<br />

14.3.1. NULL 値<br />

Pervasive.<strong>SQL</strong> ではカラムにスペースや 0 を 挿 入 すると、 常 に 20h や 0 を 格 納 しますが、MS-<strong>SQL</strong> では NULL<br />

値 としてデータを 処 理 することができます。NULL 値 の 格 納 を 許 可 するか 否 かはテーブル 作 成 時 に 決 められ<br />

ます。<strong>Magic</strong> でテーブルを 作 成 する 場 合 、カラム 特 性 の NULL 値 可 パラメータで 制 御 できます。 更 にこの<br />

パラメータのデフォルトは[ 設 定 ]/[DBMS]の NULL パラメータで 制 御 されます。<br />

NULL 値 可 Yes のカラムは、レコード 登 録 時 に 格 納 する 値 がないときにはセレクトコマンドとして 定 義 する<br />

必 要 がない、データベースに 余 計 な 領 域 を 確 保 しない、などのメリットがあります。しかしながら、 次 のよ<br />

うな動 作 の 違 いが 発 生 することがありますので、 十 分 な 検 討 が 必 要 です。<br />

• セレクトコマンドの 範 囲 や 位 置 付 けに 0 や''(スペース)を 設 定 していた 場 合 、NULL 値 のデータがこの 条<br />

件 に 満 たさないので、 今 まで 行 われたレコードの 処 理 が 行 われないことがあります。<br />

• ( 数 値 項 目 )=0、( 文 字 項 目 )='' などの 定 義 式 の 結 果 が、 項 目 が NULL 値 の 場 合 に'FALSE'LOG が 返 りま<br />

す。<br />

• ( 数 値 項 目 )+1、( 文 字 項 目 )&'*' などの 定 義 式 の 結 果 が、1 や'*'でなく、NULL 値 が 返 ることがあります。<br />

• NULL 値 を 含 むカラムで 構 成 されたインデックスで 絞 込 みをしたバッチ 処 理 のパフォーマンスが 相 対<br />

的 に 悪 くなります。<br />

14. 3.2. ソート 順 について<br />

MS- <strong>SQL</strong> のデフォルトのデータベース 設 定 では、 照 合 順 序 (ソート 順 )について、 大 文 字 と 小 文 字 、ひらが<br />

なとカタカナの 区 別 がありません。したがって 異 なる 文 字 種 の 範 囲 大 小 で 絞 り 込 むと、Pervasive.<strong>SQL</strong> とは<br />

異 なるデータが 取 得 されることがあります。これを 回 避 して Pervasive.<strong>SQL</strong> と 同 じ 動 作 にするには、<br />

MS-<strong>SQL</strong> のデータベースの 照 合 順 序 を「バイナリ 順 」に 変 更 します。<br />

参 考 資 料 : 移 行 時 の 注 意 事 項 113


<strong>Magic</strong> <strong>eBusiness</strong> <strong>Platform</strong> <strong>V9Plus</strong><br />

チュートリアル <strong>SQL</strong> 編<br />

Copyright © 2005, <strong>Magic</strong> Software Japan K.K., All rights reserved.<br />

第 1 版<br />

発 行<br />

2005 年 12 月 31 日<br />

〒151-0053 東 京 都 渋 谷 区 代 々 木 三 丁 目 二 十 五 番 地 三 号<br />

あいおい 損 保 新 宿 ビル14 階<br />

マジック ソフトウェア ジャパン ( 株 )<br />

http://www.magicsoftware.co.jp/

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!