❄️ SnowflakeのRBAC入門: INSERT権限があるのにテーブルにINSERTできないのはなぜ?
はじめに: 初心者がハマりがちな権限エラー
SnowPro Core Certificationを勉強する中で躓いたポイントを備忘録的にまとめてます。
Snowflakeを使い始めたばかりの頃、「INSERT権限があるロールを持っているのにテーブルにINSERTできない!」という状況に戸惑ったことはありませんか?例えば、新しく作成したロールにテーブルへのINSERT権限を付与したのに、実際にそのロールでINSERT文を実行するとエラーが出て挿入できない…といった経験です。初心者にとっては「権限は付けたはずなのになぜ?」と混乱してしまうポイントですよね。
本記事では、この 「INSERT権限があるのにINSERTできない理由」 をやさしく解説し、その確認方法や対策についてまとめます。同じようにつまずいている方の助けになれば幸いです。
SnowflakeにおけるRBACの基本
まず原因を理解するために、SnowflakeのRBAC(Role-Based Access Control:ロールベースアクセス制御)の基本を押さえましょう。
• ロールに権限を付与し、ロールをユーザーに付与する: Snowflakeではユーザーに直接権限を付与せず、すべてロールを介して行います  。テーブルなどのオブジェクトに対する操作権限(例: SELECTやINSERTなど)はロールに割り当て、ユーザーはそのロールを持つことで間接的に権限を得ます。
• オブジェクトの所有者と権限付与: Snowflakeの各オブジェクト(テーブルなど)には所有者(オーナーロール)が存在し、所有者ロールはそのオブジェクトに対してあらゆる操作が可能です。他のロールがそのオブジェクトを操作するには、所有者ロールから該当の権限を明示的にGRANTで付与してもらう必要があります。つまり明示的な権限付与が行われない限り、他のロールではそのオブジェクトを操作できないため安全性が保たれます  。
• ロールの有効化(アクティブロール): ユーザーは複数のロールを持つことができますが、一度にアクティブにできるロールは一つです。現在のセッションでどのロールを使うか選択し(デフォルトロールやUSE ROLEコマンドで切り替え)、そのアクティブなロールの権限のみが実際の操作に適用されます。いくら他のロールに権限があっても、そのロールをアクティブにしなければ権限は行使されません。
上記を踏まえて、SnowflakeでテーブルにデータをINSERTするには必要な権限を持つロールをアクティブにして操作することが重要です。では、具体的にINSERT権限周りで起こりがちな勘違いと正しい設定方法を見ていきましょう。
INSERT権限をロールに付与する方法 (GRANT の例)
Snowflakeで「テーブルへのINSERT権限」をロールに与えるには、基本的にGRANT文で以下のように実行します。
-- データベースとスキーマへの使用権限を付与 (前提として必要)
GRANT USAGE ON DATABASE my_db TO ROLE my_role;
GRANT USAGE ON SCHEMA my_db.my_schema TO ROLE my_role;
-- テーブルへのINSERT権限を付与
GRANT INSERT ON TABLE my_db.my_schema.my_table TO ROLE my_role;
上記のように、まず対象テーブルが属するデータベースとスキーマに対するUSAGE権限をロールに付与し、その上でテーブルに対するINSERT権限を付与する手順になります。 実はこの「USAGE権限」がポイントで、後述するようにテーブル操作にはテーブル個別の権限だけでなく、そのテーブルを含むデータベース・スキーマへの利用権限(USAGE)が不可欠です 。
上記の例ではmy_roleというロールに対し、my_db.my_schema内のmy_tableへデータを挿入できる権限を与えました。これで設定自体は完了ですが、実際にINSERTを行う前に次の点を再確認してください。
• 該当ユーザーにmy_roleロールが付与されていること(ユーザーがそのロールを持っていること)。
• セッションで現在my_roleロールが有効になっていること(USE ROLE my_role;で切り替え済みか、デフォルトロールになっているか)。
これらが揃って初めて、そのユーザーはmy_tableに対してINSERTが可能になります。
「権限はあるのに操作できない」よくある誤解と正しい理解
権限設定で初心者が陥りやすいポイントを、誤解と正しい理解の対比で整理してみましょう。
よくある誤解 | 正しい理解 |
---|---|
INSERT権限さえロールに付与されていれば、そのテーブルにデータを挿入できる。 | テーブルへのINSERTには、そのテーブルが属するデータベースとスキーマへのUSAGE権限も必要ですQIITA.COM。つまり「DBとスキーマを使う権限」がなければ、テーブル権限があっても操作できません。また当然ながら、権限を持つロールを現在アクティプにして操作する必要があります。 |
複数のロールをユーザーに付与していれば、どのロールの権限でも自動的に使える。 | アクティブなロールは同時に一つだけです。ユーザーに複数のロールを付与していても、現在のセッションで有効化しているロールの権限しか使えません。必要な権限を持つロールをセッションで選択しないと、その権限は機能しません。 |
Snowflakeではユーザーに直接権限を与えることもできる。 | いいえ。「ロールに権限を付与」「ロールをユーザーに付与」という手順が必須です。ユーザー個人に直接テーブル権限を付けることはできません。必ずロール経由で割り当てる設計になっています。 |
ご覧のように、「INSERT権限を持っているのにできない!」という場合、ほとんどは上記の最初の誤解が原因です。つまり データベース/スキーマへのUSAGE権限不足 または 権限を持つロールが有効化されていない ことが挙げられます。特にSnowflake初心者はテーブル権限ばかりに目が行き、土台となるDBやスキーマの権限を見落としがちなので注意しましょう。
INSERT以外の操作でも共通するポイント
上記の考え方はINSERT操作に限った話ではありません。SELECTやUPDATE、DELETEといった他のDML操作でも同様です。例えば「SELECT権限があるのにテーブルを参照できない」場合も、やはりデータベース/スキーマのUSAGE権限がない可能性が高いです。実際、Snowflakeの公式ドキュメントでも「スキーマ内のオブジェクトを操作するには、コンテナであるデータベースとスキーマに対するUSAGE権限が必要」と明言されています。
また、ビューやストアドプロシージャなど他のオブジェクトでも基本的な考え方は同じです。ビューは読み取り専用のためINSERT/UPDATE権限を付与しても効果はありませんが、ビューを参照する際も親となるデータベース・スキーマのUSAGE権限が必要です。さらに、ストアドプロシージャやウェアハウスを利用するにもそれぞれに対するUSAGE権限が要求されます。
要するに
「あるオブジェクトに対する個別権限」 + 「そのオブジェクトを包含する上位オブジェクトへのUSAGE権限」
がセットになって初めて操作が可能になる、というのがSnowflake権限管理の基本ルールです。
SHOW GRANTSで権限を確認する方法
権限周りで問題に直面したときは、SnowflakeのSHOW GRANTSコマンドを使って状況を確認することができます。たとえば:
-- 特定のロールに付与されている権限の一覧を表示
SHOW GRANTS TO ROLE my_role;
-- 特定のテーブルに付与されている権限の一覧を表示
SHOW GRANTS ON TABLE my_db.my_schema.my_table;
SHOW GRANTS TO ROLEを実行すると、そのロールが持っているすべての権限が表示されます。データベースやスキーマに対するUSAGE権限が含まれているかもここで確認できます。 一方、SHOW GRANTS ON TABLEを実行すると、そのテーブルに対してどのロールに何の権限が与えられているかが一覧で表示されます。
もし「権限があるはずのロール」に期待する権限が見当たらなければ、やはりGRANT漏れが原因です。逆に権限は揃っているのに操作できない場合は、前述のとおり実行時に別のロールがアクティブになっていないか確認してみましょう。SnowflakeのWebUIやスクリプト内で意図したロールに切り替わっていないと、持っている権限を行使できません。
まとめ
初心者が陥りがちな「INSERT権限があるのにINSERTできない」という現象について、原因と対処法を解説しました。ポイントをおさらいすると:
• SnowflakeのRBAC基本原則: 権限はロールに付与し、ロールをユーザーに付与する。ユーザーは使うロールを切り替えて操作する。
• INSERTできない主な原因: テーブル権限だけでは不十分で、データベース及びスキーマへのUSAGE権限が不足しているケースが多い。または、該当権限を持つロールをアクティブにしていない。
• 他の操作でも同様: SELECT/UPDATE/DELETE等でも同じルールが適用され、常に上位オブジェクトのUSAGE権限が必要。
• 確認と対処: SHOW GRANTSコマンドで権限付与状況を確認し、不足していればGRANT文で追加。適切なロールに切り替えて再実行する。
Discussion