9月にあったSnowflake World Tour TOKYOで学んだDATABASE ROLEを使うべく、ロール設計を見直しました。
(DATABASE ROLE、その時に初めて聞いた機能で、使わないとと思いつつ2か月経過してしまいました。)
ユーザー:kumataroはアナリストとして、SELECTだけできればよいということで上記画像のようにロールを作りました。
他のいろいろ管理する人やタスクなどシステム操作で書き込んだりするのは別のファンクショナルロールを割り当てます。(この画像では省略)
図の下から。
- TEST_DB.TEST_SCHEMAのTABLEやVIEWに対するSELECT権限だけあるのがデータベースロールであるtest_db_r。
- データベースロールを継承したアクセスロールであるtest_user_role。
- そのアクセスロールを継承したファンクショナルロールであるanalyst_role。
- ファンクショナルロールであるanalyst_roleをユーザー:kumataroが持っている。
という感じになりました。
ベストプラクティスに沿った形になってるでしょうか?
⇒アドバイス求む
TEST_DB.TEST_SCHEMAにはテーブル1つとマテリアライズドビューが1つあります。
テーブル:TEST_TABLE
マテリアライズドビュー:TEST_MVIEW
TEST_TABLEをGROUP BY ALLで重複行削除したのがTEST_MVIEWです。
そしてTABLEとVIEWに対するSELECT権限を以下のクエリで付与しました。
--TEST_SCHEMAのTableとViewに対するSELECT権限付与
GRANT SELECT ON ALL TABLES IN SCHEMA TEST_SCHEMA TO DATABASE ROLE test_db_r
GRANT SELECT ON ALL VIEWS IN SCHEMA TEST_SCHEMA TO DATABASE ROLE test_db_r;
これでユーザー:kumataroはテーブルとViewが見えるでしょ?と思ったらSnowSight上にテーブルしか表示されないんです。
なんで??って30分くらい悩みました。
で、ふと気づきました。
VIEWに対するSELECT権限を付与したけど、実際見たいのはマテリアライズドビューじゃん!って。
GRANT SELECT ON ALL MATERIALIZED VIEWS IN SCHEMA TEST_SCHEMA TO DATABASE ROLE test_db_r;
このコマンド流したら見えました。
なんでこんなしょぼい間違いをしたのかというと、上記の画像で「テーブル」ってカタカナで出ている部分、マテリアライズドビューは「ビュー」の中に入るんですね。
「はいはい、ビューを見たいんでしょ」って思ってViewに権限付けてました。
自分の作業ミス記録として残します。
たぶんまた間違えるんだけど、次はこの記事を思い出したら5分で解決できるはず。