
DB2でさくさく実現するRESTfulなDBアプリ(2)
Railsでレガシーデータを蘇えらせるテクニック
ケース2:レガシー表に主キー列に相当する列が存在するが、SMALLINT型の場合
ibm_dbドライバでは、SMALLINT型の列はboolean型にマッピングされています。そのため、そのまま表示すると「true」や「false」のように表示されてしまいます。
この場合、ビュー作成時にINTEGER型にキャストします。ID生成列の定義については、SMALLINT型に対しても追加できます。サンプルデータベースのact表を例に説明します。act表は、リスト6のような定義の表です。
C:\Program Files\IBM\SQLLIB\BIN>db2 describe table act
Data type Column Column name schema Data type name Length Scale Nulls --------------------- --------- ------------------- ---------- ----- ------ ACTNO SYSIBM SMALLINT 2 0 いいえ ACTKWD SYSIBM CHARACTER 6 0 いいえ ACTDESC SYSIBM VARCHAR 20 0 いいえ
3 レコードが選択されました。
「ACTNO」という名前のSMALLINT型の列が使用されています。act表に対しては、サンプル8のようにINTEGER型にキャストしてビューを作成します。
ACTKWD,ACTDESC FROM ACT
この例の場合、ビューの元表がSMALLINT型であるため、ID列にSMALLINT型の制限値である32768より大きな値が生成された際にエラーとなるため、注意が必要です。
ケース3:レガシー表に主キー列に相当する列が存在しない、もしくは存在してもCHAR型やVARCHAR型の場合
主キーとなる列に文字やハイフン(-)などが含まれる場合、CHAR型やVARCHAR型にマッピングされているケースも多く見られます。このような場合、ID生成列を付与した新しい表を作成し、データを移動(ロード)することで対応します。
サンプルのdepartment表を例に説明します。department表はリスト7のような定義の表です。
C:\Program Files\IBM\SQLLIB\BIN>db2 describe table department
Data type Column Column name schema Data type name Length Scale Nulls --------------------- --------- ------------------- ---------- ----- ------ DEPTNO SYSIBM CHARACTER 3 0 いいえ DEPTNAME SYSIBM VARCHAR 36 0 いいえ MGRNO SYSIBM CHARACTER 6 0 はい ADMRDEPT SYSIBM CHARACTER 3 0 いいえ LOCATION SYSIBM CHARACTER 16 0 はい
5 レコードが選択されました。
deptno列はCHARACTER型の列のため、ID生成列とすることができません。そこで、次のようにして、表の作成、データのロードを行います。表の作成後は、「id」という名前の主キー列のある表としてActiveRecordでアクセスできます。
DB20000I SQL コマンドが正常に完了しました。
C:\Program Files\IBM\SQLLIB\BIN>db2 DECLARE MYCURSOR CURSOR FOR SELECT * FROM DEPARTMENT
DB20000I SQL コマンドが正常に完了しました。
C:\Program Files\IBM\SQLLIB\BIN>db2 LOAD FROM MYCURSOR OF CURSOR INSERT INTO DEPARTMENTS (DEPTNO,DEPTNAME,MGRNO,ADMRDEPT,LOCATION)
NONRECOVERABLE
SQL3501W 順方向リカバリーがデータベースに対して使用できないため、表が存在する表
スペースが、バックアップ・ペンディング状態に置かれません。
SQL1193I ユーティリティーは、SQL ステートメント " SELECT * FROM DEPARTMENT"
からのデータのロードを開始しています。
SQL3500W ユーティリティーが "2008-10-12 19:34:43.696352" に "LOAD"
フェーズを開始しています。
SQL3519W ロード整合点が開始されました。 入力レコード・カウント = "0"
SQL3520W ロード整合点が成功しました。
SQL3110N ユーティリティーが処理を完了しました。 "14"
行が、入力ファイルから読み取られました。
SQL3519W ロード整合点が開始されました。 入力レコード・カウント = "14"
SQL3520W ロード整合点が成功しました。
SQL3515W ユーティリティーは、"2008-10-12 19:34:43.813105" に "LOAD"
フェーズを完了しました。
読み込まれた行数 = 14
スキップされた行数 = 0
ロードされた行数 = 14
拒否された行数 = 0
削除された行数 = 0
コミットされた行数 = 14
C:\Program Files\IBM\SQLLIB\BIN>
読み込み専用の表としてアクセスさせたい場合
ActiveScaffoldのカスタマイズにより、「Show」以外のメニューを非表示にすることができます。こうすることで、レガシー表を全く変更できない(してはいけない)場合など、前述の方法のようにID列の定義を追加せずに、Create、Update、Deleteを制限することで読み込み専用の表示とすることも可能です。
app\controllersの下にあるdepartments_controller.rbをサンプル9のように編集します。
class DepartmentsController < ApplicationController active_scaffold :department do |conf| conf.actions.exclude :update, :delete, :create end layout "activescaffold" end
サーバを再起動後、Webブラウザで確認します(図3)。

![]() |
3/4 | ![]() |
Railsでレガシーデータを蘇えらせるテクニック
・ActiveRecordを使ったマッピング
ActiveRecordが備える機能|ActiveRecordで表を作成する|DB2での主キーの扱い
レガシー表に主キー列に相当するINTEGER型やBIGINT型の列が存在する場合
レガシー表の内容を確認|主キー列をID生成列に変更する|主キー列と表の名前をRails規約に一致させる2つの方法

レガシー表に主キー列に相当する列が存在するがMALLINT型の場合
ケース3:
レガシー表に主キー列に相当する列が存在しない、もしくは存在してもCHAR型やVARCHAR型の場合
コラム:読み込み専用の表としてアクセスさせたい場合
・まとめ
![]() |
DB2でさくさく実現するRESTfulなDBアプリ |
- Oracleライセンス「SE2」検証 CPUスレッド数制限はどんな仕組みで制御されるのか (2017/7/26)
データベース管理システムの運用でトラブルが発生したらどうするか。DBサポートスペシャリストが現場目線の解決Tipsをお届けします。今回は、Oracle SE2の「CPUスレッド数制限」がどんな仕組みで行われるのかを検証します - ドメイン参加後、SQL Serverが起動しなくなった (2017/7/24)
本連載では、「SQL Server」で発生するトラブルを「どんな方法で」「どのように」解決していくか、正しい対処のためのノウハウを紹介します。今回は、「ドメイン参加後にSQL Serverが起動しなくなった場合の対処方法」を解説します - さらに高度なSQL実行計画の取得」のために理解しておくべきこと (2017/7/21)
日本オラクルのデータベーススペシャリストが「DBAがすぐ実践できる即効テクニック」を紹介する本連載。今回は「より高度なSQL実行計画を取得するために、理解しておいてほしいこと」を解説します - データベースセキュリティが「各種ガイドライン」に記載され始めている事実 (2017/7/20)
本連載では、「データベースセキュリティに必要な対策」を学び、DBMSでの「具体的な実装方法」や「Tips」などを紹介していきます。今回は、「各種ガイドラインが示すコンプライアンス要件に、データベースのセキュリティはどのように記載されているのか」を解説します
![]() |
|
|
|
![]() |