- カテゴリ:
コンテキスト関数 (セッションオブジェクト)
IS_DATABASE_ROLE_IN_SESSION¶
データベースロールが、現セッションのユーザーのアクティブなプライマリまたはセカンダリロール階層にあるかどうか、または指定された列に、現セッションのユーザーのアクティブなプライマリまたはセカンダリロール階層にあるデータベースロールが含まれているかどうかを確認します。
- 入力
文字列リテラルでデータベースロールの名前を指定するか、非リテラルで列名を指定します。
- 戻り値
True
:リテラル引数(データベースロール名)の場合、セッション内にある現在のユーザーのアクティブな プライマリロールまたはセカンダリロール は、指定されたデータベースロールの権限を継承します。
非リテラル引数(列名)の場合、Snowflakeはテーブルの各行を評価し、ユーザーの現在のセッションにおけるデータベースロールを指定する値を含む行を返します。各行は、使用中のデータベースまたはクエリで指定されたデータベースに由来するデータベースロール名に対応しています。
False
:リテラル引数の場合、指定されたデータベースロールは現在のユーザーのプライマリロールまたはセカンダリロールのロール階層にありません。
非リテラル引数の場合、データベースロールが使用中のデータベースまたはクエリで指定されたデータベースのテーブル列にない場合、Snowflakeは行を返しません。
構文¶
リテラル --- データベースロールを直接指定:
IS_DATABASE_ROLE_IN_SESSION( '<string_literal>' )
非リテラル --- 列を指定:
IS_DATABASE_ROLE_IN_SESSION( <column_name> )
引数¶
'string_literal'
データベースロールの名前。
データベースロールの完全修飾名または相対名のいずれかを指定します。
column_name
テーブルまたはビューの列名。
使用上の注意¶
これらの注意事項は IS_DATABASE_ROLE_IN_SESSION 関数にのみ適用されます。
データベースロールがロール階層でアクティブ化されるのは、そのデータベースロールを含むデータベースが使用されているとき、またはそのデータベースロールを含む同じデータベース内のテーブルにクエリを実行するときです。
データ共有コンシューマーがデータベースロールを使用してポリシーで保護されたデータをクエリする場合は、ポリシーで保護されたデータをクエリする前に、
USE DATABASE database_name
コマンドでデータベースロールを含むデータベースをロードします。このコマンドは、ユーザーの現在のロールのロール階層内のデータベースロールをアクティブ化します。詳細については、 ポリシーで保護されたデータを共有する をご参照ください。ユーザープロパティ
DEFAULT_SECONDARY_ROLES
値がALL
の場合は、ユーザーに付与された いずれかの ロールが指定されたロールの権限を継承すると、関数はTrue
を返します。共有データ を保護するマスキングポリシーまたは行アクセスポリシーの条件でこの関数を使用する場合は、ポリシーを含むデータベースとポリシーで保護されたデータが両方ともコンシューマーアカウントで共有されていることを確認します。ポリシーとポリシーで保護されたデータは、同じデータベースにある場合も、異なるデータベースにある場合もあります。詳細については、 ポリシーで保護されたデータを共有する をご参照ください。
これらの注意事項は、 IS_DATABASE_ROLE_IN_SESSION と IS_ROLE_IN_SESSION の両方の関数に適用されます。
構文を1つ使用します。
リテラル構文:
引数として渡すことができるデータベースロール名は1つだけです。
引数は大文字の文字列にする必要があります。
アカウントロールの名前はサポートされていません。
非リテラル構文:
引数として渡すことができる列は1つだけです。
列には STRING データ型が必要です。
列を次のいずれかとして指定します。
column_name
table_name.column_name
schema_name.table_name.column_name
database_name.schema_name.table_name.column_name
仮想列:
テーブルに格納されている計算値ではなく、式から計算された値の結果を含む仮想列はサポート されていません。
SELECT IS_ROLE_IN_SESSION(UPPER(authz_role)) FROM t1;
仮想列は、式に列名のエイリアスがある場合にのみサポートされます。
CREATE VIEW v2 AS SELECT authz_role, UPPER(authz_role) AS upper_authz_role FROM t2; SELECT IS_ROLE_IN_SESSION(upper_authz_role) FROM v2;
ポリシー:
マスキングポリシー または 行アクセスポリシー でこれらの関数を使用する場合は、SnowflakeアカウントがEnterprise Edition以上であることを確認してください。
ポリシー条件でロール階層と継承された権限を評価する必要がある場合、Snowflakeはこの関数を使用することをお勧めします。
結果キャッシュ:
この関数をマスキングポリシーまたは行アクセスポリシーで使用しており、ポリシーも、ポリシーによって保護されているテーブルや列も前のクエリから変更されていない場合は、 RESULT_SCAN 関数を使用して、保護されたテーブルに対するクエリの結果を返すことができます。結果キャッシュは、非リテラル構文を使用する場合にのみ適用されます。
マテリアライズドビュー定義ではこれらの関数を使用できません。関数が決定論的ではなく、Snowflakeは具体化するデータを決定できないためです。
例¶
指定されたロールに付与された権限が、セッション内の現在のロールに継承されているかどうかを確認します。
SELECT IS_DATABASE_ROLE_IN_SESSION('DB1.R1');
+---------------------------------------+
| IS_DATABASE_ROLE_IN_SESSION('DB1.R1') |
+---------------------------------------+
| True |
+---------------------------------------+
ROLE_NAME という名前の列のデータベースロールの値を返します。
SELECT * FROM myb.s1.t1 WHERE IS_DATABASE_ROLE_IN_SESSION(role_name);
安全なデータ共有に関するその他の例については、 ポリシーで保護されたデータを共有する をご参照ください。