카테고리:

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

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

테이블 또는 뷰의 열 이름입니다.

사용법 노트

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

  • 리터럴 구문:

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

    • 인자는 문자열이어야 하며 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 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

매핑 테이블을 사용하여 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