カテゴリ:

コンテキスト関数 (セッションオブジェクト)

IS_DATABASE_ROLE_IN_SESSION

データベースロールが、現セッションのユーザーのアクティブなプライマリまたはセカンダリロール階層にあるかどうか、または指定された列に、現セッションのユーザーのアクティブなプライマリまたはセカンダリロール階層にあるデータベースロールが含まれているかどうかを確認します。

入力

文字列リテラルでデータベースロールの名前を指定するか、非リテラルで列名を指定します。

戻り値
  • True:

    • リテラル引数(データベースロール名)の場合、セッション内にある現在のユーザーのアクティブな プライマリロールまたはセカンダリロール は、指定されたデータベースロールの権限を継承します。

    • 非リテラル引数(列名)の場合、Snowflakeはテーブルの各行を評価し、ユーザーの現在のセッションにおけるデータベースロールを指定する値を含む行を返します。各行は、使用中のデータベースまたはクエリで指定されたデータベースに由来するデータベースロール名に対応しています。

  • False:

    • リテラル引数の場合、指定されたデータベースロールは現在のユーザーのプライマリロールまたはセカンダリロールのロール階層にありません。

    • 非リテラル引数の場合、データベースロールが使用中のデータベースまたはクエリで指定されたデータベースのテーブル列にない場合、Snowflakeは行を返しません。

構文

リテラル --- データベースロールを直接指定:

IS_DATABASE_ROLE_IN_SESSION( '<string_literal>' )
Copy

非リテラル --- 列を指定:

IS_DATABASE_ROLE_IN_SESSION( <column_name> )
Copy

引数

'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;
    
    Copy

    仮想列は、式に列名のエイリアスがある場合にのみサポートされます。

    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;
    
    Copy
  • ポリシー:

    マスキングポリシー または 行アクセスポリシー でこれらの関数を使用する場合は、SnowflakeアカウントがEnterprise Edition以上であることを確認してください。

    ポリシー条件でロール階層と継承された権限を評価する必要がある場合、Snowflakeはこの関数を使用することをお勧めします。

  • 結果キャッシュ:

    この関数をマスキングポリシーまたは行アクセスポリシーで使用しており、ポリシーも、ポリシーによって保護されているテーブルや列も前のクエリから変更されていない場合は、 RESULT_SCAN 関数を使用して、保護されたテーブルに対するクエリの結果を返すことができます。結果キャッシュは、非リテラル構文を使用する場合にのみ適用されます。

  • マテリアライズドビュー定義ではこれらの関数を使用できません。関数が決定論的ではなく、Snowflakeは具体化するデータを決定できないためです。

指定されたロールに付与された権限が、セッション内の現在のロールに継承されているかどうかを確認します。

SELECT IS_DATABASE_ROLE_IN_SESSION('DB1.R1');
Copy
+---------------------------------------+
| IS_DATABASE_ROLE_IN_SESSION('DB1.R1') |
+---------------------------------------+
| True                                  |
+---------------------------------------+

ROLE_NAME という名前の列のデータベースロールの値を返します。

SELECT *
FROM myb.s1.t1
WHERE IS_DATABASE_ROLE_IN_SESSION(role_name);
Copy

安全なデータ共有に関するその他の例については、 ポリシーで保護されたデータを共有する をご参照ください。