2007/04/20

DB2 Express-Cをためす

無償版のDB2が配付されていたので、とりあえずLinux amd64版を導入してみました。
CentOS4にはPostgreSQL v7.4が導入されているので、テストのためにDB2とPostgreSQLの両方で/etc/passwdの内容を取りこむようなテーブルを作成しました。

CREATE TABLE UNIX_USER (
        USER VARCHAR(10) NOT NULL,
        UID     INT,
        GID     INT,
        GECOS   VARCHAR(36),
        HOME    VARCHAR(36),
        SHELL   VARCHAR(36)
);
このテーブル定義はPostgreSQLの方では"USER"の所でエラーになり実行できなかったものの、DB2ではテーブルの作成は問題なく実行できました。 理由は置いておいて、DB2側ではそのまま突き進んでみます。

DB2では/etc/passwdを':'でsplitして、テーブルに入れるところも問題なく…

$ db2 "select * from unix_user" | head
USER       UID         GID         GECOS                      HOME                  SHELL
---------- ----------- ----------- -------------------------- --------------------- ----------------------
root                 0           0 root                       /root                 /bin/bash
...
問題はここからで、先頭のUSERフィールドだけ抜きだそうとすると、同じ名前が延々出力されてしまいます。
$ db2 "select user from unix_user" | head
1 
-------------------------------------------------------------------------------------------------------
DB2INST2 
DB2INST2 
DB2INST2 
結局USERはSQLの中では実行ユーザーを指すので、参照したテーブルの行数分だけSQLを発行したユーザー名を標示してしまったのでした。

回避する方法は基本的には次のような感じになるのかなぁ。

$ db2 "select A.user from unix_user A"
PostgreSQLの方では'USER'をテーブルの列名にできなかったから、'NAME'のように別の名前にしなければいけないだろう。
もしSQL実行ユーザーの情報を抜きだしたいと思ったら、
select * from unix_user where name = user
のようにwhere節で指定することや、'select'直後の表示する列名に指定することができる。

大して重要なところじゃないけれどね。 問題はDBMSの使い方の方かな。

0 件のコメント: