[pgsql-jp: 30938] Re: ラージオブジェクトを他のDBに移管する方法

t-yamashita t-yamashita @ bcon.co.jp
2003年 9月 3日 (水) 19:06:12 JST


山下です。
杉田さん、アドバイスありがとうございます。

>   ラージオブジェクトの ID は OID の発番と共有されていますから、bbb が別のデー
> タベースクラスタのデータベースの場合に、以下のようにエラーとなる事が在り得ま
す。

はい、テキストにしてインポートした場合、発番の問題はどうなるのか、という不安が
あったのですが、うまく質問化できなかったのととりあえず成功したことで自分を
誤魔化してしまいました。

 >=# \lo_import /etc/passwd
 >lo_import 619568
 >=# \lo_import /etc/passwd
 >lo_import 619569
 >=# \lo_import /etc/passwd
 >could not create large object for file "/etc/passwd"
 >=# \lo_import /etc/passwd
 >lo_import 619571

このエラーは oid = 619570 もしくは loid = 619570 のデータが存在するため、と解釈
したのですが、oid や loid はどんなルールで発番されているのでしょうか。

自分で作ったテーブルのデータにはそれぞれにoidが存在するのですが、pg_largeobject
に SELECT oid をかけても Attribute "oid" not found のエラーがでるだけでした。
そこで pg_largeobjectテーブルには oid は存在しないと考え、

1. pg_largeobject のデータだけ先に取り込む
2.その後テーブルを作る
という工程で進めてみました。

自作テーブルにデータを作成したところ、その oid は pg_largeobject にインポートし
たloid の最大値の数字より大きい値で始まりました。
また、新たに作成したラージオブジェクトの loid は、直前に作成したデータの oid値 +
1 で始まったので問題解決かなと思ったのですが、発番の仕組みがわからないので、いつ
データが作成できなくなるか、不安があります。

また、oid や loid はシーケンス値のように setval でコントロールがきくのでしょう
か。
普通のセッティングなら
SELECT setval( 'シーケンス名', max(カラム名) ) FROM テーブル名 ;
なのでしょうが、テーブル名を指定するわけにもいかないと思いますし...。

質問ばかりで恐縮なのですが、ご教授いただければ幸いです。

t-yamashita




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