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
