Snowflakeのロールモデルでは、セッションに対して1つのPrimary Roleと、0個以上のSecondary Rolesを設定できます。 Primary RoleはUSE ROLEで切り替える従来のロールで、Secondary Rolesを有効にすると、ユーザーに付与されている他のロールの権限もクエリ実行時に同時に評価されます。 これにより「USE ROLEで頻繁にロールを切り替える」運用負荷を大幅に削減できます。
-- セッションでSecondary Rolesを有効化(付与済み全ロールの権限を使用)
USE SECONDARY ROLES ALL;
-- Secondary Rolesを無効化(Primary Roleのみで評価)
USE SECONDARY ROLES NONE;
-- 現在のSecondary Roles設定を確認
SELECT CURRENT_SECONDARY_ROLES();
-- 現在のPrimary Roleを確認
SELECT CURRENT_ROLE();
-- ユーザーのデフォルト設定を変更
ALTER USER analyst_user
SET DEFAULT_SECONDARY_ROLES = ('ALL');
-- デフォルトをNONEに戻す
ALTER USER analyst_user
SET DEFAULT_SECONDARY_ROLES = ();Secondary Roles有効時、Snowflakeはクエリで参照するオブジェクトに対して、Primary Roleとすべての Secondary Rolesのロール階層を合算して権限チェックを行います。 いずれかのロール階層にSELECT権限があればクエリは成功します。
| 評価項目 | SECONDARY ROLES = NONE | SECONDARY ROLES = ALL |
|---|---|---|
| 権限評価対象 | Primary Roleのロール階層のみ | Primary Role + 全Granted Rolesのロール階層 |
| CURRENT_ROLE()の戻り値 | Primary Role名 | Primary Role名(変わらない) |
| IS_ROLE_IN_SESSION() | Primary Roleの階層のみTRUE | 全Granted Rolesの階層でTRUE |
| オブジェクト作成時のOWNER | Primary Role | Primary Role(変わらない) |
| 監査ログのROLE_NAME | Primary Role | Primary Role |
| 監査ログのSECONDARY_ROLE | 空欄 | ALL |
| Masking Policy内のCURRENT_ROLE() | Primary Roleを返す | Primary Roleを返す(Secondary考慮なし) |
| Row Access Policy内のIS_ROLE_IN_SESSION() | Primary Role階層のみ評価 | 全Granted Rolesの階層を評価 |
あるユーザーにANALYST_ROLE(Primary)とDATA_ENGINEER_ROLE(Secondary候補)が付与されている場合の動作を確認します。
-- Primary RoleをANALYSTに設定
USE ROLE ANALYST_ROLE;
-- この状態ではDATA_ENGINEER_ROLEが持つテーブルにはアクセスできない
SELECT * FROM raw.events; -- ERROR: Insufficient privileges
-- Secondary Rolesを有効化
USE SECONDARY ROLES ALL;
-- DATA_ENGINEER_ROLEの権限も評価され、アクセス可能に
SELECT * FROM raw.events; -- 成功
-- しかしCURRENT_ROLE()は依然としてANALYST_ROLE
SELECT CURRENT_ROLE(); -- 'ANALYST_ROLE'
-- IS_ROLE_IN_SESSION()で両方のロールを確認可能
SELECT IS_ROLE_IN_SESSION('DATA_ENGINEER_ROLE'); -- TRUE
SELECT IS_ROLE_IN_SESSION('ANALYST_ROLE'); -- TRUESecondary Roles有効時、SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORYビューのROLE_NAME列にはPrimary Roleが記録されます。 Secondary Rolesが使われたかどうかはQUERY_HISTORYに直接記録されないため、LOGIN_HISTORYやSESSIONS ビューと組み合わせて監査する必要があります。
-- セッションごとのSecondary Roles使用状況を監査
SELECT
s.session_id,
s.user_name,
s.login_event_id,
q.role_name AS primary_role,
q.query_text,
q.start_time
FROM SNOWFLAKE.ACCOUNT_USAGE.SESSIONS s
JOIN SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY q
ON s.session_id = q.session_id
WHERE q.start_time >= DATEADD(DAY, -7, CURRENT_TIMESTAMP())
AND q.query_text ILIKE '%USE SECONDARY ROLES%'
ORDER BY q.start_time DESC;-- 移行前: CURRENT_ROLE()ベースのMasking Policy
CREATE OR REPLACE MASKING POLICY mask_ssn AS (val STRING)
RETURNS STRING ->
CASE
WHEN CURRENT_ROLE() IN ('HR_ADMIN', 'COMPLIANCE')
THEN val
ELSE '***-**-****'
END;
-- 移行後: IS_ROLE_IN_SESSION()ベース(Secondary Roles対応)
CREATE OR REPLACE MASKING POLICY mask_ssn AS (val STRING)
RETURNS STRING ->
CASE
WHEN IS_ROLE_IN_SESSION('HR_ADMIN')
OR IS_ROLE_IN_SESSION('COMPLIANCE')
THEN val
ELSE '***-**-****'
END;Security & Governance
問題 1
あるユーザーがPrimary RoleにANALYSTを設定し、USE SECONDARY ROLES ALLを実行した。このユーザーにはDATA_ENGINEERロールも付与されている。Row Access Policyの条件にCURRENT_ROLE() = 'DATA_ENGINEER'が使われているテーブルにクエリを実行した場合、どうなるか。
正解: B
Secondary Roles ALLを有効にすると、テーブルへのアクセス権限(SELECT等)はPrimary Role+全Secondary Rolesで評価されるため、DATA_ENGINEERの権限でテーブルにはアクセスできます。しかしCURRENT_ROLE()は常にPrimary Role(ANALYST)を返すため、Row Access Policyの条件CURRENT_ROLE() = 'DATA_ENGINEER'はFALSEとなります。この動作はIS_ROLE_IN_SESSION('DATA_ENGINEER')を使えばTRUEと評価されます。
Secondary Rolesを有効にするとRow Access PolicyやMasking Policyの挙動はどう変わりますか?
USE SECONDARY ROLES ALLを有効にすると、クエリ実行時にPrimary Roleだけでなく全てのGranted Rolesの権限が評価されます。しかしRow Access PolicyやMasking Policyの中でCURRENT_ROLE()を使っている場合、CURRENT_ROLE()はPrimary Roleのみを返します。Secondary Rolesの権限はIS_ROLE_IN_SESSION()で評価できます。ポリシー設計でCURRENT_ROLE()に依存している環境でSecondary Rolesを有効化すると、想定外のデータ可視性が生じる可能性があるため、IS_ROLE_IN_SESSION()への移行を検討してください。
Secondary Rolesを有効にした状態でオブジェクトを作成すると、所有者はどのロールになりますか?
オブジェクトの所有者(OWNERSHIP権限)は常にPrimary Roleに付与されます。Secondary Rolesはクエリ実行時のアクセス権限を拡張するだけで、DDLで作成されたオブジェクトの所有権には影響しません。そのため、USE ROLEで適切なPrimary Roleをセットしてからオブジェクトを作成する運用は、Secondary Roles有効時でも変わりません。
USE SECONDARY ROLES ALLはセッション単位ですか?アカウント全体に影響しますか?
USE SECONDARY ROLES ALLはセッション単位の設定です。他のセッションやユーザーには影響しません。ただしDEFAULT_SECONDARY_ROLESユーザーパラメータを'ALL'に設定すると、そのユーザーの新しいセッションでは自動的にSecondary Rolesが有効になります。ALTER USER u SET DEFAULT_SECONDARY_ROLES = ('ALL') で設定し、NONEに戻す場合はALTER USER u SET DEFAULT_SECONDARY_ROLES = () を実行します。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Snowflake資格一覧|全11試験(SnowPro)の難易度・費用
Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...
Snowflake試験の難易度ランキング|全11資格を徹底比較
Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...
Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ
Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...
SnowPro Core試験完全解説|出題範囲・問題例・合格戦略
SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...
SnowPro Platform Associate完全解説|入門試験の攻略
SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...