カテゴリ:

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

IS_ROLE_IN_SESSION

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

入力

ロールを直接指定する文字列リテラル、または列名を指定する非リテラル。

戻り値
  • TRUE:

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

      DEFAULT_SECONDARY_ROLES 値が ALL の場合は、ユーザーに付与された いずれかの ロールが指定されたロールの権限を継承します。

      指定されたロールは、現在のプライマリロールまたはセカンダリロール(つまり、それぞれ CURRENT_ROLE または CURRENT_SECONDARY_ROLES によって返されるロール)、またはロール階層の下位にある任意のロールにすることができます。

    • 非リテラル引数の場合、Snowflakeは各行を評価し、ユーザーの現在のセッションでアクティブなプライマリまたはセカンダリロールを指定する値を含む行を返します。各行は、アクティブなプライマまたはセカンダリロールが表示できるロール名に対応しています。

  • FALSE:

    • 文字列リテラル引数の場合、指定されたロールは、現在のプライマリまたはセカンダリロールのロール階層において上位にあるか、ロール階層にまったくないかのどちらかです。

    • 非リテラル引数の場合、Snowflakeは各行を評価します。行に含まれるロール名が、現在のプライマリまたはセカンダリロールのロール階層で上位にあるか、ロール階層にまったくない場合、Snowflakeはこの行を返しません。この場合、Snowflakeは、アクティブなプライマリまたはセカンダリロールが表示できるロール名(存在する場合)を含む行のみを返します。

  • NULL:

    • データ共有コンシューマーアカウントでは、この関数は、マスキングポリシー条件などで共有オブジェクト(例: セキュア UDF またはセキュアビュー)を参照する場合に NULL を返します。この動作により、データ共有コンシューマーアカウントでロール階層が公開されなくなります。

こちらもご参照ください。

IS_OBJECT高度な列レベルセキュリティのトピック

構文

リテラル --- ロールを直接指定:

IS_ROLE_IN_SESSION( '<string_literal>' )
Copy

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

IS_ROLE_IN_SESSION( <column_name> )
Copy

引数

'string_literal'

ロールの名前。

column_name

テーブルまたはビューの列名。

使用上の注意

  • 構文を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_ROLE_IN_SESSION('ANALYST');

+-------------------------------+
| IS_ROLE_IN_SESSION('ANALYST') |
|-------------------------------|
| True                          |
+-------------------------------+
Copy

ROLE_NAME という名前の列のアクティブなプライマリまたはセカンダリロールの値を返します。

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

マスキングポリシー条件でロールを直接指定します。

CREATE OR REPLACE MASKING POLICY allow_analyst AS (val string)
RETURNS string ->
CASE
  WHEN IS_ROLE_IN_SESSION('ANALYST') THEN val
  ELSE '*******'
END;
Copy

行アクセスポリシーで AUTHZ_ROLE という名前の列(つまり、承認されたロール)を指定し、テーブル列にポリシーを設定します。

ポリシーを作成します。

CREATE OR REPLACE ROW ACCESS POLICY rap_authz_role AS (authz_role string)
RETURNS boolean ->
IS_ROLE_IN_SESSION(authz_role);
Copy

ポリシーをテーブルに追加します。

ALTER TABLE allowed_roles
  ADD ROW ACCESS POLICY rap_authz_role ON (authz_role);
Copy

マッピングテーブルを使用する行アクセスポリシーで AUTHZ_ROLE という名前の列を指定し、ROLE_NAME という名前のマッピングテーブル列で承認されたロールを検索します。ポリシーを作成したら、 AUTHZ_ROLE 列を含むテーブルにポリシーを追加します。

ポリシーを作成します。

CREATE OR REPLACE ROW ACCESS POLICY rap_authz_role_map AS (authz_role string)
RETURNS boolean ->
EXISTS (
  SELECT 1 FROM mapping_table m
  WHERE authz_role = m.key and IS_ROLE_IN_SESSION(m.role_name)
);
Copy

ポリシーをテーブルに追加します。

ALTER TABLE allowed_roles
  ADD ROW ACCESS POLICY rap_authz_role_map ON (authz_role);
Copy