概要
PostgresSQLでスキーマBの実テーブルを参照するビューをスキーマAにつくったとき、
スキーマAの参照権限しか持たないユーザーはビューを介してスキーマBの実テーブルの中身を参照ができるのかを知りたい。
通常のビューとマテリアライズドビューで違いがあるかも把握しておく。
(ぱっと見つからなかったけど、ドキュメントで仕様明記されている箇所が見つかったらリンク貼る)
準備(superuserにて)
スキーマAと確認用テーブルを作成(schema_a)
CREATE SCHEMA schema_a;
CREATE TABLE schema_a.test_users
(
id serial not null,
name varchar(200)
);
INSERT INTO schema_a.test_users (id, name) VALUES (DEFAULT, 'テスト太郎');
スキーマBと検証用のビュー元テーブルを作成(schema_b)
CREATE SCHEMA schema_b;
CREATE TABLE schema_b.main_users
(
id serial not null,
name varchar(200)
);
INSERT INTO schema_b.main_users (id, name) VALUES (DEFAULT, 'メイン太郎');
スキーマAに通常のビューを作成
CREATE VIEW schema_a.main_users_normal_view AS SELECT * FROM schema_b.main_users;
スキーマAにマテリアライズドビューを作成
CREATE MATERIALIZED VIEW schema_a.main_users_materialized_view AS SELECT * FROM schema_b.main_users;
検証用ユーザーを作成し、スキーマAのテーブル・ビューの参照権限を付与
CREATE USER test_user PASSWORD 'XXXXXXXXXX';
GRANT ALL ON ALL TABLES IN SCHEMA schema_a TO test_user;
GRANT USAGE ON SCHEMA schema_a TO test_user;
検証(作成したtest_userにて)
権限のあるスキーマAの実テーブル(念のため見れることを確認)
SELECT * FROM schema_a.test_users;
→ 見れる
権限のないビュー元スキーマBの実テーブル(念のため見れないことを確認)
SELECT * FROM schema_b.main_users;
ERROR: permission denied for schema schema_b
→ 見れない
スキーマAの通常のビュー
SELECT * FROM schema_a.main_users_normal_view;
→ 見れる
スキーマAのマテリアライズドビュー
SELECT * FROM schema_a.main_users_materialized_view;
→ 見れる
まとめ
通常のビュー・マテリアライズドビューどちらの場合も、実テーブルの参照権限がなくともビューの権限があれば見れる。
対象 | 結果 |
---|---|
通常のビュー | 見れる |
マテリアライズドビュー | 見れる |
元テーブルの一部カラムだけ見せたいケースや、複数のスキーマから統合したビューを見せたいときなどに使えそう。