2011年9月 3日

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


ビューの作成者が変わっていませんか?


CREATE VIEW u1.v1 AS
SELECT * FROM t1 INNER JOIN t2 ON …;

の様な形でビューを作成すると、

ユーザーu2でビューを作成するのと、他のユーザーで作成するのでは、
ビューが参照するテーブルが変わるはずですが。

-----------
ゆむ

↓↓↓↓↓↓↓↓↓ Original Message ↓↓↓↓↓↓↓↓↓
From: Tsunezumi <tsunezumi@xxxxx>
To: PostgreSQL Japanese Mailing List <pgsql-jp@xxxxx>
Date: Fri, 02 Sep 2011 23:52:36 +0900
Subject: [pgsql-jp: 40907] Re: search_path設定時のView
- - - - - - - - - - - - - - - - - - - -
> MauMauさん、ご返信有難うございます。
>
>
> 分かりづらいですよね。すみません。
> 定義は長くなるので省略させてください。
>
> search_path = '"$user",u1,public' で
> u2で接続した場合、
> u2にはT2がないので、
> SELECT * FROM T1 INNER JOIN T2 ON ・・・ ----?
> を実行すると、
> SELECT * FROM u2.T1 INNER JOIN u1.T2 ON ・・・ ----?
> と同じ意味になると思います。
>
> なので、
> ?のSQLをそのままu1のViewにすれば、?と同じ結果が返ってくるだろうと
> 思っていたのですが、そうではないということなのでしょうね。
>
> 以前、同じ環境でストアドを作成した時に、
> u2で接続している限りでは、
> u1のストアドでも?の結果が返ってきてたと覚えているので、
> Viewとストアドの動きが矛盾していると思い、
> 質問させて頂きました。
>
>
>
>
>
>
>
>
>
> On Wed, 31 Aug 2011 07:42:27 +0900
> "MauMau" <maumau307@xxxxx> wrote:
>
> > 恒住さん
> >
> >
> > 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を設定していて、その中で同一のテーブルが存在するとき、など。
> > > また、回避方法があれば教えてください。
> > >
> > > よろしくお願いします。
> > >
> > >
>
↑↑↑↑↑↑↑↑ Original Message Ends↑↑↑↑↑↑↑↑


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




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