2011年8月31日

[pgsql-jp: 40904] Re:search_path設定時のView

恒住さん


MauMauといいます。

ちょっと難しそうなご質問なので私には自信がありませんが、
このMLの方々の協力を仰ぐために、もう少し正確な情報があったほうがよいような気がします。


たとえば、

> SELECT * FROM V1
> とすると、通常であれば、
> u2.T1とu1.T2を参照するはずなのですが、

といっているということは、U2.V1を参照するはずだといっているのだと思いますが、


> search_path = '"$user",u1,public'

という状態なら、U1.V1を参照するものと思います。

問題が発生するまでに行った正確な操作がわかるよう、
SET search_pathやCREATE TABLE、ビューの定義確認、SELECTなど
実行したすべてのSQL文とその出力を、psqlコマンドでファイルに出力し、
その内容をメール本文に入れたほうがよいと思います。


以上です。

----- Original Message -----
From: "Tsunezumi" <tsunezumi@xxxxx>
To: <pgsql-jp@xxxxx>
Sent: Thursday, August 25, 2011 9:50 PM
Subject: [pgsql-jp: 40898] search_path設定時のView


> お世話になります。恒住と申します。
> 教えてください。
>
> PostgreSQL8.4
>
> search_path = '"$user",u1,public'
>
> u1
> ・T1(テーブル)
> ・T2(テーブル)
> ・T3(テーブル)
> ・V1(T1とT2を参照したビュー)
> ・V2(T1とT3を参照したビュー)
>
>
> u2
> ・T1(テーブル)
> ・T2(テーブル)×
> ・T3(テーブル)
> ・V1(T1とT2を参照したビュー)×
> ・V2(T1とT3を参照したビュー)
>
> 上記の状態で、u2.T2のテーブルを削除します。
> u2.V1も削除されます。
>
> SELECT * FROM V1
> とすると、通常であれば、
> u2.T1とu1.T2を参照するはずなのですが、
> u1.T1とu1.T2を参照してしまいます。
>
> u1.V1のソースを見ると、
> 元々が
> SELECT * FROM T1 INNER JOIN T2 ON ・・・
> だったのが、
> SELECT * FROM u1.T1 INNER JOIN T2 ON ・・・
> とビューのソースが変更されていました。
>
> 元のソースをu1に流しても同様のスキーマが指定された状態になったので、
> u2の方でそのソースをコンパイルすると、元々のソースのままでになり、
> 想定の結果を返します。
>
> 因みに、u1.V2とu2.V2はスキーマが指定されていないソースのままになっています。
>
>
>
> これはこういう仕様なのでしょうか?
> どういったときにこのような状態になるのでしょうか?
> 例えば、search_pathを設定していて、その中で同一のテーブルが存在するとき、など。
> また、回避方法があれば教えてください。
>
> よろしくお願いします。
>
>


投稿者 xml-rpc : 2011年8月31日 07:42
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/106048
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。