カテゴリ:

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

IS_ROLE_IN_SESSION

指定されたアカウントロールが、現在アクティブなプライマリロール階層またはセカンダリロール階層にあるかどうかを確認します。

この関数は、セッションでアクティブ化されたロールではなく、 現在 アクティブなロールのセットのみを参照します。現在アクティブなロールは、所有者権限プロシージャやStreamlitを実行する場合など、セッションロールと異なる可能性があります。

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

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

構文

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

IS_ROLE_IN_SESSION( '<string_literal>' )
Copy

式 --- ロール式を指定します:

IS_ROLE_IN_SESSION( <expr> )
Copy

列 --- 列を指定します:

IS_ROLE_IN_SESSION( <column_name> )
Copy

引数

'string_literal'

ロールの名前。

expr

ロール名を返す式。

column_name

ロール名を含むテーブルまたはビューの列名。

戻り値

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

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

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

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

FALSE
  • 文字列リテラルまたは式引数の場合、指定されたロールは現在のプライマリロールまたはセカンダリロールのロール階層内でより上位にあるか、まったくロール階層内に存在しません。

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

NULL
  • この関数は、データ共有コンシューマーアカウントを通じてアクセスされた場合に、セキュアビューなどの共有オブジェクトで使用されると NULL を返します。この動作により、データ共有コンシューマーアカウントでロール階層が公開されなくなります。

使用上の注意

  • 構文を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;
    
    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 d1.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

マスキングポリシーの条件にロール式を指定します。

CREATE OR REPLACE MASKING POLICY allow_tag_role AS (val string)
RETURNS string ->
CASE
  WHEN IS_ROLE_IN_SESSION(SYSTEM$GET_TAG_ON_CURRENT_TABLE('D1.S1.ALLOWED_ROLE')) 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