다음을 통해 공유


행 필터 및 열 마스크를 사용하여 중요한 테이블 데이터 필터링

Important

이 기능은 공개 미리 보기 상태입니다.

이 문서에서는 행 필터, 열 마스크 및 매핑 테이블을 사용하여 테이블의 중요한 데이터를 필터링하는 방법에 대한 지침과 예제를 제공합니다. 이러한 기능에는 Unity 카탈로그가 필요합니다.

행 필터란?

행 필터를 사용하면 쿼리가 필터 조건을 충족하는 행만 반환하도록 테이블에 필터를 적용할 수 있습니다. 행 필터를 SQL UDF(사용자 정의 함수)로 구현합니다. Python 및 Scala UDF도 지원되지만 SQL UDF로 래핑된 경우에만 지원됩니다.

열 마스크란?

열 마스크를 사용하면 테이블 열에 마스킹 함수를 적용할 수 있습니다. 마스킹 함수는 쿼리 런타임에 평가되며 대상 열의 각 참조를 마스킹 함수의 결과로 대체합니다. 대부분의 사용 사례에서 열 마스크는 원래 열 값을 반환할지 아니면 호출하는 사용자의 ID에 따라 수정할지를 결정합니다. 열 마스크는 SQL UDF 또는 SQL UDF로 래핑된 Python 또는 Scala UDF로 작성된 식입니다.

각 테이블 열에는 하나의 마스킹 함수만 적용할 수 있습니다. 마스킹 함수는 열의 마스크되지 않은 값을 입력으로 사용하고 마스킹된 값을 결과로 반환합니다. 마스킹 함수의 반환 값은 마스킹되는 열과 동일한 형식이어야 합니다. 마스킹 함수는 추가 열을 입력 매개 변수로 사용하여 마스킹 논리에 사용할 수도 있습니다.

이러한 필터와 동적 뷰의 차이점은 무엇인가요?

동적 뷰, 행 필터 및 열 마스크를 사용하면 모두 테이블에 복잡한 논리를 적용하고 쿼리 런타임에 필터링 결정을 처리할 수 있습니다.

동적 뷰는 하나 이상의 원본 테이블의 추상화된 읽기 전용 보기입니다. 사용자는 원본 테이블에 직접 액세스하지 않고도 동적 보기에 액세스할 수 있습니다. 동적 뷰를 만들면 원본 테이블이나 같은 스키마에 있는 다른 테이블 및 뷰의 이름과 일치하지 않아야 하는 새 테이블 이름이 정의됩니다.

반면에 행 필터 또는 열 마스크를 대상 테이블에 연결하면 새 테이블 이름을 도입하지 않고 테이블 자체에 해당 논리가 직접 적용됩니다. 후속 쿼리는 원래 이름을 사용하여 대상 테이블을 직접 참조할 수 있습니다.

읽기 전용 테이블에 필터 및 마스크와 같은 변환 논리를 적용해야 하고 사용자가 다른 이름을 사용하여 동적 보기를 참조할 수 있는 경우 동적 보기를 사용합니다. 델타 공유를 사용하여 데이터를 공유할 때 데이터를 필터링하려면 동적 보기를 사용해야 합니다. 특정 데이터에 대해 식을 필터링하거나 계산하지만 원래 이름을 사용하여 테이블에 대한 액세스 권한을 사용자에게 제공하려는 경우 행 필터 및 열 마스크를 사용합니다.

시작하기 전에

테이블에 행 필터 및 열 마스크를 추가하려면 다음이 있어야 합니다.

  • Unity 카탈로그에 사용할 수 있는 작업 영역입니다.
  • Unity 카탈로그에 등록된 함수입니다. SQL UDF 또는 Unity 카탈로그에 등록되고 SQL UDF에 래핑된 Python 또는 Scala UDF일 수 있습니다. 자세한 내용은 UDF(사용자 정의 함수)란?, 열 마스크 절 및 ROW FILTER 절을 참조하세요.

다음 요구 사항도 충족해야 합니다.

  • 행 필터 또는 열 마스크를 테이블에 추가하는 함수를 할당하려면 함수, USE SCHEMA 스키마 및 USE CATALOG 부모 카탈로그에 대한 권한이 있어야 합니다EXECUTE.
  • 새 테이블을 만들 때 필터 또는 마스크를 추가하려면 스키마에 CREATE TABLE 대한 권한도 있어야 합니다.
  • 기존 테이블을 변경하여 필터 또는 마스크를 추가하려면 테이블 소유자이거나 MODIFY 테이블에 대한 권한이 있어야 합니다.

행 필터 또는 열 마스크가 있는 테이블에 액세스하려면 컴퓨팅 리소스가 다음 요구 사항을 충족해야 합니다.

  • Databricks Runtime 12.2 LTS 이상의 공유 액세스 모드 클러스터 또는 SQL 웨어하우스.

행 필터 적용

행 필터를 만들려면 UDF(함수)를 작성하여 필터 정책을 정의한 다음 테이블에 적용합니다. 각 테이블에는 행 필터가 하나만 있을 수 있습니다. 행 필터는 각 입력 매개 변수가 해당 테이블의 한 열에 바인딩되는 0개 이상의 입력 매개 변수를 허용합니다.

카탈로그 탐색기 또는 SQL 명령을 사용하여 행 필터를 적용할 수 있습니다. 카탈로그 탐색기 지침에서는 함수를 이미 만들었으며 해당 함수가 Unity 카탈로그에 등록되어 있다고 가정합니다. SQL 지침에는 행 필터 함수를 만들고 테이블에 적용하는 예제가 포함됩니다.

카탈로그 탐색기

  1. Azure Databricks 작업 영역에서 카탈로그를 클릭합니다카탈로그 아이콘.
  2. 필터링할 테이블을 찾아보거나 검색합니다.
  3. 개요 탭에서 행 필터: 필터 추가를 클릭합니다.
  4. 행 필터 추가 대화 상자에서 필터 함수가 포함된 카탈로그 및 스키마를 선택한 다음, 함수를 선택합니다.
  5. 확장된 대화 상자에서 함수 정의를 보고 함수 문에 포함된 열과 일치하는 테이블 열을 선택합니다.
  6. 추가를 클릭합니다.

테이블에서 필터를 제거하려면 fx 행 필터를 클릭하고 제거를 클릭합니다.

SQL

행 필터를 만든 다음 기존 테이블에 추가하려면 .를 사용하여 ALTER TABLE함수를 사용하고 CREATE FUNCTION 적용합니다. 를 사용하여 CREATE TABLE테이블을 만들 때 함수를 적용할 수도 있습니다.

  1. 행 필터를 만듭니다.

    CREATE FUNCTION <function_name> (<parameter_name> <parameter_type>, ...)
    RETURN {filter clause whose output must be a boolean};
    
  2. 열 이름을 사용하여 테이블에 행 필터를 적용합니다.

    ALTER TABLE <table_name> SET ROW FILTER <function_name> ON (<column_name>, ...);
    

추가 구문 예제:

  • 테이블에서 행 필터를 제거합니다.

    ALTER TABLE <table_name> DROP ROW FILTER;
    
  • 행 필터 수정:

    Run a DROP FUNCTION statement to drop the existing function, or use CREATE OR REPLACE FUNCTION to replace it.
    
  • 행 필터를 삭제합니다.

    ALTER TABLE <table_name> DROP ROW FILTER;
    DROP FUNCTION <function_name>;
    

    참고 항목

    함수를 ALTER TABLE ... DROP ROW FILTER 삭제하기 전에 명령을 수행해야 합니다. 그렇지 않으면 테이블에 액세스할 수 없는 상태가 됩니다.

    이러한 방식으로 테이블에 액세스할 수 없게 되면 테이블을 변경하고 다음을 사용하여 ALTER TABLE <table_name> DROP ROW FILTER;분리된 행 필터 참조를 삭제합니다.

ROW FILTER 절참조하세요.

행 필터 예제

이 예제에서는 해당 지역의 US그룹 admin 멤버에 적용되는 SQL 사용자 정의 함수를 만듭니다.

이 샘플 함수가 테이블에 적용 sales 되면 그룹의 멤버가 admin 테이블의 모든 레코드에 액세스할 수 있습니다. 비관리 RETURN_IF 자가 함수를 호출하는 경우 조건이 실패하고 region='US' 식이 평가되어 해당 지역의 레코드 US 만 표시하도록 테이블을 필터링합니다.

CREATE FUNCTION us_filter(region STRING)
RETURN IF(IS_ACCOUNT_GROUP_MEMBER('admin'), true, region='US');

행 필터로 테이블에 함수를 적용합니다. 그런 다음 테이블의 sales 후속 쿼리는 행의 하위 집합을 반환합니다.

CREATE TABLE sales (region STRING, id INT);
ALTER TABLE sales SET ROW FILTER us_filter ON (region);

행 필터를 사용하지 않도록 설정합니다. 이후 테이블의 사용자 쿼리는 sales 테이블의 모든 행을 반환합니다.

ALTER TABLE sales DROP ROW FILTER;

함수가 문의 일부로 CREATE TABLE 행 필터로 적용된 테이블을 만듭니다. 이후 테이블의 쿼리는 sales 각각 행의 하위 집합을 반환합니다.

CREATE TABLE sales (region STRING, id INT)
WITH ROW FILTER us_filter ON (region);

열 마스크 적용

열 마스크를 적용하려면 함수(UDF)를 만든 다음 테이블 열에 적용합니다.

카탈로그 탐색기 또는 SQL 명령을 사용하여 열 마스크를 적용할 수 있습니다. 카탈로그 탐색기 지침에서는 함수를 이미 만들었으며 해당 함수가 Unity 카탈로그에 등록되어 있다고 가정합니다. SQL 지침에는 열 마스크 함수를 만들고 테이블 열에 적용하는 예제가 포함됩니다.

카탈로그 탐색기

  1. Azure Databricks 작업 영역에서 카탈로그를 클릭합니다카탈로그 아이콘.
  2. 테이블을 찾아보거나 검색합니다.
  3. 개요 탭에서 열 마스크를 적용할 행을 찾아 마스크 편집 아이콘을 편집 아이콘 클릭합니다.
  4. 열 마스크 추가 대화 상자에서 필터 함수가 포함된 카탈로그 및 스키마를 선택한 다음, 함수를 선택합니다.
  5. 확장된 대화 상자에서 함수 정의를 봅니다. 함수에 마스킹되는 열 외에 매개 변수가 포함된 경우 해당 추가 함수 매개 변수를 캐스팅할 테이블 열을 선택합니다.
  6. 추가를 클릭합니다.

테이블에서 열 마스크를 제거하려면 테이블 행에서 fx 열 마스크를 클릭하고 제거를 클릭합니다.

SQL

열 마스크를 만들고 기존 테이블 열에 추가하려면 .를 사용하여 ALTER TABLE마스킹 함수를 사용하고 CREATE FUNCTION 적용합니다. 를 사용하여 CREATE TABLE테이블을 만들 때 함수를 적용할 수도 있습니다.

마스킹 함수를 적용하는 데 사용합니다 SET MASK . MASK 절 내에서 Azure Databricks 기본 제공 런타임 함수를 사용하거나 다른 사용자 정의 함수를 호출할 수 있습니다. 일반적인 사용 사례에는 함수를 실행하는 호출 사용자의 ID를 검사 current_user( ) 하거나 해당 사용자가 사용하는 is_account_group_member( )멤버인 그룹을 가져오는 것이 포함됩니다. 자세한 내용은 열 마스크 절기본 제공 함수를 참조하세요.

  1. 열 마스크를 만듭니다.

    CREATE FUNCTION <function_name> (<parameter_name> <parameter_type>, ...)
    RETURN {expression with the same type as the first parameter};
    
  2. 기존 테이블의 열에 열 마스크를 적용합니다.

    ALTER TABLE <table_name> ALTER COLUMN <col_name> SET MASK <mask_func_name> USING COLUMNS <additional_columns>;
    

추가 구문 예제:

  • 테이블의 열에서 열 마스크를 제거합니다.

    ALTER TABLE <table_name> ALTER COLUMN <column where mask is applied> DROP MASK;
    
  • 열 마스크 수정: DROP 기존 함수 또는 사용 CREATE OR REPLACE TABLE.

  • 열 마스크를 삭제합니다.

    ALTER TABLE <table_name> ALTER COLUMN <column where mask is applied> DROP MASK;
    DROP FUNCTION <function_name>;
    

    참고 항목

    함수를 ALTER TABLE 삭제하기 전에 명령을 수행해야 합니다. 그렇지 않으면 테이블에 액세스할 수 없는 상태가 됩니다.

    이러한 방식으로 테이블에 액세스할 수 없게 되면 테이블을 변경하고 다음을 사용하여 ALTER TABLE <table_name> ALTER COLUMN <column where mask is applied> DROP MASK;분리된 마스크 참조 참조를 삭제합니다.

열 마스크 예제

이 예제에서는 그룹의 구성원인 사용자만 해당 열의 HumanResourceDept 값을 볼 수 있도록 열을 마스킹 ssn 하는 사용자 정의 함수를 만듭니다.

CREATE FUNCTION ssn_mask(ssn STRING)
  RETURN CASE WHEN is_member('HumanResourceDept') THEN ssn ELSE '***-**-****' END;

테이블에 새 함수를 열 마스크로 적용합니다. 테이블을 만들 때 또는 그 이후에 열 마스크를 추가할 수 있습니다.

--Create the `users` table and apply the column mask in a single step:

CREATE TABLE users (
  name STRING,
  ssn STRING MASK ssn_mask);
--Create the `users` table and apply the column mask after:

CREATE TABLE users
  (name STRING, ssn STRING);

ALTER TABLE users ALTER COLUMN ssn SET MASK ssn_mask;

이제 쿼리 사용자가 그룹의 멤버가 아닌 경우 해당 테이블의 HumanResourceDept 쿼리는 마스킹된 ssn 열 값을 반환합니다.

SELECT * FROM users;
  James  ***-**-****

쿼리가 열의 원래 값을 반환하도록 열 마스크를 사용하지 않도록 설정하려면 다음을 ssn 수행합니다.

ALTER TABLE users ALTER COLUMN ssn DROP MASK;

매핑 테이블을 사용하여 액세스 제어 목록 만들기

행 수준 보안을 달성하려면 매핑 테이블(또는 액세스 제어 목록)을 정의하는 것이 좋습니다. 각 매핑 테이블은 특정 사용자 또는 그룹에서 액세스할 수 있는 원래 테이블의 데이터 행을 인코딩하는 포괄적인 매핑 테이블입니다. 매핑 테이블은 직접 조인을 통해 팩트 테이블과 간단한 통합을 제공하기 때문에 유용합니다.

이 방법론은 사용자 지정 요구 사항으로 많은 사용 사례를 해결하는 데 유용하다는 것을 증명합니다. 예를 들면 다음과 같습니다.

  • 특정 사용자 그룹에 대해 다른 규칙을 수용하는 동안 로그인한 사용자에 따라 제한을 적용합니다.
  • 다양한 규칙 집합이 필요한 조직 구조와 같은 복잡한 계층 구조를 만듭니다.
  • 외부 원본 시스템에서 복잡한 보안 모델을 복제합니다.

이러한 방식으로 매핑 테이블을 채택하면 이러한 어려운 시나리오를 효과적으로 해결하고 강력한 행 수준 및 열 수준 보안 구현을 보장할 수 있습니다.

매핑 테이블 예제

매핑 테이블을 사용하여 현재 사용자가 목록에 있는지 확인합니다.

USE CATALOG main;

새 매핑 테이블을 만듭니다.

DROP TABLE IF EXISTS valid_users;

CREATE TABLE valid_users(username string);
INSERT INTO valid_users
VALUES
  ('fred@databricks.com'),
  ('barney@databricks.com');

새 필터를 만듭니다.

참고 항목

호출자로 실행되는 사용자 컨텍스트(예 CURRENT_USER : 함수) IS_MEMBER 를 확인하는 함수를 제외하고 모든 필터는 정의자의 권한으로 실행됩니다.

이 예제에서 함수는 현재 사용자가 테이블에 있는지 확인합니다 valid_users . 사용자가 발견되면 함수는 true를 반환합니다.

DROP FUNCTION IF EXISTS row_filter;

CREATE FUNCTION row_filter()
  RETURN EXISTS(
    SELECT 1 FROM valid_users v
    WHERE v.username = CURRENT_USER()
);

아래 예제에서는 테이블을 만드는 동안 행 필터를 적용합니다. 나중에 문을 사용하여 필터를 ALTER TABLE 추가할 수도 있습니다. 전체 테이블에 적용할 때 구문을 사용합니다 ON () . 특정 행 ON (row);의 경우 .

DROP TABLE IF EXISTS data_table;

CREATE TABLE data_table
  (x INT, y INT, z INT)
  WITH ROW FILTER row_filter ON ();

INSERT INTO data_table VALUES
  (1, 2, 3),
  (4, 5, 6),
  (7, 8, 9);

테이블에서 데이터를 선택합니다. 사용자가 테이블에 있는 valid_users 경우에만 데이터를 반환해야 합니다.

SELECT * FROM data_table;

열 값에 관계없이 테이블의 모든 행을 볼 수 있는 액세스 권한이 항상 있어야 하는 계정으로 구성된 매핑 테이블을 만듭니다.

CREATE TABLE valid_accounts(account string);
INSERT INTO valid_accounts
VALUES
  ('admin'),
  ('cstaff');

이제 행의 모든 열 값이 5보다 작거나 호출하는 사용자가 위의 매핑 테이블의 멤버인지를 반환 true 하는 SQL UDF를 만듭니다.

CREATE FUNCTION row_filter_small_values (x INT, y INT, z INT)
  RETURN (x < 5 AND y < 5 AND z < 5)
  OR EXISTS(
    SELECT 1 FROM valid_accounts v
    WHERE IS_ACCOUNT_GROUP_MEMBER(v.account));

마지막으로 SQL UDF를 테이블에 행 필터로 적용합니다.

ALTER TABLE data_table SET ROW FILTER row_filter_small_values ON (x, y, z);

지원되는 기능 및 형식

  • SQL 워크로드용 Databricks SQL 및 Databricks Notebook이 지원됩니다.

  • 권한이 있는 MODIFY 사용자의 DML 명령이 지원됩니다. 필터 및 마스크는 읽은 데이터와 DELETE 문에 UPDATE 적용되며 기록된 데이터(포함INSERT)에 적용되지 않습니다.

  • 지원되는 데이터 형식:

    • 관리 테이블 및 외부 테이블에 대한 델타 및 Parquet입니다.
    • Lakehouse 페더레이션을 사용하여 Unity 카탈로그에 등록된 외세 테이블에 대한 여러 다른 데이터 형식입니다.
  • SQL, Python 및 Scala UDF는 Unity 카탈로그에 등록되어 있는 한 행 필터 또는 열 마스크 함수로 지원됩니다. Python 및 Scala UDF는 SQL UDF에 래핑되어야 합니다.

  • 열 마스크 또는 행 필터가 있는 테이블의 보기가 지원됩니다.

  • Delta Lake 변경 데이터 피드는 스키마가 대상 테이블에 적용되는 행 필터 및 열 마스크와 호환되는 한 지원됩니다.

  • MERGE 문은 원본 테이블, 대상 테이블 또는 둘 다 행 필터와 열 마스크를 사용할 때 지원됩니다. 여기에는 간단한 하위 쿼리를 포함하는 행 필터 함수가 있는 테이블이 포함되지만 다음 섹션에 나열된 제한 사항이 있습니다.

  • Databricks SQL 구체화된 뷰 및 Databricks SQL 스트리밍 테이블 은 행 필터 및 열 마스크(공개 미리 보기)를 지원합니다.

    • Databricks SQL 구체화된 뷰 또는 스트리밍 테이블에 행 필터 및 열 마스크를 추가할 수 있습니다.
    • 행 필터 및 열 마스크를 포함하는 테이블에서 Databricks SQL 구체화된 뷰 또는 스트리밍 테이블을 정의할 수 있습니다.

제한 사항

  • 12.2 LTS 미만의 Databricks 런타임 버전은 행 필터 또는 열 마스크를 지원하지 않습니다. 이러한 런타임은 안전하게 실패합니다. 즉, 지원되지 않는 버전의 이러한 런타임에서 테이블에 액세스하려고 하면 데이터가 반환되지 않습니다.
  • Delta Live Tables에 선언된 구체화된 뷰 및 스트리밍 테이블은 행 필터 또는 열 마스크를 지원하지 않습니다.
  • 델타 공유는 행 수준 보안 또는 열 마스크에서 작동하지 않습니다.
  • 시간 이동은 행 수준 보안 또는 열 마스크에서 작동하지 않습니다.
  • 테이블 샘플링은 행 수준 보안 또는 열 마스크에서 작동하지 않습니다.
  • 정책이 있는 테이블의 파일에 대한 경로 기반 액세스는 지원되지 않습니다.
  • 원래 정책에 대한 순환 종속성이 있는 행 필터 또는 열 마스크 정책은 지원되지 않습니다.
  • 깊고 얕은 클론은 지원되지 않습니다.
  • MERGE 문은 중첩, 집계, 창, 제한 또는 비결정적 함수를 포함하는 행 필터 정책이 있는 테이블을 지원하지 않습니다.
  • Delta Lake API는 지원되지 않습니다.
  • SHOW CREATE TABLE 구체화된 뷰 및 스트리밍 테이블에는 행 필터 및 열 마스크 정보가 표시되지 않습니다.

단일 사용자 컴퓨팅 제한 사항

단일 사용자 클러스터에서 액세스하는 테이블에 행 필터 또는 열 마스크를 추가하지 마세요. 이 작업은 일반적으로 워크플로(작업)의 컨텍스트에서 수행됩니다. 공개 미리 보기 중에는 필터 또는 마스크가 적용된 경우 단일 사용자 클러스터에서 테이블에 액세스할 수 없습니다.