IS_DATABASE_ROLE_IN_SESSION

IS_DATABASE_ROLE_IN_SESSION (세션 내 데이터베이스 역할 확인)

현재 세션에서 사용자의 활성 기본(primary) 또는 보조(secondary) 역할 계층에 데이터베이스 역할이 포함되어 있는지, 또는 지정한 열(column)이 현재 세션의 활성 기본 또는 보조 역할 계층에 포함된 데이터베이스 역할 값을 담고 있는지 확인해요.

출처: Snowflake SQL Reference - IS_DATABASE_ROLE_IN_SESSION

본문

구문 (Syntax)

리터럴(literal) — 데이터베이스 역할을 직접 지정:

IS_DATABASE_ROLE_IN_SESSION( '<string_literal>' )

비리터럴(nonliteral) — 열을 지정:

IS_DATABASE_ROLE_IN_SESSION( <column_name> )

인자 (Arguments)

'string_literal'

데이터베이스 역할의 이름이에요. 데이터베이스 역할의 상대 이름(relative name)을 지정해요. 정규화된 이름(full qualified name)을 지정하면 함수는 False로 평가돼요.

column_name

테이블이나 뷰에 있는 열의 이름이에요.

반환 값 (Returns)

True

리터럴 인자(데이터베이스 역할 이름)의 경우, 세션에서 현재 사용자의 활성 기본 역할 또는 보조 역할이 지정된 데이터베이스 역할의 권한을 상속해요. 비리터럴 인자(열 이름)의 경우, Snowflake는 테이블의 각 행을 평가하고 사용자의 현재 세션에 있는 데이터베이스 역할을 지정하는 값을 담은 행을 반환해요. 각 행은 사용 중인 데이터베이스 또는 쿼리에서 지정된 데이터베이스에서 비롯된 데이터베이스 역할 이름에 해당해요.

False

리터럴 인자의 경우, 지정된 데이터베이스 역할이 현재 사용자의 기본 역할 또는 보조 역할의 역할 계층에 없어요. 비리터럴 인자의 경우, 데이터베이스 역할이 사용 중인 데이터베이스 또는 쿼리에서 지정된 데이터베이스의 테이블 열에 없으면 Snowflake는 행을 반환하지 않아요. database_name.database_role_name 형식의 정규화된 이름 대신 database_role_name 상대 이름을 사용해요.

사용 참고 사항 (Usage notes)

이 참고 사항은 IS_DATABASE_ROLE_IN_SESSION 함수에만 적용돼요:

  • 함수 인자가 문자열 리터럴일 때 함수 평가 결과를 예측하려면 다음 표를 사용해요. 컨텍스트와 평가 쿼리(Query): 세션 데이터베이스(Session database), WHERE 절이 있는 테이블 또는 뷰 정의. 다음에 따라 달라져요 — 사용 중인 데이터베이스가 있고 테이블이나 뷰의 상대 이름을 사용하면 컨텍스트는 사용 중인 데이터베이스(세션 데이터베이스)이고, 테이블이나 뷰의 정규화된 이름을 지정하면 컨텍스트는 테이블이나 뷰가 포함된 데이터베이스예요. 보호된 테이블 또는 뷰(Protected table or view): 테이블이나 뷰가 포함된 데이터베이스. Owner's Rights 저장 프로시저: 저장 프로시저가 포함된 데이터베이스. Caller's Rights 저장 프로시저: 세션 데이터베이스. UDF: 보호된 테이블/뷰가 포함된 데이터베이스.
  • 데이터베이스 역할을 담은 데이터베이스가 사용 중이거나, 데이터베이스 역할을 담은 데이터베이스와 같은 데이터베이스의 테이블을 쿼리할 때 데이터베이스 역할이 역할 계층에서 활성화돼요.
  • 마스킹 정책이나 행 접근 정책 같은 데이터 접근 정책 본문에 이 함수를 지정하면, 함수는 보호된 테이블의 데이터베이스와 스키마를 사용해요. 예를 들어 hr.tables.empl_info 테이블에 행 접근 정책을 추가하면, 함수는 보호된 테이블을 담고 있는 데이터베이스가 hr이므로 해당 데이터베이스에서 인자(데이터베이스 역할 이름 또는 열 이름)를 찾아요.
  • Snowflake가 인라인 뷰(inline view)를 만들도록 요구하는 쿼리 구조는 피해야 해요. 이 맥락에서 인라인 뷰란 쿼리 결과를 결정하기 위해 Snowflake가 만드는 임시 뷰예요. 예를 들어 쿼리에서 이 함수를 호출하면서 쿼리 시작 부분에 WITH 절을 지정하거나 FROM 절에 서브쿼리를 지정하면 Snowflake는 IS_DATABASE_ROLE_IN_SESSION({})과 같은 오류를 반환해요. 여기서 {}는 쿼리에서 함수 인자에 대한 자리 표시자예요. 오류의 이유는 Snowflake가 함수 인자의 컨텍스트를 평가할 충분한 정보를 갖지 못하기 때문이에요. 오류를 해결하려면 WITH 절 제거나 FROM 절의 서브쿼리 제거처럼 쿼리를 단순화하세요.
  • 사용자 속성 DEFAULT_SECONDARY_ROLES 값이 ALL이면, 사용자에게 부여된 계정 역할 중 어느 하나라도 지정된 데이터베이스 역할의 권한을 상속하면 함수는 True를 반환해요.
  • 공유 데이터(shared data)를 보호하는 마스킹 정책이나 행 접근 정책의 조건에서 이 함수를 사용할 때, 정책이 들어 있는 데이터베이스와 정책에 의해 보호되는 데이터를 모두 소비자 계정에 공유해야 해요. 정책과 정책 보호 데이터는 같은 데이터베이스나 서로 다른 데이터베이스에 있을 수 있어요.

이 참고 사항은 IS_DATABASE_ROLE_IN_SESSION과 IS_ROLE_IN_SESSION 함수 모두에 적용돼요:

  • 이름 구문: 한 번에 하나의 역할 이름만 인자로 전달할 수 있어요. 인자는 문자열이어야 하고 Snowflake에 역할이 저장된 방식과 같은 대소문자를 사용해야 해요.
  • 열 구문: 한 번에 하나의 열만 인자로 전달할 수 있어요. 열은 STRING 데이터 타입이어야 해요. 열은 다음 중 하나로 지정해요: column_name, table_name.column_name, schema_name.table_name.column_name, database_name.schema_name.table_name.column_name.
  • 가상 열(virtual column)은 지원되지 않아요. 가상 열은 표현식으로 계산된 값을 테이블에 저장하지 않고 결과로 담는 열이에요. 가상 열은 표현식이 열 이름에 별칭이 있는 경우에만 지원돼요:
SELECT IS_ROLE_IN_SESSION(UPPER(authz_role)) FROM t1;
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;
  • 정책(Policies): 마스킹 정책이나 행 접근 정책과 함께 이 함수를 사용하려면 Snowflake 계정이 Enterprise Edition 이상인지 확인하세요. 정책 조건에서 역할 계층과 상속된 권한을 평가해야 할 때 이 함수를 사용하는 것을 권장해요.
  • 결과 캐시(Result cache): 마스킹 정책이나 행 접근 정책에서 이 함수를 사용하고, 정책이나 정책이 보호하는 테이블/열이 이전 쿼리와 비교해 변경되지 않았다면, RESULT_SCAN 함수를 사용해 보호된 테이블에 대한 쿼리 결과를 반환할 수 있어요. 결과 캐시는 비리터럴 구문을 사용할 때만 적용돼요.
  • 이 함수들은 결정적(deterministic)이지 않아 Snowflake가 어떤 데이터를 구체화할지 결정할 수 없으므로, 구체화된 뷰(materialized view) 정의에서는 사용할 수 없어요.

예시 (Examples)

지정된 역할에 부여된 권한이 세션의 현재 역할에 상속되는지 확인:

SELECT IS_DATABASE_ROLE_IN_SESSION('R1');
+-----------------------------------+
| IS_DATABASE_ROLE_IN_SESSION('R1') |
+-----------------------------------+
| True                              |
+-----------------------------------+

ROLE_NAME 열에 대한 데이터베이스 역할 값을 반환:

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

더 알아보기 (Learn more)