無償版の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 件のコメント:
コメントを投稿