IS_ROLE_IN_SESSION
IS_ROLE_IN_SESSION
IS_ROLE_IN_SESSION은 지정한 계정 역할이 현재 활성화된 기본(primary) 또는 보조(secondary) 역할 계층 안에 있는지 확인하는 컨텍스트 함수예요. 이 함수는 현재 활성화된 역할 집합만 보며, 세션에서 활성화된 역할을 보지는 않아요. 현재 활성 역할은 세션 역할과 다를 수 있어요(예: owner's rights 프로시저나 Streamlit을 실행할 때).
본문
카테고리: 컨텍스트 함수 (Session Object)
구문 (Syntax)
리터럴 — 역할을 직접 지정:
IS_ROLE_IN_SESSION( '<string_literal>' )
표현식 — 역할 표현식 지정:
IS_ROLE_IN_SESSION( <expr> )
열 — 열 지정:
IS_ROLE_IN_SESSION( <column_name> )
인자 (Arguments)
'<string_literal>' — 역할의 이름이에요.
<expr> — 역할의 이름을 반환하는 표현식이에요.
<column_name> — 역할의 이름을 담고 있는 테이블 또는 뷰의 열 이름이에요.
반환값 (Returns)
TRUE:
- 문자열 리터럴 또는 표현식 인자의 경우, 세션에서 현재 사용자의 활성 기본 역할 또는 보조 역할이 지정한 역할의 권한을 상속해요.
DEFAULT_SECONDARY_ROLES값이ALL이면, 사용자에게 부여된 모든 역할이 지정한 역할의 권한을 상속해요.- 지정한 역할은 현재 기본 역할 또는 보조 역할(CURRENT_ROLE 또는 CURRENT_SECONDARY_ROLES가 각각 반환하는 역할)이거나, 역할 계층에서 더 아래에 있는 역할일 수 있어요.
- 열 인자의 경우 Snowflake는 각 행을 평가하고, 사용자의 현재 세션에서 활성 기본 또는 보조 역할을 지정하는 값이 담긴 행을 반환해요. 각 행은 활성 기본 또는 보조 역할이 볼 수 있는 역할 이름에 대응해요.
FALSE:
- 문자열 리터럴 또는 표현식 인자의 경우, 지정한 역할이 현재 기본 또는 보조 역할의 역할 계층에서 더 위에 있거나, 역할 계층에 전혀 없는 경우예요.
- 비리터럴 인자의 경우 Snowflake는 각 행을 평가해요. 행에 현재 기본 또는 보조 역할의 역할 계층에서 더 위에 있거나 역할 계층에 전혀 없는 역할 이름이 담겨 있으면 Snowflake는 그 행을 반환하지 않아요. 이 경우 Snowflake는 활성 기본 또는 보조 역할이 볼 수 있는 역할 이름을 담은 행만(있으면) 반환해요.
NULL:
- 이 함수는 보안 뷰 같은 공유 객체에서, 데이터 공유 컨슈머 계정을 통해 접근할 때 NULL을 반환해요. 이 동작은 데이터 공유 컨슈머 계정에서 역할 계층이 노출되는 것을 방지해요.
사용 시 유의사항 (Usage notes)
-
구문 하나를 사용해요.
-
이름 구문:
- 인자로 역할 이름 하나만 전달할 수 있어요.
- 인자는 문자열이어야 하며 Snowflake에 역할이 저장된 것과 같은 대소문자를 사용해야 해요. 자세한 내용은 식별자 요구 사항을 참고해요.
-
열 구문:
- 인자로 열 하나만 전달할 수 있어요.
- 열은 STRING 데이터 타입이어야 해요.
- 열을 다음 중 하나로 지정해요:
column_nametable_name.column_nameschema_name.table_name.column_namedatabase_name.schema_name.table_name.column_name
-
가상 열(virtual column): 테이블에 저장된 계산 값이 아니라 표현식에서 계산된 값을 포함하는 가상 열은 지원되지 않아요.
SELECT IS_ROLE_IN_SESSION(UPPER(authz_role)) FROM t1;
가상 열은 표현식이 열 이름에 대한 별칭(alias)을 가질 때만 지원돼요:
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;
-
정책: 마스킹 정책(masking policy) 또는 행 접근 정책(row access policy)과 함께 이 함수를 사용한다면, Snowflake 계정이 Enterprise Edition 이상인지 확인해요. 정책 조건이 역할 계층과 상속된 권한을 평가해야 할 때 이 함수를 사용하는 것이 좋아요.
-
결과 캐시: 마스킹 정책이나 행 접근 정책에서 이 함수를 사용하는데, 이전 쿼리 이후로 정책이나 정책으로 보호되는 테이블·열이 바뀌지 않았다면, RESULT_SCAN 함수를 사용해 보호된 테이블에 대한 쿼리 결과를 반환할 수 있어요. 결과 캐시는 비리터럴 구문을 사용할 때만 적용돼요.
-
이 함수는 결정적이지 않고 Snowflake가 어떤 데이터를 구체화할지 결정할 수 없으므로, 구체화된 뷰(materialized view) 정의에는 사용할 수 없어요.
예시 (Examples)
지정한 역할에 부여된 권한이 세션의 현재 역할에 상속되는지 확인해요:
SELECT IS_ROLE_IN_SESSION('ANALYST');
+-------------------------------+
| IS_ROLE_IN_SESSION('ANALYST') |
|-------------------------------|
| True |
+-------------------------------+
ROLE_NAME이라는 열에 대해 활성 기본 또는 보조 역할 값을 반환해요:
SELECT *
FROM d1.s1.t1
WHERE IS_ROLE_IN_SESSION(t1.role_name);
마스킹 정책 조건에서 역할을 직접 지정해요:
CREATE OR REPLACE MASKING POLICY allow_analyst AS (val string)
RETURNS string ->
CASE
WHEN IS_ROLE_IN_SESSION('ANALYST') THEN val
ELSE '*******'
END;
마스킹 정책 조건에서 역할 표현식을 지정해요:
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;
행 접근 정책에서 AUTHZ_ROLE(즉, 승인된 역할)이라는 열을 지정한 뒤 테이블 열에 정책을 설정해요:
정책을 만들어요:
CREATE OR REPLACE ROW ACCESS POLICY rap_authz_role AS (authz_role string)
RETURNS boolean ->
IS_ROLE_IN_SESSION(authz_role);
테이블에 정책을 추가해요:
ALTER TABLE allowed_roles
ADD ROW ACCESS POLICY rap_authz_role ON (authz_role);
매핑 테이블을 사용해 매핑 테이블의 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)
);
테이블에 정책을 추가해요:
ALTER TABLE allowed_roles
ADD ROW ACCESS POLICY rap_authz_role_map ON (authz_role);