카테고리:

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

IS_DATABASE_ROLE_IN_SESSION

데이터베이스 역할이 현재 세션에 대한 사용자의 활성 기본 또는 보조 역할 계층 구조에 있는지, 또는 지정된 열에 현재 세션에 대한 사용자의 활성 기본 또는 보조 역할 계층 구조에 있는 데이터베이스 역할이 포함되어 있는지 확인합니다.

입력:

데이터베이스 역할의 이름을 지정하는 문자열 리터럴 또는 열 이름을 지정하는 비리터럴.

반환:
  • True:

    • 리터럴 인자(데이터베이스 역할 이름)의 경우 세션에서 현재 사용자의 활성 기본 역할 또는 보조 역할 이 지정 데이터베이스 역할의 권한을 상속합니다.

    • 비리터럴 인자(열 이름)의 경우 Snowflake는 테이블의 각 행을 평가하고 사용자의 현재 세션에서 데이터베이스 역할을 지정하는 값이 포함된 행을 반환합니다. 각 행은 사용 중인 데이터베이스 또는 쿼리에 지정된 데이터베이스에서 비롯된 데이터베이스 역할 이름에 해당합니다.

  • False:

    • 리터럴 인자의 경우 지정된 데이터베이스 역할이 현재 사용자의 기본 역할 또는 보조 역할의 역할 계층 구조에 없습니다.

    • 비리터럴 인자의 경우 데이터베이스 역할이 사용 중인 데이터베이스 또는 쿼리에 지정된 데이터베이스의 테이블 열에 없으면 행이 반환되지 않습니다.

    • database_name.database_role_name 형식으로 데이터베이스 역할의 정규화된 이름을 지정합니다. 대신 상대 이름(database_role_name)을 사용하십시오.

구문

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

IS_DATABASE_ROLE_IN_SESSION( '<string_literal>' )
Copy

비리터럴 — 열 지정:

IS_DATABASE_ROLE_IN_SESSION( <column_name> )
Copy

인자

'string_literal'

데이터베이스 역할의 이름입니다.

데이터베이스 역할의 상대 이름을 지정합니다. 정규화된 이름을 지정할 경우 이 함수는 False 로 평가됩니다.

column_name

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

사용법 노트

다음 참고 사항은 IS_DATABASE_ROLE_IN_SESSION 함수에만 적용됩니다.

  • 함수 인자가 문자열 리터럴인 경우 함수의 평가를 예측하려면 다음 테이블을 사용하십시오.

    컨텍스트

    평가

    쿼리.

    세션 데이터베이스.

    WHERE 절이 있는 테이블 또는 뷰 정의입니다.

    다음에 따라 달라집니다.

    • 사용 중인 데이터베이스가 있고 테이블이나 뷰의 상대 이름을 사용하는 경우 컨텍스트는 사용 중인 데이터베이스(세션 데이터베이스)입니다.

    • 테이블이나 뷰의 정규화된 이름을 지정하는 경우 컨텍스트는 테이블이나 뷰가 포함된 데이터베이스입니다.

    보호된 테이블 또는 뷰입니다.

    테이블이나 뷰가 포함된 데이터베이스입니다.

    소유자 권한 저장 프로시저입니다.

    저장 프로시저가 포함된 데이터베이스입니다.

    호출자 권한 저장 프로시저입니다.

    세션 데이터베이스.

    UDF

    보호된 테이블이나 뷰가 포함된 데이터베이스입니다.

    정책에서 UDF가 호출되지 않으면 함수는 UDF가 포함된 데이터베이스로 평가됩니다.

  • 데이터베이스 역할이 포함된 데이터베이스가 사용 중이거나 데이터베이스 역할이 포함된 동일한 데이터베이스의 테이블을 쿼리할 때 데이터베이스 역할이 역할 계층 구조에서 활성 상태가 됩니다.

    데이터 공유 컨슈머로서 데이터베이스 역할을 사용하여 정책으로 보호되는 데이터를 쿼리하는 경우 정책으로 보호되는 데이터를 쿼리하기 전에 USE DATABASE database_name 명령으로 보호된 테이블 이 포함된 데이터베이스를 로드하십시오. 또는 쿼리에 보호된 오브젝트의 정규화된 이름을 지정하십시오. 이러한 접근 방식 중 하나로 사용자에 대한 현재 역할의 역할 계층 구조에서 데이터베이스 역할이 활성화됩니다. 자세한 내용은 정책으로 보호되는 데이터 공유하기 섹션을 참조하십시오.

  • 마스킹 또는 행 액세스 정책과 같은 데이터 액세스 정책의 body 에 이 함수를 지정하는 경우 이 함수는 보호된 테이블의 데이터베이스와 스키마를 사용합니다.

    예를 들어, hr.tables.empl_info 테이블에 행 액세스 정책을 추가하면 해당 데이터베이스에 보호된 테이블이 포함되므로 함수는 hr 데이터베이스에서 해당 인자, 데이터베이스 역할 이름 또는 열 이름을 검색합니다.

  • Snowflake가 인라인 뷰를 생성해야 하는 쿼리 구조를 방지해야 합니다. 이 컨텍스트에서 인라인 뷰는 Snowflake가 쿼리 결과를 확인하려고 생성하는 임시 뷰입니다. 예를 들어 쿼리가 이 함수를 호출하고 쿼리 시작 부분에 WITH 절을 지정하거나 FROM 절에 하위 쿼리를 지정하면 Snowflake는 오류를 반환합니다.

    Could not resolve the database for IS_DATABASE_ROLE_IN_SESSION({})
    

    여기서 {} 는 쿼리에서 함수 인자의 자리 표시자입니다. 오류의 원인은 Snowflake에 함수 인자의 컨텍스트를 평가할 만큼 충분한 정보가 없는 것입니다. 오류 메시지를 해결하려면 WITH 절을 제거하거나 FROM 절에서 하위 쿼리를 제거하는 등 쿼리를 단순화하십시오.

  • 사용자 속성 DEFAULT_SECONDARY_ROLES 값이 ALL 일 때, 사용자에게 부여된 어떤 계정 역할이 지정된 데이터베이스 역할의 권한을 상속하는 경우 함수는 True 를 반환합니다.

  • 공유 데이터 를 보호하는 마스킹 정책 또는 행 액세스 정책의 조건에서 이 함수를 사용할 경우 정책이 포함된 데이터베이스와 정책으로 보호되는 데이터가 모두 컨슈머 계정에 공유되는지 확인하십시오. 정책과 정책으로 보호되는 데이터는 동일한 데이터베이스에 있을 수도 있고 서로 다른 데이터베이스에 있을 수도 있습니다. 자세한 내용은 정책으로 보호되는 데이터 공유하기 섹션을 참조하십시오.

다음 참고 사항은 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

  • 가상 열:

    테이블에 저장되는 계산된 값이 아닌 식에서 계산된 값의 결과를 포함하는 가상 열은 지원되지 않습니다.

    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_DATABASE_ROLE_IN_SESSION('R1');
Copy
+-----------------------------------+
| IS_DATABASE_ROLE_IN_SESSION('R1') |
+-----------------------------------+
| True                              |
+-----------------------------------+

ROLE_NAME 이라는 열에 대한 데이터베이스 역할 값을 반환합니다.

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

보안 데이터 공유와 관련된 추가적인 예는 정책으로 보호되는 데이터 공유하기 섹션을 참조하십시오.