[小ネタ]Snowflakeの各ユーザーがどのロールを利用できるか確認できるクエリをClaude 3.7 Sonnetに作成してもらいました

[小ネタ]Snowflakeの各ユーザーがどのロールを利用できるか確認できるクエリをClaude 3.7 Sonnetに作成してもらいました

Clock Icon2025.04.02

さがらです。

タイトル通りなのですが、Snowflakeの各ユーザーがどのロールを利用できるか確認できるクエリをClaude 3.7 Sonnetに作成してもらったので、その内容をまとめてみます。

Snowflakeの各ユーザーがどのロールを利用できるか確認できるクエリ

早速結論ですが、以下のクエリを実行することで、Snowflakeの各ユーザーがどのロールを利用できるか確認できます。

※結構重めのクエリで、弊社の検証環境でXSのウェアハウスで40秒前後実行に時間がかかります。

select 
    user_name,
    granted_role_name,
    grant_type,
    created_on
from (
    -- 直接付与されたロール
    select 
        grantee_name as user_name,
        role as granted_role_name,
        'DIRECT' as grant_type,
        created_on
    from 
        snowflake.account_usage.grants_to_users
    where 
        deleted_on is null

    union all

    -- 間接的に付与されたロール
    select 
        u.grantee_name as user_name,
        rh.granted_role_name,
        'INDIRECT (via ' || listagg(distinct u.role, ' > ') within group (order by u.role) || ')' as grant_type,
        min(u.created_on) as created_on
    from 
        snowflake.account_usage.grants_to_users u
    join (
        -- ロール階層の再帰的な取得
        with recursive role_path as (
            select 
                name as granted_role_name,
                grantee_name as parent_role_name,
                name || ' > ' || grantee_name as path,
                1 as level
            from 
                snowflake.account_usage.grants_to_roles
            where 
                granted_on = 'ROLE'
                and privilege = 'USAGE'
                and deleted_on is null

            union all

            select 
                rp.granted_role_name,
                g.grantee_name as parent_role_name,
                rp.path || ' > ' || g.grantee_name as path,
                rp.level + 1 as level
            from 
                role_path rp
            join 
                snowflake.account_usage.grants_to_roles g
                on rp.parent_role_name = g.name
            where 
                g.granted_on = 'ROLE'
                and g.privilege = 'USAGE'
                and g.deleted_on is null
                and rp.level < 10
        )
        select * from role_path
    ) rh on u.role = rh.parent_role_name
    where 
        u.deleted_on is null
    group by 
        u.grantee_name, rh.granted_role_name
)
order by 
    user_name, grant_type, granted_role_name;

実行結果として下図のような形で、各ユーザーごとに利用できるロールがGRANTED_ROLE_NAME列に表示されて、GRANT_TYPE列にこのロールが直接付与されているのか(DIRECT)、別のロールの子ロールになっているから使えるのか(例:INDIRECT (via ACCOUNTADMIN))、がわかるようになっています。

注意点としてCREATED_ON列は、GRANT_TYPE列がINDIRECT (via ACCOUNTADMIN)の場合、ACCOUNTADMINのロールを付与された日時が記載されています。

Functional RoleとAccess Roleのロール管理を採用していれば、このクエリでユーザーに付与されているAccess Roleの一覧が表示できるため、どういったアクセス権を各ユーザーが持っているか確認可能となります。

2025-04-02_07h28_34

参考:この結果にたどり着くまでの流れ

弊社の生成AIを利用できるサービスであるAI-Starterを用いて、Claude 3.7 Sonnetに対して問い合わせを行いました。

最初は雑に以下のように聞いていたのですが、各ビューへのシンプルなクエリだったり、そのまま使えないクエリが返ってくる、という状況でした。

2025-04-02_07h44_40

2025-04-02_07h45_42

やり取りを何度か行っていくと、1つクエリを提示するだけではなく、データの構造を確認するためのクエリも表示してくれるようになりました。

2025-04-02_07h46_57

しかしこのやり取りでは何度行っても最終的に良い結果にたどり着かなかったため、こちらの記事に記載のあったクエリを貼り付け、1つのSELECT文にまとめるように依頼をしました。

2025-04-02_07h51_05

上述のやり取りで得られたSELECT文は実行できたものの、私のほしい結果ではなかったため、これまでのやり取りも参考に、自分でほしいデータを取得するクエリとその結果サンプルをまとめて、JOINするように問い合わせをしてみました。

すると、これまでのやり取りもあってか、最初から再帰的に直接付与されていないが利用できるロールも確認するクエリとなり、本記事に投稿したクエリが作成されました。

2025-04-02_07h52_53

2025-04-02_07h55_33

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.