- カテゴリ:
コンテキスト関数 (セッションオブジェクト)
IS_DATABASE_ROLE_IN_SESSION¶
データベースロールが、現セッションのユーザーのアクティブなプライマリまたはセカンダリロール階層にあるかどうか、または指定された列に、現セッションのユーザーのアクティブなプライマリまたはセカンダリロール階層にあるデータベースロールが含まれているかどうかを確認します。
- 入力:
文字列リテラルでデータベースロールの名前を指定するか、非リテラルで列名を指定します。
- 戻り値:
True
:リテラル引数(データベースロール名)の場合、セッション内にある現在のユーザーのアクティブな プライマリロールまたはセカンダリロール は、指定されたデータベースロールの権限を継承します。
非リテラル引数(列名)の場合、Snowflakeはテーブルの各行を評価し、ユーザーの現在のセッションにおけるデータベースロールを指定する値を含む行を返します。各行は、使用中のデータベースまたはクエリで指定されたデータベースに由来するデータベースロール名に対応しています。
False
:リテラル引数の場合、指定されたデータベースロールは現在のユーザーのプライマリロールまたはセカンダリロールのロール階層にありません。
非リテラル引数の場合、データベースロールが使用中のデータベースまたはクエリで指定されたデータベースのテーブル列にない場合、Snowflakeは行を返しません。
データベースロールの完全修飾名を
database_name.database_role_name
の形式で指定します。代わりに相対名database_role_name
を使用します。
構文¶
リテラル --- データベースロールを直接指定:
IS_DATABASE_ROLE_IN_SESSION( '<string_literal>' )
非リテラル --- 列を指定:
IS_DATABASE_ROLE_IN_SESSION( <column_name> )
引数¶
'string_literal'
データベースロールの名前。
データベースロールの相対名を指定します。完全修飾名を指定した場合、この関数は
False
と評価されます。column_name
テーブルまたはビューの列名。
使用上の注意¶
これらの注意事項は IS_DATABASE_ROLE_IN_SESSION 関数にのみ適用されます。
このテーブルを使用して、関数の引数が文字列リテラルである場合の関数の評価を予測します。
コンテキスト
評価
クエリ。
セッションデータベース。
WHERE 句を持つテーブルまたはビュー定義。
次によって異なります。
使用中のデータベースがあり、テーブルやビューの相対名を使用する場合、コンテキストは使用中のデータベース(セッションデータベース)になります。
テーブルまたはビューの完全修飾名を指定した場合、コンテキストはテーブルまたはビューを含むデータベースになります。
保護されたテーブルまたはビュー。
テーブルまたはビューを含むデータベース。
所有者権限ストアドプロシージャ。
ストアドプロシージャを含むデータベース。
呼び出し元権限ストアドプロシージャ。
セッションデータベース。
UDF
保護されたテーブルまたはビューを含むデータベース。
ポリシーの中で UDF が呼び出されなかった場合、関数は UDF を含むデータベースと評価されます。
データベースロールがロール階層でアクティブ化されるのは、そのデータベースロールを含むデータベースが使用されているとき、またはそのデータベースロールを含む同じデータベース内のテーブルにクエリを実行するときです。
データ共有コンシューマーがデータベースロールを使用してポリシーで保護されたデータをクエリする場合は、ポリシーで保護されたデータをクエリする前に、
USE DATABASE database_name
コマンドで、 保護されたテーブル を含むデータベースをロードします。あるいは、保護されたオブジェクトの完全修飾名をクエリで指定します。これらのアプローチのいずれも、ユーザーのために現在のロールのロール階層内にあるデータベースロールをアクティブ化します。詳細については、 ポリシーで保護されたデータを共有する をご参照ください。マスキングポリシーや行アクセスポリシーなどのデータアクセスポリシーの
body
でこの関数を指定すると、この関数は保護されたテーブルのデータベースとスキーマを使用します。たとえば、
hr.tables.empl_info
テーブルに行アクセスポリシーを追加すると、関数は引数であるデータベースロール名または列名をhr
データベースで検索します。これは、そのデータベースに保護されたテーブルが含まれているためです。Snowflakeがインラインビューを作成する必要があるクエリ構造は避ける必要があります。このコンテキストでは、インラインビューは、Snowflakeがクエリ結果を決定するために作成する仮のビューです。たとえば、クエリがこの関数を呼び出したときに、クエリの最初に WITH 句を指定したり、 FROM 句でサブクエリを指定したりすると、Snowflakeはエラーを返します。
Could not resolve the database for IS_DATABASE_ROLE_IN_SESSION({})
ここで、
{}
はクエリ内にある関数引数のプレースホルダーです。エラーの理由は、Snowflakeが関数の引数のコンテキストを評価するために十分な情報を持っていないためです。エラーメッセージを解決するには、 WITH 句を削除するか、 FROM 句のサブクエリを削除するなど、クエリを単純化します。ユーザープロパティ
DEFAULT_SECONDARY_ROLES
値がALL
の場合は、ユーザーに付与された いずれかの ロールが指定されたロールの権限を継承すると、関数はTrue
を返します。共有データ を保護するマスキングポリシーまたは行アクセスポリシーの条件でこの関数を使用する場合は、ポリシーを含むデータベースとポリシーで保護されたデータが両方ともコンシューマーアカウントで共有されていることを確認します。ポリシーとポリシーで保護されたデータは、同じデータベースにある場合も、異なるデータベースにある場合もあります。詳細については、 ポリシーで保護されたデータを共有する をご参照ください。
これらの注意事項は、 IS_DATABASE_ROLE_IN_SESSION と IS_ROLE_IN_SESSION の両方の関数に適用されます。
構文を1つ使用します。
リテラル構文:
引数として渡すことができるデータベースロール名は1つだけです。
引数は文字列で、Snowflakeにロールが格納されているのと同一の大文字と小文字を使用する必要があります。詳細については、 識別子の要件 をご参照ください。
アカウントロールの名前はサポートされていません。
非リテラル構文:
引数として渡すことができる列は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('R1');
+-----------------------------------+
| IS_DATABASE_ROLE_IN_SESSION('R1') |
+-----------------------------------+
| True |
+-----------------------------------+
ROLE_NAME という名前の列のデータベースロールの値を返します。
SELECT * FROM myb.s1.t1 WHERE IS_DATABASE_ROLE_IN_SESSION(role_name);
安全なデータ共有に関するその他の例については、 ポリシーで保護されたデータを共有する をご参照ください。