![[新機能] Snowflake の Temporary role grants がプレビューとなったので、ロールを期限付きでユーザーに付与し 4 つのユースケースで失効時の挙動を確認してみた](https://devio2024-media.developers.io/image/upload/f_auto,q_auto,w_3840/f_auto,q_auto/v1790874280/eyecatch/wsr0koxw01pat9lxglvp.png)
[新機能] Snowflake の Temporary role grants がプレビューとなったので、ロールを期限付きでユーザーに付与し 4 つのユースケースで失効時の挙動を確認してみた
かわばたです。
2026年11月10日にユーザーへのロール付与に期限を付けられるTemporary role grantsがプレビューになりました。
本記事では、オンコール対応、PII の一時閲覧、期間限定メンバー、管理者権限の 4 つのユースケースで期限付きの付与を試します。期限が来たときにセッションがどうなるかと、通常の GRANT ROLE を再実行すると期限が消える挙動も確認します。
Temporary role grants の概要
GRANT ROLE ... TO USER に 3 つの句が追加されました。
GRANT ROLE <name> TO USER <user_name>
[ { FOR INTERVAL <interval> | UNTIL <timestamp> } [ RESET EXPIRATION ] ]
| 句 | 指定する内容 |
|---|---|
FOR INTERVAL |
付与から失効までの時間。正の整数と、MINUTE・HOUR・DAY のどれか 1 つの単位で書く(複数形も可)。例は '30 MINUTES'、'24 HOURS'、'7 DAYS' |
UNTIL |
失効する日時。未来の日時で、Z か +09:00 のようなオフセットを付ける |
RESET EXPIRATION |
既存の付与の期限を、今回指定した期限で置き換える |
期限が来ると付与は自動で失効するため、REVOKE ROLE の実行は不要です。期限は SHOW GRANTS TO USER と SHOW GRANTS OF ROLE の expires_on 列で確認できます。ACCOUNT_USAGE の GRANTS_TO_USERS ビューにも同じ列が追加されました。恒久的な付与では NULL です。
失効したときの挙動
公式ドキュメントによると、失効後の挙動はロールの使われ方で変わります。
| ロールの使われ方 | 失効後の挙動 |
|---|---|
| セッションの primary role | 次に実行した SQL がエラー 003048 で失敗する |
| セッションの secondary role | エラーなしで secondary roles から外れる |
| 実行中のクエリ | 終わるまでそのロールで動き続ける |
hybrid table へのクエリと interactive warehouse で動くクエリは、失効の反映に最大 60 秒かかります。
同じロールを再付与したときの挙動
同じ付与者(grantor)が同じユーザーへ同じロールをもう一度付与すると、既存の付与が更新されます。RESET EXPIRATION を付けない場合は長い方の期限が残ります。恒久的な付与は最も長い期限として扱われます。
| 既存の付与 | 再実行する SQL | 結果 |
|---|---|---|
| 一時 | 期限の指定なし | 恒久になる |
| 一時 | より遅い期限 | 期限が延びる |
| 一時 | より早い期限、同じ期限 | 変化なし |
| 恒久 | FOR INTERVAL / UNTIL |
変化なし |
| 一時、恒久 | FOR INTERVAL / UNTIL と RESET EXPIRATION |
指定した期限になる |
前提条件
- 2026年11月12日時点で、全アカウントで使えるプレビュー
- 期限を付けられるのは、account role をユーザーに付与する場合のみ
- 実行ロールは、付与するロールの OWNERSHIP かグローバル権限の MANAGE GRANTS を持つこと
- masking policy を使うユースケース 2 は Enterprise Edition 以上
Enterprise の trial アカウントで、Snowsight のワークシートから検証しました。
事前準備
Snowsight にログインしている自分のユーザー 1 人で検証します。ACCOUNTADMIN を持つユーザーを想定しています。用意するのは、テーブル 2 つ、ロール 4 つ、付与先としてだけ使うユーザー 2 名です。
| ロール | 付与の方針 | できること |
|---|---|---|
| TG_ANALYST | 常時 | CUSTOMERS を参照できる。EMAIL はマスクされる |
| TG_ONCALL | 一時 | 障害調査用。付与時点で PROD スキーマにある全テーブルを参照できる |
| TG_AUDITOR | 一時 | 期間限定メンバー用。付与時点で PROD スキーマにある全テーブルを参照できる |
| TG_PII_VIEWER | 一時 | オブジェクト権限は持たない。EMAIL のマスク解除条件に使う |
| ユーザー | 役割 |
|---|---|
| 自分のユーザー | TG_ANALYST を常時付与する。他のロールを期限付きで付与し、失効を確認する |
| TG_ALICE、TG_BOB | ログインしない。期限付きの付与先としてだけ使う |
4 つのロールは SYSADMIN に付与しません。SYSADMIN に付与すると、ACCOUNTADMIN を持つユーザーは継承でそのロールを期限なしに使えます。その状態では、自分のユーザーへの期限付きの付与が失効しても、継承の経路でロールを使い続けられます。失効でアクセスできなくなることを確認できません。
まず SYSADMIN でウェアハウスとテーブルを作ります。EMAIL 列の masking policy は、セッションに TG_PII_VIEWER があるときだけ生データを返します。
事前準備クエリ
USE ROLE SYSADMIN;
CREATE WAREHOUSE IF NOT EXISTS TEMP_GRANT_WH
WAREHOUSE_SIZE = XSMALL AUTO_SUSPEND = 60 AUTO_RESUME = TRUE INITIALLY_SUSPENDED = TRUE;
CREATE DATABASE IF NOT EXISTS TEMP_GRANT_DEMO;
CREATE SCHEMA IF NOT EXISTS TEMP_GRANT_DEMO.PROD;
USE WAREHOUSE TEMP_GRANT_WH;
CREATE OR REPLACE TABLE TEMP_GRANT_DEMO.PROD.CUSTOMERS (
CUSTOMER_ID NUMBER, CUSTOMER_NAME STRING, EMAIL STRING, PREFECTURE STRING
);
INSERT INTO TEMP_GRANT_DEMO.PROD.CUSTOMERS VALUES
(1, 'Ichiro Sato', 'ichiro.sato@example.com', 'Tokyo'),
(2, 'Hanako Suzuki', 'hanako.suzuki@example.com', 'Osaka'),
(3, 'Kenta Takahashi', 'kenta.takahashi@example.com', 'Aichi'),
(4, 'Yui Tanaka', 'yui.tanaka@example.com', 'Fukuoka'),
(5, 'Daiki Watanabe', 'daiki.watanabe@example.com', 'Hokkaido');
CREATE OR REPLACE TABLE TEMP_GRANT_DEMO.PROD.ORDERS (
ORDER_ID NUMBER, CUSTOMER_ID NUMBER, AMOUNT NUMBER(10, 0),
STATUS STRING, ORDERED_AT TIMESTAMP_NTZ
);
INSERT INTO TEMP_GRANT_DEMO.PROD.ORDERS VALUES
(1001, 1, 12800, 'COMPLETED', '2026-11-10 09:12:00'),
(1002, 2, 4500, 'COMPLETED', '2026-11-10 13:40:00'),
(1003, 3, 29800, 'FAILED', '2026-11-11 22:05:00'),
(1004, 1, 7600, 'FAILED', '2026-11-11 22:07:00'),
(1005, 4, 15400, 'COMPLETED', '2026-11-11 23:30:00'),
(1006, 5, 9900, 'FAILED', '2026-11-12 00:02:00');
CREATE OR REPLACE MASKING POLICY TEMP_GRANT_DEMO.PROD.MASK_EMAIL
AS (val STRING) RETURNS STRING ->
CASE
WHEN IS_ROLE_IN_SESSION('TG_PII_VIEWER') THEN val
ELSE '***MASKED***'
END;
ALTER TABLE TEMP_GRANT_DEMO.PROD.CUSTOMERS
MODIFY COLUMN EMAIL SET MASKING POLICY TEMP_GRANT_DEMO.PROD.MASK_EMAIL;
続けてロールを作り、オブジェクト権限を付与します。SECURITYADMIN にもウェアハウスの USAGE を付与します。SHOW の結果を SELECT で絞るクエリがウェアハウスを使うためです。
USE ROLE SECURITYADMIN;
CREATE ROLE IF NOT EXISTS TG_ANALYST;
CREATE ROLE IF NOT EXISTS TG_ONCALL;
CREATE ROLE IF NOT EXISTS TG_AUDITOR;
CREATE ROLE IF NOT EXISTS TG_PII_VIEWER;
USE ROLE SYSADMIN;
GRANT USAGE ON WAREHOUSE TEMP_GRANT_WH TO ROLE SECURITYADMIN;
GRANT USAGE ON WAREHOUSE TEMP_GRANT_WH TO ROLE TG_ANALYST;
GRANT USAGE ON WAREHOUSE TEMP_GRANT_WH TO ROLE TG_ONCALL;
GRANT USAGE ON WAREHOUSE TEMP_GRANT_WH TO ROLE TG_AUDITOR;
GRANT USAGE ON DATABASE TEMP_GRANT_DEMO TO ROLE TG_ANALYST;
GRANT USAGE ON DATABASE TEMP_GRANT_DEMO TO ROLE TG_ONCALL;
GRANT USAGE ON DATABASE TEMP_GRANT_DEMO TO ROLE TG_AUDITOR;
GRANT USAGE ON SCHEMA TEMP_GRANT_DEMO.PROD TO ROLE TG_ANALYST;
GRANT USAGE ON SCHEMA TEMP_GRANT_DEMO.PROD TO ROLE TG_ONCALL;
GRANT USAGE ON SCHEMA TEMP_GRANT_DEMO.PROD TO ROLE TG_AUDITOR;
GRANT SELECT ON TABLE TEMP_GRANT_DEMO.PROD.CUSTOMERS TO ROLE TG_ANALYST;
GRANT SELECT ON ALL TABLES IN SCHEMA TEMP_GRANT_DEMO.PROD TO ROLE TG_ONCALL;
GRANT SELECT ON ALL TABLES IN SCHEMA TEMP_GRANT_DEMO.PROD TO ROLE TG_AUDITOR;
最後に、自分のユーザーへ TG_ANALYST を付与し、付与先のユーザーを作ります。$me は自分のユーザー名を入れたセッション変数です。
SET me = CURRENT_USER();
USE ROLE SECURITYADMIN;
GRANT ROLE TG_ANALYST TO USER IDENTIFIER($me);
CREATE USER IF NOT EXISTS TG_ALICE TYPE = PERSON;
CREATE USER IF NOT EXISTS TG_BOB TYPE = PERSON;
試してみた
Snowsight のワークシートを 2 つ使います。管理者用はロールの付与と付与状況の確認に、利用者用は付与されたロールでのクエリに使います。以降の SQL には、どちらのワークシートで実行するかを先頭のコメントに書いています。管理者用のワークシートでは、最初に次を実行します。
-- 管理者用のワークシート
SET me = CURRENT_USER();
USE ROLE SECURITYADMIN;
USE WAREHOUSE TEMP_GRANT_WH;
失効を待つため、検証では期限を 1 分にしています。実運用では '4 HOURS' のように作業時間に合わせて指定します。
ユースケース 1: オンコール担当に調査用ロールを一時付与する
夜間の障害対応で、担当者に本番テーブルの参照権限を数時間だけ渡す場面です。自分のユーザーをオンコール担当に見立てて付与します。
-- 管理者用のワークシート
GRANT ROLE TG_ONCALL TO USER IDENTIFIER($me) FOR INTERVAL '1 MINUTE';
SHOW GRANTS OF ROLE TG_ONCALL;
自分のユーザーへの付与が 1 行返り、expires_on に付与の 1 分後が入りました。

期限が来る前に、利用者用のワークシートで TG_ONCALL に切り替えてクエリを実行します。2 つ目は、失効時刻をまたいで 90 秒動くクエリです。
-- 利用者用のワークシート(付与から 1 分以内に、2 つ目のクエリまで実行する)
USE ROLE TG_ONCALL;
USE WAREHOUSE TEMP_GRANT_WH;
SELECT STATUS, COUNT(*) AS n
FROM TEMP_GRANT_DEMO.PROD.ORDERS GROUP BY STATUS ORDER BY 1;
SELECT COUNT(*) AS n, SYSTEM$WAIT(90) AS waited
FROM TEMP_GRANT_DEMO.PROD.ORDERS;
1 つ目のクエリは結果が返りました。
2 つ目のクエリは実行中に期限が来ましたが、最後まで動いています。
結果欄には N = 6、waited 90 seconds が表示され、実行時間は 1m 30s でした。実行中のクエリは失効後も動き続けるという公式ドキュメントの記載どおりです。
同時に、結果欄の上のエディタ領域は次の表示に変わりました。ワークシートが使っていた TG_ONCALL が失効したことを示しています。

失効後に、付与の状況と新しいワークシートでの切り替えを確認します。
-- 管理者用のワークシート(失効後)
SHOW GRANTS OF ROLE TG_ONCALL;

-- 新しいワークシート(失効後)
USE ROLE TG_ONCALL;

SHOW GRANTS は行を返しませんでした。失効した付与は SHOW GRANTS に表示されないためです。USE ROLE TG_ONCALL はエラーになります。メッセージは Requested role 'TG_ONCALL' is not assigned to the executing user です。
対応が早く終わったときは、期限を待たずに REVOKE ROLE TG_ONCALL FROM USER IDENTIFIER($me); で外せます。
ユースケース 2: PII の閲覧ロールを一時付与する
問い合わせ調査の間だけ EMAIL のマスクを解除するため、TG_PII_VIEWER を 1 分間付与します。secondary role で使うロールの失効を見るために、TG_ONCALL も同時に付与します。
-- 管理者用のワークシート
SET me = CURRENT_USER();
GRANT ROLE TG_PII_VIEWER TO USER IDENTIFIER($me) FOR INTERVAL '1 MINUTE';
GRANT ROLE TG_ONCALL TO USER IDENTIFIER($me) FOR INTERVAL '1 MINUTE';
利用者用には新しいワークシートを開きます。primary role は常時付与の TG_ANALYST にして、付与された 2 つのロールを secondary roles に指定します。
-- 利用者用のワークシート(新しく開く。付与から 1 分以内に実行する)
USE ROLE TG_ANALYST;
USE SECONDARY ROLES TG_PII_VIEWER, TG_ONCALL;
USE WAREHOUSE TEMP_GRANT_WH;
-- 自分への付与と期限を確認する
SHOW GRANTS OF ROLE TG_PII_VIEWER;
primary role が TG_ANALYST のままでも、自分への付与の expires_on を確認できました。

続けて次の 3 つのクエリを、失効の前と後に実行します。
-- 利用者用のワークシート(失効前に実行し、1 分以上待ってもう一度実行する)
SELECT CURRENT_ROLE() AS r, CURRENT_SECONDARY_ROLES() AS s,
IS_ROLE_IN_SESSION('TG_PII_VIEWER') AS pii_in_session;
SELECT CUSTOMER_ID, CUSTOMER_NAME, EMAIL
FROM TEMP_GRANT_DEMO.PROD.CUSTOMERS ORDER BY 1 LIMIT 3;
SELECT COUNT(*) AS n FROM TEMP_GRANT_DEMO.PROD.ORDERS;
【失効前】


【失効後】


| 確認項目 | 失効前 | 失効後 |
|---|---|---|
| CURRENT_SECONDARY_ROLES の roles | TG_PII_VIEWER,TG_ONCALL | 空 |
| pii_in_session | TRUE | FALSE |
| 1 行目の EMAIL | ichiro.sato@example.com | ***MASKED*** |
| ORDERS の件数 | 6 | エラー 002003(does not exist or not authorized) |
失効後に CUSTOMERS を参照しても、エラーは出ませんでした。
secondary roles から 2 つのロールが外れ、EMAIL はマスク表示に戻っています。
クエリを続けられたのは、テーブルの参照権限が primary role の TG_ANALYST に残っているためです。
ORDERS を参照できていたのは、TG_ONCALL の権限によるものです。失効したロールだけが持つ権限を使う SQL は、失効後に権限不足で失敗します。この場合もセッションは続き、CUSTOMERS は引き続き参照できました。primary role で使ったユースケース 1 とは、失効時の影響が違います。
ユースケース 3: 期間限定メンバーに契約終了日まで付与する
外部委託のメンバーや監査人には、契約終了日を期限にしてロールを付与します。日時を指定する UNTIL を使い、日本時間で書くときは +09:00 を付けます。TG_BOB を期間限定メンバーに見立てます。ここからは管理者用のワークシートだけを使います。
まず、受け付けられない日時を試します。
-- 管理者用のワークシート
GRANT ROLE TG_AUDITOR TO USER TG_BOB UNTIL '2026-12-25 18:00:00';
GRANT ROLE TG_AUDITOR TO USER TG_BOB UNTIL '2026-11-01 18:00:00+09:00';
どちらもエラーになりました。

オフセットを付けた未来の日時で付与し、続けて契約の延長と短縮を試します。SQL を 1 つ実行するたびに SHOW GRANTS OF ROLE TG_AUDITOR で期限を確認しました。
-- 管理者用のワークシート(1 つずつ実行し、そのたびに SHOW GRANTS で確認する)
GRANT ROLE TG_AUDITOR TO USER TG_BOB UNTIL '2026-12-25 18:00:00+09:00'; -- 1
GRANT ROLE TG_AUDITOR TO USER TG_BOB UNTIL '2027-01-29 18:00:00+09:00'; -- 2
GRANT ROLE TG_AUDITOR TO USER TG_BOB UNTIL '2026-11-30 18:00:00+09:00'; -- 3
GRANT ROLE TG_AUDITOR TO USER TG_BOB UNTIL '2026-11-30 18:00:00+09:00' RESET EXPIRATION; -- 4
SHOW GRANTS OF ROLE TG_AUDITOR;
| 順 | 内容 | 実行後の expires_on | created_on |
|---|---|---|---|
| 1 | 契約終了日まで付与 | 2026-12-25 18:00 | 付与した時刻 |
| 2 | 遅い日時で再付与 | 2027-01-29 18:00(延長) | 更新された |
| 3 | 早い日時で再付与 | 2027-01-29 18:00(変化なし) | 変わらない |
| 4 | 早い日時と RESET EXPIRATION |
2026-11-30 18:00(短縮) | 更新された |
延長は、遅い日時で再付与するだけで反映されます。
短縮は RESET EXPIRATION を付けないと反映されません。
成功メッセージは 3 と 4 で同じです。
反映されたかどうかは、expires_on か created_on で判断します。

期限付きで付与しているユーザーの一覧は、SHOW の結果をパイプ演算子 ->> でつなぐと取り出せます。恒久的な付与を除くため、expires_on が NULL でない行に絞ります。
-- 管理者用のワークシート
SHOW GRANTS OF ROLE TG_AUDITOR
->> SELECT "grantee_name", "granted_by", "expires_on",
DATEDIFF('day', CURRENT_TIMESTAMP(), "expires_on") AS days_left
FROM $1
WHERE "granted_to" = 'USER'
AND "expires_on" IS NOT NULL;
TG_BOB の 1 行が、期限と残り日数つきで返りました。

最後に、期限を 1 分後へ書き換えて失効させます。
-- 管理者用のワークシート
GRANT ROLE TG_AUDITOR TO USER TG_BOB FOR INTERVAL '1 MINUTE' RESET EXPIRATION;
-- 1 分以上待ってから実行する
SHOW GRANTS OF ROLE TG_AUDITOR;
SHOW USERS LIKE 'TG_BOB' ->> SELECT "name", "disabled" FROM $1;
失効後、TG_AUDITOR の付与は 0 件になりました。
TG_BOB の disabled は false のままです。失効するのはロールの付与だけで、ユーザーは無効になりません。
契約終了と同時にログインも止めたい場合は、ALTER USER ... SET DISABLED = TRUE などでユーザーを別途無効化します。
ユースケース 4: 管理者権限を作業時間だけ付与する
SECURITYADMIN のような強いロールは常時付与せず、作業のときだけ付与する運用を試します。TG_ALICE を社内の運用担当に見立てます。
-- 管理者用のワークシート
GRANT ROLE SECURITYADMIN TO USER TG_ALICE FOR INTERVAL '1 MINUTE';
SHOW GRANTS TO USER TG_ALICE;
-- 1 分以上待ってから実行する
SHOW GRANTS TO USER TG_ALICE;

システム定義ロールにも期限を付けられました。
expires_on には 1 分後が入り、1 分たってから実行した SHOW GRANTS は 0 件でした。
ACCOUNTADMIN の一時付与には保護があります。
アカウント内に残る最後の ACCOUNTADMIN の恒久付与を一時付与へ変更しようとすると、エラー 004904 で拒否されます。検証環境で ACCOUNTADMIN を持つユーザーは自分 1 人だけで、その付与は恒久です。この付与を RESET EXPIRATION で一時付与へ変えてみます。
-- 管理者用のワークシート
USE ROLE ACCOUNTADMIN;
GRANT ROLE ACCOUNTADMIN TO USER IDENTIFIER($me) FOR INTERVAL '7 DAYS' RESET EXPIRATION;
SHOW GRANTS OF ROLE ACCOUNTADMIN;
USE ROLE SECURITYADMIN;

エラーとなり、変更できませんでした。SHOW GRANTS OF ROLE ACCOUNTADMIN を見ても、expires_on は NULL のままです。
注意: ACCOUNTADMIN の恒久付与を持つユーザーがほかにもいるアカウントでは、公式ドキュメントの再付与の仕様どおりなら、この SQL は成功して自分の付与が一時付与に変わります。試す場合は、直後に期限なしの
GRANT ROLE ACCOUNTADMIN TO USER IDENTIFIER($me);で恒久付与へ戻してください。
通常の GRANT ROLE を再実行すると恒久になる
一時付与を運用するうえで注意したい挙動です。
TG_ALICE に TG_ONCALL を付与する同じ SQL を、句を変えながら 5 回実行します。5 回目だけ、実行ロールを ACCOUNTADMIN に変えます。
-- 管理者用のワークシート(1 つずつ実行し、そのたびに SHOW GRANTS で確認する)
GRANT ROLE TG_ONCALL TO USER TG_ALICE FOR INTERVAL '8 HOURS'; -- 1
GRANT ROLE TG_ONCALL TO USER TG_ALICE; -- 2
GRANT ROLE TG_ONCALL TO USER TG_ALICE FOR INTERVAL '8 HOURS'; -- 3
GRANT ROLE TG_ONCALL TO USER TG_ALICE FOR INTERVAL '8 HOURS' RESET EXPIRATION; -- 4
USE ROLE ACCOUNTADMIN;
GRANT ROLE TG_ONCALL TO USER TG_ALICE; -- 5
USE ROLE SECURITYADMIN;
SHOW GRANTS OF ROLE TG_ONCALL;
| 順 | 実行ロール | 付けた句 | 実行後の expires_on |
|---|---|---|---|
| 1 | SECURITYADMIN | FOR INTERVAL '8 HOURS' |
8 時間後 |
| 2 | SECURITYADMIN | なし | NULL(恒久になった) |
| 3 | SECURITYADMIN | FOR INTERVAL '8 HOURS' |
NULL(変化なし) |
| 4 | SECURITYADMIN | FOR INTERVAL '8 HOURS' RESET EXPIRATION |
8 時間後 |
| 5 | ACCOUNTADMIN | なし | NULL(恒久になった) |
5 回とも、返るメッセージは Statement executed successfully. でした。
2 のように期限なしで再付与すると、一時付与は恒久になります。3 のように期限を付け直しても一時付与には戻りません。4 のように RESET EXPIRATION を付けると戻りました。
5 は、実行ロールを ACCOUNTADMIN に変えた場合です。granted_by は SECURITYADMIN のままでした。行は増えず、既存の一時付与が恒久付与に変わりました。
ユーザー作成時の定型スクリプトや IaC ツールが GRANT ROLE ... TO USER を再実行する環境では、一時付与が気づかないうちに恒久へ変わります。一時付与だけに使うロールを決めておくと、期限のない付与を次のクエリで見つけられます。
-- 管理者用のワークシート
SHOW GRANTS OF ROLE TG_ONCALL
->> SELECT "grantee_name", "granted_by", "created_on"
FROM $1
WHERE "granted_to" = 'USER' AND "expires_on" IS NULL;
-- 確認が終わったら外す
REVOKE ROLE TG_ONCALL FROM USER TG_ALICE;
制限事項・注意点
制限事項・注意点
- ロール間の付与と database role に句を付けると、エラーで失敗する(公式記載)
- application role の付与と、ユーザーへ直接付与する権限は対象外(公式記載)
- 付与は付与者ごとに別管理で、有効な付与が 1 つでも残ればロールを使える(公式記載、未検証)
- GRANTS_TO_USERS ビューは最大 2 時間遅れる(公式記載)
GRANTS_TO_USERS ビューの DELETED_ON は失効日時ではなく、付与が削除された日時です。失効した付与は、Snowflake が削除するまで DELETED_ON が NULL のまま残ります。検証中に失効させた付与のうち 3 件は、DELETED_ON が失効の約 24 分後(2 件)と約 93 分後(1 件)でした。有効な付与だけを取り出すときは、公式ドキュメントの例のとおり EXPIRES_ON も条件に加えます。ACCOUNT_USAGE は SECURITYADMIN の既定の権限では参照できないため、ACCOUNTADMIN に切り替えて実行します。
-- 管理者用のワークシート
USE ROLE ACCOUNTADMIN;
SELECT role, grantee_name, granted_by, expires_on
FROM SNOWFLAKE.ACCOUNT_USAGE.GRANTS_TO_USERS
WHERE deleted_on IS NULL
AND (expires_on IS NULL OR expires_on > CURRENT_TIMESTAMP());
最後に
Temporary role grants を使うと、期限後に手動でロールを取り消す必要がなくなります。失効時の影響は primary role と secondary role で異なるため、ロールの使い方に合わせて設計が必要になると考えています。
期限なしの GRANT ROLE を再実行すると恒久になる点は、既存のスクリプトと併用する前に確認しておきたいところです。
この記事が何かの参考になれば幸いです!






