[小ネタ]Snowflakeの各ユーザーがどのロールを利用できるか確認できるクエリをClaude 3.7 Sonnetに作成してもらいました
さがらです。
タイトル通りなのですが、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の一覧が表示できるため、どういったアクセス権を各ユーザーが持っているか確認可能となります。
参考:この結果にたどり着くまでの流れ
弊社の生成AIを利用できるサービスであるAI-Starterを用いて、Claude 3.7 Sonnetに対して問い合わせを行いました。
最初は雑に以下のように聞いていたのですが、各ビューへのシンプルなクエリだったり、そのまま使えないクエリが返ってくる、という状況でした。
やり取りを何度か行っていくと、1つクエリを提示するだけではなく、データの構造を確認するためのクエリも表示してくれるようになりました。
しかしこのやり取りでは何度行っても最終的に良い結果にたどり着かなかったため、こちらの記事に記載のあったクエリを貼り付け、1つのSELECT文にまとめるように依頼をしました。
上述のやり取りで得られたSELECT文は実行できたものの、私のほしい結果ではなかったため、これまでのやり取りも参考に、自分でほしいデータを取得するクエリとその結果サンプルをまとめて、JOINするように問い合わせをしてみました。
すると、これまでのやり取りもあってか、最初から再帰的に直接付与されていないが利用できるロールも確認するクエリとなり、本記事に投稿したクエリが作成されました。