Trouble Shooting Record (PostgreSQL 関連)


1. 自分が Owner の DB/table にアクセスしているのに Permission denied. [解決]

環境

Kernel 2.2.17 (Slackware 7.0)
PostgreSQL 7.0.2

現象

以下のような SQL ファイル (test1.sql) を用意する。 ここで foo はデータベース test の Owner である。 Apache からアクセスすることを想定して nobody ユーザに権限を与えている。
DROP TABLE test;
CREATE TABLE test (id INT);

GRANT ALL ON test TO nobody;

INSERT INTO test VALUES(1);
SELECT * FROM test;

これを psql から実行すると Permission denied. 自分が Owner の DB に自分で作成した table なのに何故? GRANT を実行しない場合は問題なし。
$ psql test -f test1.sql
DROP
CREATE
CHANGE
psql:test1.sql:8: ERROR:  test: Permission denied.
psql:test1.sql:9: ERROR:  test: Permission denied.

解決方法

以下のように自分にも権限を与えると OK 。PostgreSQL ってこういうもん?
DROP TABLE test;
CREATE TABLE test (id INT);

GRANT ALL ON test TO foo;        <--- 追加
GRANT ALL ON test TO nobody;

INSERT INTO test VALUES(1);
SELECT * FROM test;
[ 先頭 | 末尾 | 戻る | トップページに戻る ]

2. テーブルが存在するのに Relation 'xxxxxxx' does not exist [解決]

環境

Plamo Linux 2.2.1 (Kernel 2.2.19 + glibc 2.2)
PostgreSQL 7.1.3

現象

ServerList という名前のテーブルを作成し、SELECT でアクセスしようとすると、 以下のようにエラーが表示されて、アクセスできない。
$ psql test
test=# \d
       List of relations
    Name     | Type  |  Owner   
-------------+-------+----------
 ServerList  | table | postgres
(1 rows)

test=# select * from ServerList;
ERROR:  Relation 'serverlist' does not exist

解決方法

テーブル名を "" で囲って指定すれば OK 。
# 予約語を使う場合は、"" で囲えというのは知っていたけれど、ServerList って 予約語なのか??
(例) select * from "ServerList";
[ 先頭 | 末尾 | 戻る | トップページに戻る ]

3. Shift-JIS で書き込んでしまったテーブルをアクセスするには? [解決]

環境

Plamo Linux 2.2.1 (Kernel 2.2.19 + glibc 2.2)
PostgreSQL 7.1.3

現象

MS Access からテーブル名を Shift-JIS で書いてしまった。
# 何でこんな事になってしまったのかは謎 (調査中) (^^;
$ psql test
test-# \d
       List of relations
    Name     | Type  |  Owner   
-------------+-------+----------
 vpeB  | table | postgres       <---- ほんとは「プロパティ」というテーブル名
(1 rows)

端末 (Kterm) の文字コードを Shift-JIS にすれば \d でちゃんと表示はできるが、 select などでアクセスできない。
test-# select * from vpeB;
ERROR:  parser: parse error at or near "q"
test=# select * from プロパティ;
ERROR:  Relation 'プロパティ' does not exist
test=# select * from "プロパティ";
ERROR:  Relation 'プロパティ' does not exist

解決方法

一度、データベースを dump してからリストアすると、 EUC-JP で (正確には指定の文字コードで) テーブル名およびテーブル内のデータが書き直されて、無事復旧〜。
$ pg_dump test > test.dump
$ nkf -e test.dump > test.dump.euc
$ dropdb test
$ createdb test
$ psql test < test.dump.euc
[ 先頭 | 末尾 | 戻る | トップページに戻る ]