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

MauMau maumau307 @ gmail.com
2011年 8月 31日 (水) 07:42:27 JST


恒住さん


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 @ efficlabo.com>
To: <pgsql-jp @ ml.postgresql.jp>
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を設定していて、その中で同一のテーブルが存在するとき、など。
> また、回避方法があれば教えてください。
>
> よろしくお願いします。
>
>



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