- カテゴリ:
- コンテキスト関数 (セッションオブジェクト) 
IS_DATABASE_ROLE_IN_SESSION¶
データベースロールが、現セッションのユーザーのアクティブなプライマリまたはセカンダリロール階層にあるかどうか、または指定された列に、現セッションのユーザーのアクティブなプライマリまたはセカンダリロール階層にあるデータベースロールが含まれているかどうかを確認します。
- こちらもご参照ください。
構文¶
リテラル --- データベースロールを直接指定:
IS_DATABASE_ROLE_IN_SESSION( '<string_literal>' )
非リテラル --- 列を指定:
IS_DATABASE_ROLE_IN_SESSION( <column_name> )
引数¶
- 'string_literal'
- データベースロールの名前。 - データベースロールの相対名を指定します。完全修飾名を指定した場合、この関数は - Falseと評価されます。
- column_name
- テーブルまたはビューの列名。 
戻り値¶
- True
- リテラル引数(データベースロール名)の場合、セッション内にある現在のユーザーのアクティブな プライマリロールまたはセカンダリロール は、指定されたデータベースロールの権限を継承します。 
- 非リテラル引数(列名)の場合、Snowflakeはテーブルの各行を評価し、ユーザーの現在のセッションにおけるデータベースロールを指定する値を含む行を返します。各行は、使用中のデータベースまたはクエリで指定されたデータベースに由来するデータベースロール名に対応しています。 
 
- False
- リテラル引数の場合、指定されたデータベースロールは現在のユーザーのプライマリロールまたはセカンダリロールのロール階層にありません。 
- 非リテラル引数の場合、データベースロールが使用中のデータベースまたはクエリで指定されたデータベースのテーブル列にない場合、Snowflakeは行を返しません。 
- データベースロールの完全修飾名を - database_name.database_role_nameの形式で指定します。代わりに相対名- database_role_nameを使用します。
 
使用上の注意¶
これらの注意事項は IS_DATABASE_ROLE_IN_SESSION 関数にのみ適用されます。
- このテーブルを使用して、関数の引数が文字列リテラルである場合の関数の評価を予測します。 - コンテキスト - 評価 - クエリ。 - セッションデータベース。 - WHERE 句を持つテーブルまたはビュー定義。 - 次によって異なります。 - 使用中のデータベースがあり、テーブルやビューの相対名を使用する場合、コンテキストは使用中のデータベース(セッションデータベース)になります。 
- テーブルまたはビューの完全修飾名を指定した場合、コンテキストはテーブルまたはビューを含むデータベースになります。 
 - 保護されたテーブルまたはビュー。 - テーブルまたはビューを含むデータベース。 - 所有者権限ストアドプロシージャ。 - ストアドプロシージャを含むデータベース。 - 呼び出し元権限ストアドプロシージャ。 - セッションデータベース。 - UDF - 保護されたテーブルまたはビューを含むデータベース。 - ポリシーの中で UDF が呼び出されなかった場合、関数は UDF を含むデータベースと評価されます。 
- データベースロールがロール階層でアクティブ化されるのは、そのデータベースロールを含むデータベースが使用されているとき、またはそのデータベースロールを含む同じデータベース内のテーブルにクエリを実行するときです。 
- マスキングポリシーや行アクセスポリシーなどのデータアクセスポリシーの - 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);
安全なデータ共有に関するその他の例については、 ポリシーで保護されたデータを共有する をご参照ください。