5.DB2編
ODBC用データプロバイダ「System.Data.Odbc」を使用したDB2 DBへのアクセスについて解説を行います。ODBC、DB2についてはWikipediaなどを参照してください。
「System.Data.Odbc」はODBCドライバマネージャを必要とします。本稿では「unixODBC」を使用します。また、DB2用ODBCドライバが必要です。
セットアップ
ゲストOS側で動作確認用DB2 DBを作成します。ホストOS側で使用するODBC用データプロバイダ「System.Data.Odbc」はアセンブリ「System.Data.dll」に含まれています。
「DB2 Express-C」は、DB2 Express-Cのダウンロードページから「DB2 Express-C *.* for Linux」(「*.*」はVLで、現在は「9.7」)のリンクを選択し、「DB2 Express-C *.* for Linux 32-bit」(db2exc_***_LNX_x86.tar.gz)、「DB2 National Language Pack *.* for Linux 32-bit」(db2exc_nlpack_***_LNX_x86.tar.gz)をダウンロードして、インストールします。
「DB2 Express-C 9.5.2」は、既にダウンロードが不可能で、現時点(2009.08.18)では「DB2 Express-C 9.7」がダウンロード可能となっています。「DB2 Express-C 9.7」を使用する場合は、下記の「補足2」を読んでください。
MonoではDB2用データプロバイダ「IBM.Data.DB2」が提供されていますが、既にメンテナンス対象外であり、また実際使用してみると例外が発生し、うまくいきません。そこで本稿ではODBC用データプロバイダ「System.Data.Odbc」を使用してDB2 DBへアクセスを行います。
「unixODBC」は、Ubuntuのパッケージ管理システムから導入可能です。
$ sudo apt-get install unixodbc
DB2用ODBCドライバは、「IBM Data Server Client」に含まれているものを使用しました。本稿では、DB2 Version 9.5 fix packs & client downloads for 32 bit Linux operating systems on 32-bit Intel and AMD systems (x86)から、[V9.5 Fix Pack 3b for Linux (32 bit, Intel)]-[IBM Data Server Client](v9.5fp3b_linuxia32_client.tar.gz)および[DB2 National Language Package](v9.5fp3b_linuxia32_nlpack.tar.gz)をダウンロードしてインストールを行いました。
「DB2 Express-C」のダウンロードの際、IBM IDの登録が必要になります。また、「DB2 National Language Pack *.* for Linux 32-bit」は各国語用言語パックですので、動作確認で必須というわけではありません。「IBM Data Server Client」においても、各国語用言語パックは必須ではありません。
「DB2 9.7」がリリースされたのに伴い、「DB2 Express-C」のバージョンも9.7にアップされました!9.7を同様の環境にインストールし、動作確認を行いましたが、問題はありませんでした。また、後述する、リモート接続時の不具合対応は9.7では不要です。
DB2 DBの準備
ゲストOS側で動作確認用DB(TestData)を作成します。「db2」コマンドを使用したDB操作を行います。
DB2 Express-Cのインストールについて
DB2 Express-Cではいくつかのインストール方法が用意されています。IBM DB2 Database for Linux, UNIX, and Windows インフォメーション・センター内の「DB2 のインストール方式」を参考にして下さい。
また、インストール前に以下の対応をすることをお勧めします。
... # here are the per-package modules (the "Primary" block) # password [success=1 default=ignore] pam_unix.so obscure sha512 password [success=1 default=ignore] pam_unix.so obscure sha256 ...
ホストOS側からリモート接続を試みた場合、
SQL30082N セキュリティー処理は、理由 "15" ("PROCESSING FAILURE") により失敗しました。 SQLSTATE=08001
というエラーが発生します。その原因はUbuntuのパスワード処理で使用しているハッシュ関数にあるようです。そこで、ゲストOS側の「/etc/pam.d/common-password」を編集し、ハッシュ関数をSHA512からSHA256かMD5に変更する必要があります。インストール後に対応した場合は、リモート接続で使用するユーザーのパスワードを再設定する必要があります(ここでいうパスワードとはゲストOSのユーザアカウントに設定されているパスワードのことです)。
以下、主なDB操作をDB2インスタンス所有者(db2inst1)で行います。
SQLファイルの準備
「/home/db2inst1/src/sql」に以下のDB、スキーマ、テーブル作成用および権限付与のためのSQLファイルを用意します。
-- db2 -tvf ~/src/sql/TestData.sql -- -- 区切り文字としてセミコロン「;」を使用しない場合: -- db2 -vf ~/src/sql/TestData.sql -- -- データベース削除 -- drop database TestData; -- データベース作成 create database TestData on '/home/db2inst1/data/testdata' using codeset UTF-8 territory JP; terminate;
-- db2 -tvf ~/src/sql/schema4TestData.sql -- -- 区切り文字としてセミコロン「;」を使用しない場合: -- db2 -vf ~/src/sql/schema4TestData.sql -- connect to TestData; -- EXAMPLE_SCM スキーマ削除 -- drop schema EXAMPLE_SCM restrict; -- EXAMPLE_SCM スキーマ作成 create schema EXAMPLE_SCM; terminate;
-- db2 -tvf ~/src/sql/Products.sql -- -- 区切り文字としてセミコロン「;」を使用しない場合: -- db2 -vf ~/src/sql/Products.sql -- -- データベース接続 connect to TestData; -- -- Products テーブル削除 -- drop table EXAMPLE_SCM.Products; -- Products テーブル作成 create table EXAMPLE_SCM.Products( ProductID integer not null primary key, ProductName varchar(25) not null, Price decimal(7, 2), ProductDescription varchar(128)); -- INSERT 実行 insert into EXAMPLE_SCM.Products (ProductID, ProductName, Price, ProductDescription) values (0, 'DB2', null, 'DB2 Express-C 9.5.2'); -- INSERT 実行 insert into EXAMPLE_SCM.Products (ProductID, ProductName, Price, ProductDescription) values (1, 'Clamp', 12.48, 'Workbench clamp'); -- INSERT 実行 カラムの順番を変えたパターン insert into EXAMPLE_SCM.Products (ProductName, ProductID, Price, ProductDescription) values ('Screwdriver', 50, 3.17, 'Flat head'); -- INSERT 実行 カラムリスト指定なし、入力値リストはカラム順パターン insert into EXAMPLE_SCM.Products values (75, 'Tire Bar', null, 'Tool for changing tires.'); -- INSERT 実行 ProductDescription カラムの指定なしパターン insert into EXAMPLE_SCM.Products (ProductID, ProductName, Price) values (3000, '3mm Bracket', .52); -- UPDATE 実行 update EXAMPLE_SCM.Products set ProductName = 'Flat Head Screwdriver' where ProductID = 50; -- SELECT 実行 確認用 select * from EXAMPLE_SCM.Products; terminate;
-- db2 -tvf ~/src/sql/grant4TestData.sql -- -- 区切り文字としてセミコロン「;」を使用しない場合: -- db2 -vf ~/src/sql/grant4TestData.sql -- connect to TestData; -- 権限の付与 grant DBADM on DATABASE to USER sta; terminate;
インスタンス起動
$ su - db2inst1 $ db2start
停止は
$ db2stop
データベース作成
$ mkdir -p ~/data/testdata $ db2 -tvf ~/src/sql/TestData.sql
スキーマ作成
$ db2 -tvf ~/src/sql/schema4TestData.sql
テーブル作成
$ db2 -tvf ~/src/sql/Products.sql
権限の付与
ユーザー(sta)に権限(例:DBADM)を付与します。
$ db2 -tvf ~/src/sql/grant4TestData.sql