2016-09-21 11 views
1

私はpostgresql(バージョン9.3)の権限付与に問題があります。Postgres GRANTが親に適用されていません

私は 'client_1'という役割を制限しようとしています。 1つのテーブルだけを選択できるようにしたい。しかし、テーブル間には継承があります。

CREATE TABLE public.table_a (...); 
CREATE TABLE table_a_partitions.child_1 (...) INHERITS (public.table_a); 
CREATE TABLE table_a_partitions.child_2 (...) INHERITS (public.table_a); 

GRANT SELECT ON table_a_child_1 TO client_1; 

私はchild_2上で選択を行うとき、それは大丈夫ですが、エラーがあるが、私は例えばSELECT * FROM table_a;をすれば、それはまた、禁止されたテーブルchild_2を読み取ります

は、ここに私のテーブル構造です。彼がSELECT * FROM table_a;をしたとき、私は私のクライアントがchild_1だけ(そして将来は他のもの)の結果にアクセスするでしょう。

この問題を解決する簡単な方法はありますか?

はありがとう

答えて

0

あなたがこの問題を解決するためにはPostgreSQL 9.3でVIEWを使用する必要があります。ただし、9.5にアップグレードすると、行レベルのセキュリティを使用できます。

理由についての注意として、認可チェックは照会された最初のリレーションのレベルでのみ発生します。つまり、ビューを照会するとビューの内容にアクセスする必要がありますが、ビュー所有者(NOT YOU)は基になるリレーションにアクセスする必要があります。これにより、情報の隠蔽に役立つビューが可能になります。継承と同様に、この構造では、表のパーティションから直接行を挿入または問合せすることを禁止できますが、親表を使用して異なる問合せを許可することができます。したがって、これはデザインの優先順位の結果であり、バグではありません。

基本的には、ビューを作成してビューにユーザー権限の基準を設定します(パーティション化/継承を使用すると、挿入/更新/削除トリガーが正確に戻るため、テーブル上にないにもかかわらず、データベースが何をするのか)。

行レベルのセキュリティでは、PostgreSQL 9.5では、行レベルのポリシー(挿入/選択/更新/削除クエリに追加される条件)を指定することができ、場合によってはビューアプローチ。

関連する問題