2011年9月 3日

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

恒住さん


MauMauです。

ヤムさんのおっしゃるように、ユーザu1とu2のどちらがビューを作成するかによって、

ビューが参照するテーブルが異なるはずです。


どういうことかというと、参照されるテーブルはビューの作成時に確定するということです。
恒住さんが期待したことは、ビューに対して問い合わせを実行するときの
スキーマ検索パスに応じて、参照されるテーブルが変わるということだと思います。
もしそうだとすると、たとえSELECT文でu1.v1のようにスキーマを明治しても、
そのSELECT文を実行したセッションのスキーマ検索パスによって、
問い合わせの結果が変わってしまいます。
u1.v1というように参照するオブジェクトを明治したにもかかわらず、です。
これは困りますね。

また、恒住さんの期待した振る舞いは、テーブルとビューの間の
依存性の観点からも困ったことになります。
ビューが参照するテーブルを削除すると、DBMSはそのテーブルに依存したビューもいっしょに削除してくれますよね。
これが可能な理由は、「どのスキーマのどのテーブル」に依存しているのは
「どのスキーマのどのビュー」かが記録されていてわかるからです。

恒住さんの期待に基づくと、u1.v1が、
u1.t1とu1.t2に依存するのか、
それとも
u2.t1とu2.t2に依存するのか、
が確定できなくなります。

そのため、当初に臨んだビューを得るには、
ユーザu1とu2がそれぞれ、スキーマu1とu2に
ビューを作成する必要があると思います。

以上です。

----- Original Message -----
From: "Tsunezumi" <tsunezumi@xxxxx>
To: "PostgreSQL Japanese Mailing List" <pgsql-jp@xxxxx>
Sent: Friday, September 02, 2011 11:52 PM
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とストアドの動きが矛盾していると思い、
> 質問させて頂きました。
>


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




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