Magic eBusiness Platform V9Plus ãã¥ã¼ããªã¢ã« SQL ç·¨
Magic eBusiness Platform V9Plus ãã¥ã¼ããªã¢ã« SQL ç·¨
Magic eBusiness Platform V9Plus ãã¥ã¼ããªã¢ã« SQL ç·¨
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/