[pgsql-jp: 29544] Re: sequenceオブジェクトについて

M.Yuasa mkys @ gray.plala.or.jp
2003年 4月 1日 (火) 23:51:44 JST


----- Original Message ----- 
From: "ISHIDA Akio" <iakio @ pjam.jpweb.net>
To: <pgsql-jp @ ml.postgresql.jp>
Sent: Tuesday, April 01, 2003 11:02 AM
Subject: [pgsql-jp: 29534] Re: sequenceオブジェクトについて

湯浅です。
ご返信ありがとうございます。

ご指摘の通り、
> SELECT pg_catalog.setval ('test_seq', 1, true);
がらみでした。
このSQLでsequenceオブジェクトのis_called項目に't'/'f'を設定して、last_value項目の
振る舞い?を決めているんですね。
Postgresは6.5から使用してますが、恥ずかしながら初めて知りました。

今回直接の問題となったのはpg_dumpでバックアップしたデータを復元する場合、
create sequence test_seq
でシーケンスオブジェクトを生成してから、
SELECT pg_catalog.setval ('test_seq', 1, 'f');
でis_called項目の値を設定するまでのかなりの間ができるようですが、
その間に
select nextval('test_seq')
を行い他テーブルのseriaraize項目に取得した値を設定しているたサブプロセスが存在
したために発生した不具合でした。
(is_called項目の値が't'から'f'に戻されてしまう)
バックアップのリストア時はロックファイルにより、DBにアクセスしないように
制御しているのですが、そのプロセスは制御が不完全でした。

原因が分かってすっきりしました。
ありがとうございました。

> こんにちは。石田@苫小牧市です。
> 
> "M.Yuasa" <mkys @ gray.plala.or.jp> wrote:
> (2003/04/01 07:20)
> 
> >こんにちは。湯浅といいます。
> >
> >sequenceオブジェクトを利用して、レコードIDを取得しているのですが以下のケース
> >で取得した値に重複が出てしまいました。
> >
> >1)create sequence test_seq;
> > →テスト用シーケンスオブジェクトを生成します。(lastvalue値はデフォルトの1とする)
> >  もちろん他にもテーブルなどのオブジェクトを生成します。
> >2)select nextval('test_seq')
> > →nextval()関数で"1件だけ"シーケンス値を取得して、他テーブルのユニークな
> >  レコードIDなどに利用する。このとき取得した値は1となった。(正常)
> >3)pg_dumpall(pg_dump) > ./test.dat
> > →データベースのダンプ
> 
> バックアップかリストアのどちらかが失敗したのだと思うのですが、
> この test.dat の中に
> SELECT pg_catalog.setval ('test_seq', 1, true);
> のような行が作成されていますか?
> 
> 
> --
> ISHIDA Akio<iakio @ pjam.jpweb.net>
> 





pgsql-jp メーリングリストの案内