카테고리:

컨텍스트 함수 (세션 오브젝트)

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 을 반환합니다. 이 동작은 데이터 공유 컨슈머 계정에서 역할 계층 구조가 노출되는 것을 방지합니다.

사용법 노트

  • 한 개의 구문을 사용합니다.

  • 이름 구문:

    • 하나의 역할 이름만 인자로 전달할 수 있습니다.

    • 인자는 문자열이어야 하며 Snowflake에 역할이 저장되는 방식과 동일한 대/소문자를 사용해야 합니다. 자세한 내용은 식별자 요구 사항 섹션을 참조하십시오.

  • 열 구문:

    • 하나의 열만 인자로 전달할 수 있습니다.

    • 열에는 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 이상인지 확인하십시오.

    정책 조건에서 역할 계층 구조와 상속된 권한을 평가해야 할 때는 이 함수를 사용하는 것이 좋습니다.

  • 결과 캐시:

    마스킹 정책이나 행 액세스 정책에서 이 함수를 사용하고 정책이나 정책으로 보호되는 테이블 또는 열 중 어떤 것도 이전 쿼리에서 변경되지 않은 경우 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

매핑 테이블을 사용하여 ROLE_NAME 이라는 매핑 테이블 열에서 권한이 부여된 역할을 조회하는 행 액세스 정책에서 AUTHZ_ROLE 이라는 열을 지정합니다. 정책을 만든 후 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