kuniku’s diary

はてなダイアリーから移行(旧 d.hatena.ne.jp/kuniku/)、表示がおかしな箇所はコメントをお願いします。記載されている内容は日付およびバージョンに注意してください。直近1年以上前は古い情報の可能性が高くなります。

Windows版postgreSQLでのTABLESPACE(テーブルスペース)定義

Windwos版では、テーブルスペースは作成できないのか?

postgres=# create tablespace tblspace1 location 'D:\postgreSQL\data';
ERROR:  tablespace location must be an absolute path
postgres=#
postgres=# create tablespace tblspace1 OWNER postgres location 'D:\postgreSQL\data';
ERROR:  tablespace location must be an absolute path
postgres=#

PostgreSQLメーリングリスト
http://ml.postgresql.jp/pipermail/pgsql-jp/2006-August/021031.html
を拝見すると

Postgresユーザに書きこみ権限がないがための
現象でした。岡野さんからご教授いただいた手順で
権限を与えてみたら、テーブルスペースを
作成することが出来ました。

とあるから、できるように思う。
でも、D:\postgreSQL\data のドライブ、ディレクトリにすべて
postgresユーザに対して、フルアクセスコントロールを付与したけど
同じエラーになるんだよな〜。なんでだろ。

caclsコマンドで権限を確認すると問題ないように思えるのだが

D:\>cacls D:\
D:\ BUILTIN\Administrators:(OI)(CI)F
    CREATOR OWNER:(OI)(CI)(IO)F
    Everyone:R
    PC名\postgres:(OI)(CI)F


D:\postgreSQL>cacls .
D:\postgreSQL BUILTIN\Administrators:(OI)(CI)F
              CREATOR OWNER:(OI)(CI)(IO)F
              PC名\\postgres:(OI)(CI)F

D:\postgreSQL\data>cacls .
D:\postgreSQL\data PC名\\postgres:(OI)(CI)F
                   BUILTIN\Administrators:(OI)(CI)F
                   CREATOR OWNER:(OI)(CI)(IO)F
                   NT AUTHORITY\SYSTEM:(OI)(CI)F

http://mlog.euqset.org/archives/pgsql-jp.ml.postgresql.jp/38599.html
http://mlog.euqset.org/archives/pgsql-jp.ml.postgresql.jp/38560.html
http://mlog.euqset.org/archives/pgsql-jp.ml.postgresql.jp/38601.html
上記の内容を見ると、パスの記述の仕方がよくない模様。
¥マーク(実際は半角)をスラッシュ/(実際は半角)に変更すると
実行できる。(なお、バックスラッシュではない)

postgreSQLのインストールした箇所と同一のディレクトリで試してみた

postgres=# create tablespace tblspace1 location 'C:/Program Files/PostgreSQL/8.1/test_tablespace';
CREATE TABLESPACE

問題だった、'D:\postgreSQL\data' でも実行してみた。

postgres=# create tablespace d_tblspace location 'D:/PostgreSQL/data';
CREATE TABLESPACE

できた。

実際に、作成したテーブルスペースを使ってテーブルを作成

-- Table: test_tblspace

-- DROP TABLE test_tblspace;

CREATE TABLE test_tblspace
(
  id serial NOT NULL
) 
WITHOUT OIDS TABLESPACE d_tblspace;
ALTER TABLE test_tblspace OWNER TO postgres;

システム情報でテーブルとテーブルスペースを確認

 select relname,spcname 
 from pg_class left join pg_tablespace on 
  pg_class.reltablespace = pg_tablespace.oid 
 where spcname='d_tblspace';

結果

relname spcname
test_tblspace d_tblspace