분석 규칙을 사용하여 데이터 액세스 제한

이 문서에서는 BigQuery용 GoogleSQL의 분석 규칙에 대한 일반적인 정보를 제공합니다.

분석 규칙이란 무엇인가요?

분석 규칙은 데이터 공유 조건을 적용합니다. BigQuery를 사용하면 데이터 클린룸을 사용하거나 뷰에 분석 규칙을 직접 적용하여 뷰에 분석 규칙을 적용할 수 있습니다. 분석 규칙을 적용하면 해당 뷰를 쿼리하는 모든 사용자가 뷰에서 해당 분석 규칙을 준수해야 합니다. 분석 규칙이 충족되면 쿼리는 분석 규칙을 충족하는 출력을 생성합니다. 쿼리가 분석 규칙을 충족하지 않으면 오류가 발생합니다.

지원되는 분석 규칙

다음 분석 규칙이 지원됩니다.

  • 집계 기준 분석 규칙: 데이터 세트에 있어야 하는 최소 고유 항목 수를 적용합니다. 문 또는 데이터 클린룸을 사용하여 뷰에 이 규칙을 적용할 수 있습니다.
  • 개인 정보 차등 보호 분석 규칙: 개인 정보 차등 보호로 데이터가 보호될 때 구독자에게 표시되는 데이터를 제한하는 개인 정보 보호 예산을 적용합니다. 문 또는 데이터 클린룸을 사용하여 뷰에 이 규칙을 적용할 수 있습니다.
  • 조인 제한 분석 규칙: 특정 열에서 사용할 수 있는 조인 유형을 제한합니다. 조인이 쿼리에 있을 필요가 없으며 특정 열을 차단할 수 있습니다. 집계 기준 분석 규칙 또는 개인 정보 차등 보호 분석 규칙에 포함될 수 있습니다. 문 또는 데이터 클린룸을 사용하여 뷰에 이 규칙을 적용할 수 있습니다.
  • 목록 겹침 분석 규칙: 조인 제한 분석 규칙과 유사하지만 다른 분석 규칙과 함께 사용할 수 없습니다. 데이터 클린룸을 사용하여 뷰에 이 규칙을 적용할 수 있습니다.

집계 기준 분석 규칙

집계 기준 분석 규칙은 데이터 세트에 존재해야 하는 최소의 고유 항목 수를 적용하여 쿼리 결과에 해당 데이터 세트의 통계가 포함됩니다.

적용되는 경우 집계 기준 분석 규칙은 여러 측정기준으로 데이터를 그룹화하면서 집계 기준이 충족되게 합니다. 각 그룹의 개인 정보 보호 단위 열로 표시된 개별 개인 정보 보호 단위의 수를 계산하고, 개별 개인 정보 보호 단위 수가 집계 기준을 충족하는 그룹만 출력합니다.

이 분석 규칙이 포함된 뷰에는 조인 제한 분석 규칙도 포함될 수 있습니다.

뷰의 집계 기준 분석 규칙 정의

데이터 클린룸에서 또는 다음 문을 사용하여 뷰에 대한 집계 기준 분석 규칙을 정의할 수 있습니다.

CREATE OR REPLACE VIEW VIEW_NAME
  OPTIONS (
    privacy_policy= '{
      "aggregation_threshold_policy": {
        "threshold" : THRESHOLD,
        "privacy_unit_column": "PRIVACY_UNIT_COLUMN"
      }
    }'
  )
  AS QUERY;

다음 값을 바꿉니다.

  • VIEW_NAME: 뷰의 경로와 이름입니다.
  • THRESHOLD: 쿼리 결과의 각 행에 기여해야 하는 개별 개인 정보 보호 단위의 최소 개수입니다. 잠재적 행이 이 기준점을 충족하지 않으면 해당 행은 쿼리 결과에서 생략됩니다.
  • PRIVACY_UNIT_COLUMN: 개인 정보 보호 단위 열을 나타냅니다. 개인 정보 보호 단위 열은 개인 정보 보호 단위의 고유 식별자입니다. 개인 정보 보호 단위는 보호되는 데이터 세트의 항목을 나타내는 개인 정보 보호 단위 열의 값입니다.

    개인 정보 보호 단위 열은 하나만 사용할 수 있으며 개인 정보 보호 단위 열의 데이터 유형은 그룹화 가능이어야 합니다.

    개인 정보 보호 단위 열의 값은 쿼리를 통해 직접 프로젝션할 수 없으며 분석 규칙 지원 집계 함수만 사용하여 이 열의 데이터를 집계할 수 있습니다.

  • QUERY: 뷰에 대한 쿼리입니다.

다음 예시에서는 집계 기준 분석 규칙이 생성됩니다.

-- Create a table called ExamTable.
CREATE TABLE mydataset.ExamTable AS (
  SELECT "Hansen" AS last_name, "P91" AS test_id, 510 AS test_score UNION ALL
  SELECT "Wang", "U25", 500 UNION ALL
  SELECT "Wang", "C83", 520 UNION ALL
  SELECT "Wang", "U25", 460 UNION ALL
  SELECT "Hansen", "C83", 420 UNION ALL
  SELECT "Hansen", "C83", 560 UNION ALL
  SELECT "Devi", "U25", 580 UNION ALL
  SELECT "Devi", "P91", 480 UNION ALL
  SELECT "Ivanov", "U25", 490 UNION ALL
  SELECT "Ivanov", "P91", 540 UNION ALL
  SELECT "Silva", "U25", 550);

-- Create a view that includes ExamTable.
CREATE VIEW mydataset.ExamView
OPTIONS(
  privacy_policy= '{"aggregation_threshold_policy": {"threshold": 3, "privacy_unit_column": "last_name"}}'
)
AS ( SELECT * FROM mydataset.ExamTable );

CREATE VIEW에 대한 privacy_policy 문법을 검토하려면 CREATE VIEWOPTIONS 목록을 참조하세요.

뷰의 집계 기준 분석 규칙 업데이트

데이터 클린룸에서 또는 다음 문을 사용하여 뷰에 대한 집계 기준 분석 규칙을 변경할 수 있습니다.

ALTER VIEW VIEW_NAME
SET OPTIONS (
  privacy_policy= '{
    "aggregation_threshold_policy": {
      "threshold" : THRESHOLD,
      "privacy_unit_column": "PRIVACY_UNIT_COLUMN"
    }
  }'
)

다음 값을 바꿉니다.

  • VIEW_NAME: 뷰의 경로와 이름입니다.
  • THRESHOLD: 쿼리 결과의 각 행에 기여해야 하는 개별 개인 정보 보호 단위의 최소 개수입니다. 잠재적 행이 이 기준점을 충족하지 않으면 해당 행은 쿼리 결과에서 생략됩니다.
  • PRIVACY_UNIT_COLUMN: 개인 정보 보호 단위 열을 나타냅니다. 개인 정보 보호 단위 열은 개인 정보 보호 단위의 고유 식별자입니다. 개인 정보 보호 단위는 보호되는 데이터 세트의 항목을 나타내는 개인 정보 보호 단위 열의 값입니다.

    개인 정보 보호 단위 열은 하나만 사용할 수 있으며 개인 정보 보호 단위 열의 데이터 유형은 그룹화 가능이어야 합니다.

    개인 정보 보호 단위 열의 값은 쿼리를 통해 직접 프로젝션할 수 없으며 분석 규칙 지원 집계 함수만 사용하여 이 열의 데이터를 집계할 수 있습니다.

다음 예시에서는 집계 기준 분석 규칙이 업데이트됩니다.

ALTER VIEW mydataset.ExamView
SET OPTIONS (
  privacy_policy= '{"aggregation_threshold_policy": {"threshold": 50, "privacy_unit_column": "last_name"}}'
);

ALTER VIEW에 대한 privacy_policy 문법을 검토하려면 ALTER VIEW SET OPTIONSOPTIONS 목록을 참조하세요.

집계 기준 분석 규칙 적용 뷰 쿼리

AGGREGATION_THRESHOLD 절을 사용하여 집계 기준 분석 규칙이 있는 뷰를 쿼리할 수 있습니다. 쿼리에는 집계 함수가 포함되어야 하며 이 쿼리에서는 분석 규칙 지원 집계 함수만 사용할 수 있습니다.

다음 예시에서는 집계 기준 분석 규칙이 있는 뷰가 쿼리됩니다.

-- Create a table called ExamTable.
CREATE TABLE mydataset.ExamTable AS (
  SELECT "Hansen" AS last_name, "P91" AS test_id, 510 AS test_score UNION ALL
  SELECT "Wang", "U25", 500 UNION ALL
  SELECT "Wang", "C83", 520 UNION ALL
  SELECT "Wang", "U25", 460 UNION ALL
  SELECT "Hansen", "C83", 420 UNION ALL
  SELECT "Hansen", "C83", 560 UNION ALL
  SELECT "Devi", "U25", 580 UNION ALL
  SELECT "Devi", "P91", 480 UNION ALL
  SELECT "Ivanov", "U25", 490 UNION ALL
  SELECT "Ivanov", "P91", 540 UNION ALL
  SELECT "Silva", "U25", 550);

-- Create a view that includes ExamTable.
CREATE VIEW mydataset.ExamView
OPTIONS(
  privacy_policy= '{"aggregation_threshold_policy": {"threshold": 3, "privacy_unit_column": "last_name"}}'
)
AS ( SELECT * FROM mydataset.ExamTable );

-- Query an analysis–rule enforced view called ExamView.
SELECT WITH AGGREGATION_THRESHOLD
  test_id, COUNT(DISTINCT last_name) AS student_count
FROM mydataset.ExamView
GROUP BY test_id;

/*---------+---------------*
 | test_id | student_count |
 +---------+---------------+
 | P91     | 3             |
 | U25     | 4             |
 *---------+---------------*/

AGGREGATION_THRESHOLD 절에 대한 추가 예시를 검토하려면 AGGREGATION_THRESHOLD을 참조하세요.

개인 정보 차등 보호 분석 규칙

개인 정보 차등 보호 분석 규칙은 데이터가 개인 정보 차등 보호로 보호될 때 구독자에게 표시되는 데이터를 제한하는 개인 정보 보호 예산을 적용합니다. 개인 정보 보호 예산은 모든 쿼리의 엡실론 또는 델타의 합이 총 엡실론 또는 총 델타 값에 도달하면 모든 구독자가 공유 데이터를 쿼리할 수 없게 합니다. 뷰에서 이 분석 규칙을 사용할 수 있습니다. 이 분석 규칙이 포함된 뷰에는 조인 제한 분석 규칙도 포함될 수 있습니다.

뷰의 개인 정보 차등 보호 분석 규칙 정의

데이터 클린룸에서 또는 다음 문을 사용하여 뷰에 대한 개인 정보 차등 보호 분석 규칙을 정의할 수 있습니다.

CREATE OR REPLACE VIEW VIEW_NAME
  OPTIONS (
    privacy_policy= '{
      "differential_privacy_policy": {
        "privacy_unit_column": "PRIVACY_UNIT_COLUMN",
        "max_epsilon_per_query": MAX_EPSILON_PER_QUERY,
        "epsilon_budget": EPSILON_BUDGET,
        "delta_per_query": DELTA_PER_QUERY,
        "delta_budget": DELTA_BUDGET,
        "max_groups_contributed": MAX_GROUPS_CONTRIBUTED
      }
    }'
  )
  AS QUERY;

다음 값을 바꿉니다.

  • PRIVACY_UNIT_COLUMN: 개인 정보 보호 분석 규칙을 사용하여 보호되는 데이터 세트의 항목을 식별하는 입니다. 이 값은 JSON 문자열입니다.
  • MAX_EPSILON_PER_QUERY: 쿼리당 개인 정보 보호 보증의 강도를 결정하며 단일 쿼리가 총 엡실론에 도달하지 못하도록 합니다. 이 값은 0.001부터 1e+15까지의 JSON 숫자입니다.
  • EPSILON_BUDGET: 전반적인 개인 정보 보호 보증의 강도를 나타내는 엡실론 예산입니다. 이 값은 뷰의 모든 차등 비공개 쿼리에 대해 전체적으로 사용됩니다. 이 값은 MAX_EPSILON_PER_QUERY보다 커야 하며 0.001에서 1e+15까지의 JSON 숫자입니다.
  • DELTA_PER_QUERY: 총 엡실론을 기준으로 결정되는 개인 정보 보호 보증을 벗어나는 쿼리당 개인 정보 보호 손실의 최대 확률입니다. 단일 쿼리에서 총 델타에 도달하지 못하게 합니다. 이 값은 1e-15부터 1까지의 JSON 숫자입니다.
  • DELTA_BUDGET: 델타 예산으로, 총 엡실론을 기준으로 결정되는 개인 정보 보호 보증을 벗어나는 전체 개인 정보 보호 손실의 최대 확률을 나타냅니다. 이 값은 뷰의 모든 차등 비공개 쿼리에 대해 전체적으로 사용됩니다. 이 값은 DELTA_PER_QUERY보다 커야 하며 1e-15에서 1000까지의 JSON 숫자입니다.
  • MAX_GROUPS_CONTRIBUTED: (선택사항) 개인 정보 보호 단위 열의 항목이 기여할 수 있는 그룹 수를 제한합니다. 이 값은 음수가 아닌 JSON 정수여야 합니다.
  • QUERY: 뷰에 대한 쿼리입니다.

다음 예시에서는 개인 정보 차등 보호 분석 규칙이 생성됩니다.

-- Create a table called ExamTable.
CREATE TABLE mydataset.ExamTable AS (
  SELECT "Hansen" AS last_name, "P91" AS test_id, 510 AS test_score UNION ALL
  SELECT "Wang", "U25", 500 UNION ALL
  SELECT "Wang", "C83", 520 UNION ALL
  SELECT "Wang", "U25", 460 UNION ALL
  SELECT "Hansen", "C83", 420 UNION ALL
  SELECT "Hansen", "C83", 560 UNION ALL
  SELECT "Devi", "U25", 580 UNION ALL
  SELECT "Devi", "P91", 480 UNION ALL
  SELECT "Ivanov", "U25", 490 UNION ALL
  SELECT "Ivanov", "P91", 540 UNION ALL
  SELECT "Silva", "U25", 550);

-- Create a view that includes ExamTable.
CREATE VIEW mydataset.ExamView
OPTIONS(
  privacy_policy= '{"differential_privacy_policy": {"privacy_unit_column": "last_name", "max_epsilon_per_query": 10.01, "epsilon_budget": 1000.0, "delta_per_query": 0.01, "delta_budget": 1000.0, "max_groups_contributed": 2}}'
)
AS ( SELECT * FROM mydataset.ExamTable );

-- Epsilon parameters are set very high due to the small dataset.
-- In practice, epsilon should be much smaller.

CREATE VIEW에 대한 privacy_policy 문법을 검토하려면 CREATE VIEWOPTIONS 목록을 참조하세요.

뷰의 개인 정보 차등 보호 분석 규칙 업데이트

데이터 클린룸에서 또는 다음 문을 사용하여 뷰에 대한 개인 정보 차등 보호 분석 규칙을 변경할 수 있습니다.

ALTER VIEW VIEW_NAME
SET OPTIONS (
  privacy_policy= '{
    "differential_privacy_policy": {
      "privacy_unit_column": "PRIVACY_UNIT_COLUMN",
      "max_epsilon_per_query": MAX_EPSILON_PER_QUERY,
      "epsilon_budget": EPSILON_BUDGET,
      "delta_per_query": DELTA_PER_QUERY,
      "delta_budget": DELTA_BUDGET,
      "max_groups_contributed": MAX_GROUPS_CONTRIBUTED
    }
  }'
)

다음 값을 바꿉니다.

  • PRIVACY_UNIT_COLUMN: 개인 정보 보호 분석 규칙을 사용하여 보호되는 데이터 세트의 항목을 식별하는 입니다. 이 값은 JSON 문자열입니다.
  • MAX_EPSILON_PER_QUERY: 쿼리당 개인 정보 보호 보증의 강도를 결정하며 단일 쿼리가 총 엡실론에 도달하지 못하도록 합니다. 이 값은 0.001부터 1e+15까지의 JSON 숫자입니다.
  • EPSILON_BUDGET: 전반적인 개인 정보 보호 보증의 강도를 나타내는 엡실론 예산입니다. 이 값은 뷰의 모든 차등 비공개 쿼리에 대해 전체적으로 사용됩니다. 이 값은 MAX_EPSILON_PER_QUERY보다 커야 하며 0.001에서 1e+15까지의 JSON 숫자입니다.
  • DELTA_PER_QUERY: 총 엡실론을 기준으로 결정되는 개인 정보 보호 보증을 벗어나는 쿼리당 개인 정보 보호 손실의 최대 확률입니다. 단일 쿼리에서 총 델타에 도달하지 못하게 합니다. 이 값은 1e-15부터 1까지의 JSON 숫자입니다.
  • DELTA_BUDGET: 델타 예산으로, 총 엡실론을 기준으로 결정되는 개인 정보 보호 보증을 벗어나는 전체 개인 정보 보호 손실의 최대 확률을 나타냅니다. 이 값은 뷰의 모든 차등 비공개 쿼리에 대해 전체적으로 사용됩니다. 이 값은 DELTA_PER_QUERY보다 커야 하며 1e-15에서 1000까지의 JSON 숫자입니다.
  • MAX_GROUPS_CONTRIBUTED: (선택사항) 개인 정보 보호 단위 열의 항목이 기여할 수 있는 그룹 수를 제한합니다. 이 값은 음수가 아닌 JSON 정수여야 합니다.

다음 예시에서는 개인 정보 차등 보호 분석 규칙이 업데이트됩니다.

ALTER VIEW mydataset.ExamView
SET OPTIONS(
  privacy_policy= '{"differential_privacy_policy": {"privacy_unit_column": "last_name", "max_epsilon_per_query": 0.01, "epsilon_budget": 1000.0, "delta_per_query": 0.005, "delta_budget": 1000.0, "max_groups_contributed": 2}}'
);

-- Epsilon parameters are set very high due to the small dataset.
-- In practice, epsilon should be much smaller.

ALTER VIEW에 대한 privacy_policy 문법을 검토하려면 ALTER VIEW SET OPTIONSOPTIONS 목록을 참조하세요.

개인 정보 차등 보호 분석 규칙 적용 뷰 쿼리

DIFFERENTIAL_PRIVACY 절을 사용하여 개인 정보 차등 보호 분석 규칙이 있는 뷰를 쿼리할 수 있습니다. DIFFERENTIAL_PRIVACY 절에 대한 문법과 추가 예시를 검토하려면 DIFFERENTIAL_PRIVACY을 참조하세요.

차등 비공개 쿼리가 실행되는지 확인

분석 규칙 적용 뷰에 대한 차등 비공개 쿼리를 만들고 쿼리가 실행되는지 확인합니다.

예를 들어 다음 쿼리에서는 epsilon, delta, max_groups_contributed가 모두 ExamView의 차등 분석 규칙의 조건을 충족하므로 ExamView에서 차등 비공개 데이터가 성공적으로 반환됩니다.

-- Create a table called ExamTable.
CREATE TABLE mydataset.ExamTable AS (
  SELECT "Hansen" AS last_name, "P91" AS test_id, 510 AS test_score UNION ALL
  SELECT "Wang", "U25", 500 UNION ALL
  SELECT "Wang", "C83", 520 UNION ALL
  SELECT "Wang", "U25", 460 UNION ALL
  SELECT "Hansen", "C83", 420 UNION ALL
  SELECT "Hansen", "C83", 560 UNION ALL
  SELECT "Devi", "U25", 580 UNION ALL
  SELECT "Devi", "P91", 480 UNION ALL
  SELECT "Ivanov", "U25", 490 UNION ALL
  SELECT "Ivanov", "P91", 540 UNION ALL
  SELECT "Silva", "U25", 550);

-- Create a view that includes ExamTable.
CREATE VIEW mydataset.ExamView
OPTIONS(
  privacy_policy= '{"differential_privacy_policy": {"privacy_unit_column": "last_name", "max_epsilon_per_query": 1000.01, "epsilon_budget": 1000.0, "delta_per_query": 0.01, "delta_budget": 1000.0, "max_groups_contributed": 2}}'
)
AS ( SELECT * FROM mydataset.ExamTable );

뷰를 만든 후 잠시 기다린 후 뷰가 생성되었음을 확인한 후 다음 쿼리를 실행합니다.

-- Query an analysis–rule enforced view called ExamView.
SELECT
  WITH DIFFERENTIAL_PRIVACY
    OPTIONS(epsilon=10, delta=.01, max_groups_contributed=2, privacy_unit_column=last_name)
    test_id,
    AVG(test_score, contribution_bounds_per_group => (0,100)) AS average_test_score
FROM mydataset.ExamView
GROUP BY test_id;

-- These results will change each time you run the query.
-- Smaller aggregations might be removed.
/*---------+--------------------*
 | test_id | average_test_score |
 +---------+--------------------+
 | P91     | ???                |
 | U25     | ???                |
 *---------+--------------------*/

-- Epsilon parameters are set very high due to the small dataset.
-- In practice, epsilon should be much smaller.

범위를 벗어난 엡실론으로 쿼리 차단

엡실론을 사용하여 노이즈를 추가하거나 제거할 수 있습니다. 엡실론이 많을수록 노이즈가 줄어듭니다. 차등 비공개 쿼리에 최소한의 노이즈가 있도록 하려면 개인 정보 차등 보호 분석 규칙의 max_epsilon_per_query 값에 주의해야 합니다.

예를 들어 다음 쿼리에서는 DIFFERENTIAL_PRIVACY 절의 epsilonExamViewmax_epsilon_per_query보다 높기 때문에 쿼리가 오류와 함께 차단됩니다.

-- Create a table called ExamTable.
CREATE TABLE mydataset.ExamTable AS (
  SELECT "Hansen" AS last_name, "P91" AS test_id, 510 AS test_score UNION ALL
  SELECT "Wang", "U25", 500 UNION ALL
  SELECT "Wang", "C83", 520 UNION ALL
  SELECT "Wang", "U25", 460 UNION ALL
  SELECT "Hansen", "C83", 420 UNION ALL
  SELECT "Hansen", "C83", 560 UNION ALL
  SELECT "Devi", "U25", 580 UNION ALL
  SELECT "Devi", "P91", 480 UNION ALL
  SELECT "Ivanov", "U25", 490 UNION ALL
  SELECT "Ivanov", "P91", 540 UNION ALL
  SELECT "Silva", "U25", 550);

-- Create a view that includes ExamTable.
CREATE VIEW mydataset.ExamView
OPTIONS(
  privacy_policy= '{"differential_privacy_policy": {"privacy_unit_column": "last_name", "max_epsilon_per_query": 10.01, "epsilon_budget": 1000.0, "delta_per_query": 0.01, "delta_budget": 1000.0, "max_groups_contributed": 2}}'
)
AS ( SELECT * FROM mydataset.ExamTable );

뷰를 만들고 잠시 기다린 후 다음 쿼리를 실행합니다.

-- Error: epsilon is out of bounds.
SELECT
  WITH DIFFERENTIAL_PRIVACY
    OPTIONS(epsilon=1e20, delta=.01, max_groups_contributed=2, privacy_unit_column=last_name)
    test_id,
    AVG(test_score, contribution_bounds_per_group => (0,100)) AS average_test_score
FROM mydataset.ExamView
GROUP BY test_id;

-- Epsilon parameters are set very high due to the small dataset.
-- In practice, epsilon should be much smaller.

특정 양의 델타가 없는 쿼리 차단

델타는 데이터가 실수로 유출될 수 있는지 여부를 결정하는 임곗값을 나타냅니다. 델타가 낮을수록 임곗값이 높아지고 델타가 클수록 임곗값이 줄어듭니다. 차등 비공개 쿼리에 특정 임곗값이 있는지 확인하려면 개인 정보 차등 보호 분석 규칙의 delta_per_query 설정을 업데이트합니다.

예를 들어 다음 쿼리에서는 DIFFERENTIAL_PRIVACY 절의 deltaExamViewdelta_per_query와 일치하지 않으므로 쿼리가 오류와 함께 차단됩니다.

-- Create a table called ExamTable.
CREATE TABLE mydataset.ExamTable AS (
  SELECT "Hansen" AS last_name, "P91" AS test_id, 510 AS test_score UNION ALL
  SELECT "Wang", "U25", 500 UNION ALL
  SELECT "Wang", "C83", 520 UNION ALL
  SELECT "Wang", "U25", 460 UNION ALL
  SELECT "Hansen", "C83", 420 UNION ALL
  SELECT "Hansen", "C83", 560 UNION ALL
  SELECT "Devi", "U25", 580 UNION ALL
  SELECT "Devi", "P91", 480 UNION ALL
  SELECT "Ivanov", "U25", 490 UNION ALL
  SELECT "Ivanov", "P91", 540 UNION ALL
  SELECT "Silva", "U25", 550);

-- Create a view that includes ExamTable.
CREATE VIEW mydataset.ExamView
OPTIONS(
  privacy_policy= '{"differential_privacy_policy": {"privacy_unit_column": "last_name", "max_epsilon_per_query": 10.01, "epsilon_budget": 1000.0, "delta_per_query": 0.01, "delta_budget": 1000.0, "max_groups_contributed": 2}}'
)
AS ( SELECT * FROM mydataset.ExamTable );

뷰를 만들고 잠시 기다린 후 다음 쿼리를 실행합니다.

-- Error: delta in query does not match delta_per_query.
SELECT
  WITH DIFFERENTIAL_PRIVACY
    OPTIONS(epsilon=10, delta=.02, max_groups_contributed=2, privacy_unit_column=last_name)
    test_id,
    AVG(test_score, contribution_bounds_per_group => (0,100)) AS average_test_score
FROM mydataset.ExamView
GROUP BY test_id;

-- Epsilon parameters are set very high due to the small dataset.
-- In practice, epsilon should be much smaller.

엡실론 예산을 초과하는 쿼리 차단

엡실론을 사용하여 노이즈를 추가하거나 제거할 수 있습니다. 엡실론이 적을수록 노이즈가 증가하고 엡실론이 많을수록 노이즈가 줄어듭니다. 노이즈가 많더라도 동일한 데이터에 대한 여러 쿼리를 통해 노이즈가 없는 버전의 데이터가 노출될 수 있습니다. 이를 방지하려면 엡실론 예산을 만들면 됩니다. 엡실론 예산을 추가하려면 뷰의 개인 정보 차등 보호 분석 규칙에서 epsilon_budget의 값을 검토합니다.

다음 쿼리를 세 번 실행합니다. 세 번째에서는 사용되는 총 엡실론이 30이지만 ExamViewepsilon_budget25.6만 허용하므로 쿼리가 차단됩니다.

-- Create a table called ExamTable.
CREATE TABLE mydataset.ExamTable AS (
  SELECT "Hansen" AS last_name, "P91" AS test_id, 510 AS test_score UNION ALL
  SELECT "Wang", "U25", 500 UNION ALL
  SELECT "Wang", "C83", 520 UNION ALL
  SELECT "Wang", "U25", 460 UNION ALL
  SELECT "Hansen", "C83", 420 UNION ALL
  SELECT "Hansen", "C83", 560 UNION ALL
  SELECT "Devi", "U25", 580 UNION ALL
  SELECT "Devi", "P91", 480 UNION ALL
  SELECT "Ivanov", "U25", 490 UNION ALL
  SELECT "Ivanov", "P91", 540 UNION ALL
  SELECT "Silva", "U25", 550);

-- Create a view that includes ExamTable.
CREATE VIEW mydataset.ExamView
OPTIONS(
  privacy_policy= '{"differential_privacy_policy": {"privacy_unit_column": "last_name", "max_epsilon_per_query": 10.01, "epsilon_budget": 25.6, "delta_per_query": 0.01, "delta_budget": 1000.0, "max_groups_contributed": 2}}'
)
AS ( SELECT * FROM mydataset.ExamTable );

뷰를 만들고 잠시 기다린 후 다음 쿼리를 세 번 실행합니다.

-- Error after three query runs: epsilon budget exceeded
SELECT
  WITH DIFFERENTIAL_PRIVACY
    OPTIONS(epsilon=10, delta=.01, max_groups_contributed=2, privacy_unit_column=last_name)
    test_id,
    AVG(test_score, contribution_bounds_per_group => (0,100)) AS average_test_score
FROM mydataset.ExamView
GROUP BY test_id;

-- Epsilon parameters are set very high due to the small dataset.
-- In practice, epsilon should be much smaller.

델타 예산을 초과하는 쿼리 차단

델타는 데이터가 실수로 유출될 수 있는지 여부를 결정하는 임곗값을 나타냅니다. 델타가 낮을수록 임곗값이 높아지고 델타가 클수록 임곗값이 줄어듭니다. 임곗값이 높은 경우에도 동일한 데이터에 대한 여러 쿼리를 통해 차등 비공개 데이터가 노출될 수 있습니다. 이를 방지하려면 델타 예산을 만들면 됩니다. 델타 예산을 추가하려면 뷰의 개인 정보 차등 보호 분석 규칙에서 delta_budget의 값을 검토합니다.

다음 쿼리를 일곱 번 실행합니다. 일곱 번째에서는 사용되는 총 델타가 0.7이지만 ExamViewdelta_budget0.6만 허용하므로 쿼리가 차단됩니다.

-- Create a table called ExamTable.
CREATE TABLE mydataset.ExamTable AS (
  SELECT "Hansen" AS last_name, "P91" AS test_id, 510 AS test_score UNION ALL
  SELECT "Wang", "U25", 500 UNION ALL
  SELECT "Wang", "C83", 520 UNION ALL
  SELECT "Wang", "U25", 460 UNION ALL
  SELECT "Hansen", "C83", 420 UNION ALL
  SELECT "Hansen", "C83", 560 UNION ALL
  SELECT "Devi", "U25", 580 UNION ALL
  SELECT "Devi", "P91", 480 UNION ALL
  SELECT "Ivanov", "U25", 490 UNION ALL
  SELECT "Ivanov", "P91", 540 UNION ALL
  SELECT "Silva", "U25", 550);

-- Create a view that includes ExamTable.
CREATE VIEW mydataset.ExamView
OPTIONS(
  privacy_policy= '{"differential_privacy_policy": {"privacy_unit_column": "last_name", "max_epsilon_per_query": 10.01, "epsilon_budget": 0.2, "delta_per_query": 0.01, "delta_budget": 0.6, "max_groups_contributed": 2}}'
)
AS ( SELECT * FROM mydataset.ExamTable );

뷰를 만들고 잠시 기다린 후 다음 쿼리를 일곱 번 실행합니다.

-- Error after seven query runs: epsilon budget exceeded
SELECT
  WITH DIFFERENTIAL_PRIVACY
    OPTIONS(epsilon=10, delta=.01, max_groups_contributed=2, privacy_unit_column=last_name)
    test_id,
    AVG(test_score, contribution_bounds_per_group => (0,100)) AS average_test_score
FROM mydataset.ExamView
GROUP BY test_id;

-- Epsilon parameters are set very high due to the small dataset.
-- In practice, epsilon should be much smaller.

그룹 기여를 너무 많이 허용하는 쿼리 차단

차등 비공개 쿼리에서 각 항목이 기여할 수 있는 그룹 수를 제한할 수 있습니다. 차등 비공개 쿼리에 각 항목이 기여할 수 있는 그룹 수가 제한되도록 하려면 개인 정보 차등 보호 분석 규칙의 max_groups_contributed 값에 주의해야 합니다.

예를 들어 다음 쿼리에서는 DIFFERENTIAL_PRIVACY 절의 max_groups_contributedExamViewmax_groups_contributed보다 높기 때문에 쿼리가 오류와 함께 차단됩니다.

-- Create a table called ExamTable.
CREATE TABLE mydataset.ExamTable AS (
  SELECT "Hansen" AS last_name, "P91" AS test_id, 510 AS test_score UNION ALL
  SELECT "Wang", "U25", 500 UNION ALL
  SELECT "Wang", "C83", 520 UNION ALL
  SELECT "Wang", "U25", 460 UNION ALL
  SELECT "Hansen", "C83", 420 UNION ALL
  SELECT "Hansen", "C83", 560 UNION ALL
  SELECT "Devi", "U25", 580 UNION ALL
  SELECT "Devi", "P91", 480 UNION ALL
  SELECT "Ivanov", "U25", 490 UNION ALL
  SELECT "Ivanov", "P91", 540 UNION ALL
  SELECT "Silva", "U25", 550);

-- Create a view that includes ExamTable.
CREATE VIEW mydataset.ExamView
OPTIONS(
  privacy_policy= '{"differential_privacy_policy": {"privacy_unit_column": "last_name", "max_epsilon_per_query": 10.01, "epsilon_budget": 1000.0, "delta_per_query": 0.01, "delta_budget": 1000.0, "max_groups_contributed": 2}}'
)
AS ( SELECT * FROM mydataset.ExamTable );

뷰를 만들고 잠시 기다린 후 다음 쿼리를 실행합니다.

-- Error: max_groups_contributed is out of bounds.
SELECT
  WITH DIFFERENTIAL_PRIVACY
    OPTIONS(epsilon=10, delta=.02, max_groups_contributed=3, privacy_unit_column=last_name)
    test_id,
    AVG(test_score, contribution_bounds_per_group => (0,100)) AS average_test_score
FROM mydataset.ExamView
GROUP BY test_id;

-- Epsilon parameters are set very high due to the small dataset.
-- In practice, epsilon should be much smaller.

조인 제한 분석 규칙

조인 제한 분석 규칙은 뷰의 특정 열에서 사용할 수 있는 조인 유형을 제한합니다. 뷰에서 이 분석 규칙을 사용할 수 있습니다. 이 분석 규칙이 포함된 뷰에는 집계 기준 분석 규칙 또는 개인 정보 차등 보호 분석 규칙도 포함될 수 있습니다.

뷰의 조인 제한 분석 규칙 정의

데이터 클린룸에서 또는 다음 문을 사용하여 뷰에 대한 조인 제한 보호 분석 규칙을 정의할 수 있습니다.

CREATE OR REPLACE VIEW VIEW_NAME
  OPTIONS (
    privacy_policy= '{
      "join_restriction_policy": {
        "join_condition": "JOIN_CONDITION",
        "join_allowed_columns": JOIN_ALLOWED_COLUMNS
      }
    }'
  )
  AS QUERY;

다음 값을 바꿉니다.

  • JOIN_CONDITION: 뷰에 적용할 조인 제한 유형입니다. 다음 값 중 한 가지로 표시됩니다.

    • JOIN_NOT_REQUIRED: 이 뷰를 쿼리하는 데 조인이 필요하지 않습니다. 조인을 사용하는 경우 join_allowed_columns의 열만 사용할 수 있습니다.

    • JOIN_BLOCKED: 이 뷰는 열을 조인할 수 없습니다. 이 경우 join_allowed_columns를 설정하지 마세요.

    • JOIN_ANY: 이 뷰를 쿼리하려면 join_allowed_columns에 있는 열 최소 하나 이상을 조인해야 합니다.

    • JOIN_ALL: 이 뷰를 쿼리하려면 join_allowed_columns의 모든 열이 내부 조인되어야 합니다.

  • JOIN_ALLOWED_COLUMNS: 조인 작업의 일부일 수 있는 열입니다.

  • QUERY: 뷰에 대한 쿼리입니다.

다음 예시에서는 조인 제한 분석 규칙이 생성됩니다.

-- Create a table called ExamTable.
CREATE TABLE mydataset.ExamTable AS (
  SELECT "Hansen" AS last_name, "P91" AS test_id, 510 AS test_score UNION ALL
  SELECT "Wang", "U25", 500 UNION ALL
  SELECT "Wang", "C83", 520 UNION ALL
  SELECT "Wang", "U25", 460 UNION ALL
  SELECT "Hansen", "C83", 420 UNION ALL
  SELECT "Hansen", "C83", 560 UNION ALL
  SELECT "Devi", "U25", 580 UNION ALL
  SELECT "Devi", "P91", 480 UNION ALL
  SELECT "Ivanov", "U25", 490 UNION ALL
  SELECT "Ivanov", "P91", 540 UNION ALL
  SELECT "Silva", "U25", 550);

-- Create a view that includes ExamTable.
CREATE VIEW mydataset.ExamView
OPTIONS(
  privacy_policy= '{"join_restriction_policy": {"join_condition": "JOIN_ANY", "join_allowed_columns": ["test_id", "test_score"]}}'
)
AS ( SELECT * FROM mydataset.ExamTable );

다른 분석 규칙과 함께 조인 제한 분석 규칙 사용

집계 기준 분석 규칙 또는 개인 정보 차등 보호 분석 규칙과 함께 조인 제한 분석 규칙을 사용할 수 있습니다. 그러나 뷰에서 다른 분석 규칙과 함께 조인 제한을 사용한 후에는 다른 분석 규칙을 변경할 수 없습니다.

다음 예시에서는 조인 제한 분석 규칙과 집계 기준 분석 규칙이 함께 사용됩니다.

-- Create a table called ExamTable.
CREATE TABLE mydataset.ExamTable AS (
  SELECT "Hansen" AS last_name, "P91" AS test_id, 510 AS test_score UNION ALL
  SELECT "Wang", "U25", 500 UNION ALL
  SELECT "Wang", "C83", 520 UNION ALL
  SELECT "Wang", "U25", 460 UNION ALL
  SELECT "Hansen", "C83", 420 UNION ALL
  SELECT "Hansen", "C83", 560 UNION ALL
  SELECT "Devi", "U25", 580 UNION ALL
  SELECT "Devi", "P91", 480 UNION ALL
  SELECT "Ivanov", "U25", 490 UNION ALL
  SELECT "Ivanov", "P91", 540 UNION ALL
  SELECT "Silva", "U25", 550);

-- Create a view that includes ExamTable.
CREATE VIEW mydataset.ExamView
OPTIONS(
  privacy_policy= '{"join_restriction_policy": {"join_condition": "JOIN_ANY", "join_allowed_columns": ["test_id", "test_score"]}, "aggregation_threshold_policy": {"threshold": 3, "privacy_unit_column": "last_name"}}'
)
AS ( SELECT * FROM mydataset.ExamTable );

뷰의 조인 제한 분석 규칙 업데이트

데이터 클린룸에서 또는 다음 문을 사용하여 뷰에 대한 조인 제한 보호 분석 규칙을 변경할 수 있습니다.

ALTER VIEW VIEW_NAME
SET OPTIONS (
  privacy_policy= '{
    "join_restriction_policy": {
      "join_condition": "JOIN_CONDITION",
      "join_allowed_columns": JOIN_ALLOWED_COLUMNS
    }
  }'
)

다음 값을 바꿉니다.

  • JOIN_CONDITION: 뷰에 적용할 조인 제한 유형입니다. 다음 값 중 한 가지로 표시됩니다.

    • JOIN_NOT_REQUIRED: 이 뷰를 쿼리하는 데 조인이 필요하지 않습니다. 조인을 사용하는 경우 join_allowed_columns의 열만 사용할 수 있습니다.

    • JOIN_BLOCKED: 이 뷰는 열을 조인할 수 없습니다. 이 경우 join_allowed_columns를 설정하지 마세요.

    • JOIN_ANY: 이 뷰를 쿼리하려면 join_allowed_columns에 있는 열 최소 하나 이상을 조인해야 합니다.

    • JOIN_ALL: 이 뷰를 쿼리하려면 join_allowed_columns의 모든 열이 내부 조인되어야 합니다.

  • JOIN_ALLOWED_COLUMNS: 조인 작업의 일부일 수 있는 열입니다.

  • QUERY: 뷰에 대한 쿼리입니다.

다음 예시에서는 조인 제한 분석 규칙이 업데이트됩니다.

ALTER VIEW mydataset.ExamView
SET OPTIONS(
  privacy_policy= '{"join_restriction_policy": {"join_condition": "JOIN_ALL", "join_allowed_columns": ["test_id", "test_score"]}}'
);

ALTER VIEW에 대한 privacy_policy 문법을 검토하려면 ALTER VIEW SET OPTIONSOPTIONS 목록을 참조하세요.

조인 제한 분석 규칙 적용 뷰 쿼리

조인 제한 분석 규칙이 있는 뷰에서 조인 작업을 수행할 수 있습니다. JOIN 작업의 구문을 검토하려면 조인 작업을 참조하세요.

조인 제한 쿼리가 실행되는지 확인

조인 제한 쿼리가 실행되는지 테스트해야 합니다.

예를 들어 다음 쿼리에서 조인된 데이터는 ExamViewStudentTable에서 성공적으로 반환됩니다.

-- Create a table called ExamTable.
CREATE TABLE mydataset.ExamTable AS (
  SELECT "Hansen" AS last_name, "P91" AS test_id, 510 AS test_score UNION ALL
  SELECT "Wang", "U25", 500 UNION ALL
  SELECT "Wang", "C83", 520 UNION ALL
  SELECT "Wang", "U25", 460 UNION ALL
  SELECT "Hansen", "C83", 420 UNION ALL
  SELECT "Hansen", "C83", 560 UNION ALL
  SELECT "Devi", "U25", 580 UNION ALL
  SELECT "Devi", "P91", 480 UNION ALL
  SELECT "Ivanov", "U25", 490 UNION ALL
  SELECT "Ivanov", "P91", 540 UNION ALL
  SELECT "Silva", "U25", 550);

-- Create a table called StudentTable.
CREATE TABLE mydataset.StudentTable AS (
  SELECT "Hansen" AS last_name, 510 AS test_score UNION ALL
  SELECT "Wang", 500 UNION ALL
  SELECT "Devi", 580 UNION ALL
  SELECT "Ivanov", 490 UNION ALL
  SELECT "Silva", 550);

-- Create a view that includes ExamTable.
CREATE VIEW mydataset.ExamView
OPTIONS(
  privacy_policy= '{"join_restriction_policy": {"join_condition": "JOIN_ANY", "join_allowed_columns": ["test_score"]}}'
)
AS ( SELECT * FROM mydataset.ExamTable );

-- Query the ExamView view.
SELECT *
FROM mydataset.ExamView INNER JOIN mydataset.StudentTable USING (test_score)
GROUP BY test_id;

-- These results will change each time you run the query.
-- Smaller aggregations might be removed.
/*---------+--------------------*
 | test_id | average_test_score |
 +---------+--------------------+
 | P91     | ???                |
 | U25     | ???                |
 *---------+--------------------*/

필수 열이 없는 조인 작업 차단

필수 열이 하나 이상 포함되어 있지 않으면 조인 작업을 차단할 수 있습니다. 이렇게 하려면 조인 제한 분석 규칙에 다음 부분을 포함합니다.

"join_restriction_policy": {
  "join_condition": "JOIN_ANY",
  "join_allowed_columns": ["column_name", ...]
}

예를 들어 다음 쿼리에서는 ExamViewStudentTabletest_score 또는 test_id 열에 조인 작업이 쿼리에 포함되어 있지 않으므로 오류와 함께 쿼리가 차단됩니다.

-- Create a table called ExamTable.
CREATE TABLE mydataset.ExamTable AS (
  SELECT "Hansen" AS last_name, "P91" AS test_id, 510 AS test_score UNION ALL
  SELECT "Wang", "U25", 500 UNION ALL
  SELECT "Wang", "C83", 520 UNION ALL
  SELECT "Wang", "U25", 460 UNION ALL
  SELECT "Hansen", "C83", 420 UNION ALL
  SELECT "Hansen", "C83", 560 UNION ALL
  SELECT "Devi", "U25", 580 UNION ALL
  SELECT "Devi", "P91", 480 UNION ALL
  SELECT "Ivanov", "U25", 490 UNION ALL
  SELECT "Ivanov", "P91", 540 UNION ALL
  SELECT "Silva", "U25", 550);

-- Create a table called StudentTable.
CREATE TABLE mydataset.StudentTable AS (
  SELECT "Hansen" AS last_name, 510 AS test_score UNION ALL
  SELECT "Wang", 500 UNION ALL
  SELECT "Devi", 580 UNION ALL
  SELECT "Ivanov", 490 UNION ALL
  SELECT "Silva", 550);

-- Create a view that includes ExamTable.
CREATE VIEW mydataset.ExamView
OPTIONS(
  privacy_policy= '{"join_restriction_policy": {"join_condition": "JOIN_ANY", "join_allowed_columns": ["test_score", "test_id"]}}'
)
AS ( SELECT * FROM mydataset.ExamTable );

-- Query the ExamView view.
SELECT *
FROM mydataset.ExamView INNER JOIN mydataset.StudentTable USING (last_name)
GROUP BY test_id;

앞의 쿼리를 실행하려면 USING 절에서 last_nametest_score로 바꿉니다.

조인 작업이 없는 쿼리 차단

쿼리에 조인 작업이 있어야 하는 경우 다음 조인 제한 분석 규칙 중 하나를 사용하여 조인 작업이 없으면 쿼리를 차단할 수 있습니다.

"join_restriction_policy": {
  "join_condition": "JOIN_NOT_REQUIRED"
}
"join_restriction_policy": {
  "join_condition": "JOIN_NOT_REQUIRED",
  "join_allowed_columns": []
}

예를 들어 다음 쿼리에서는 쿼리에 조인 작업이 없으므로 쿼리가 차단됩니다.

-- Create a table called ExamTable.
CREATE TABLE mydataset.ExamTable AS (
  SELECT "Hansen" AS last_name, "P91" AS test_id, 510 AS test_score UNION ALL
  SELECT "Wang", "U25", 500 UNION ALL
  SELECT "Wang", "C83", 520 UNION ALL
  SELECT "Wang", "U25", 460 UNION ALL
  SELECT "Hansen", "C83", 420 UNION ALL
  SELECT "Hansen", "C83", 560 UNION ALL
  SELECT "Devi", "U25", 580 UNION ALL
  SELECT "Devi", "P91", 480 UNION ALL
  SELECT "Ivanov", "U25", 490 UNION ALL
  SELECT "Ivanov", "P91", 540 UNION ALL
  SELECT "Silva", "U25", 550);

-- Create a table called StudentTable.
CREATE TABLE mydataset.StudentTable AS (
  SELECT "Hansen" AS last_name, 510 AS test_score UNION ALL
  SELECT "Wang", 500 UNION ALL
  SELECT "Devi", 580 UNION ALL
  SELECT "Ivanov", 490 UNION ALL
  SELECT "Silva", 550);

-- Create a view that includes ExamTable.
CREATE VIEW mydataset.ExamView
OPTIONS(
  privacy_policy= '{"join_restriction_policy": {"join_condition": "JOIN_NOT_REQUIRED"}}'
)
AS ( SELECT * FROM mydataset.ExamTable );

-- Query the ExamView view.
SELECT *
FROM mydataset.ExamView
GROUP BY test_id;

조인 작업이 없고 필수 열이 없는 쿼리 차단

쿼리에 조인 작업이 있어야 하고 조인 작업에 필수 열이 하나 이상 있어야 하는 경우 조인 제한 분석 규칙에 다음 부분을 포함합니다.

"join_restriction_policy": {
  "join_condition": "JOIN_NOT_REQUIRED",
  "join_allowed_columns": ["column_name", ...]
}

예를 들어 다음 쿼리에서는 조인 작업이 join_allowed_columns 배열에 열을 포함하지 않으므로 쿼리가 차단됩니다.

-- Create a table called ExamTable.
CREATE TABLE mydataset.ExamTable AS (
  SELECT "Hansen" AS last_name, "P91" AS test_id, 510 AS test_score UNION ALL
  SELECT "Wang", "U25", 500 UNION ALL
  SELECT "Wang", "C83", 520 UNION ALL
  SELECT "Wang", "U25", 460 UNION ALL
  SELECT "Hansen", "C83", 420 UNION ALL
  SELECT "Hansen", "C83", 560 UNION ALL
  SELECT "Devi", "U25", 580 UNION ALL
  SELECT "Devi", "P91", 480 UNION ALL
  SELECT "Ivanov", "U25", 490 UNION ALL
  SELECT "Ivanov", "P91", 540 UNION ALL
  SELECT "Silva", "U25", 550);

-- Create a table called StudentTable.
CREATE TABLE mydataset.StudentTable AS (
  SELECT "Hansen" AS last_name, 510 AS test_score UNION ALL
  SELECT "Wang", 500 UNION ALL
  SELECT "Devi", 580 UNION ALL
  SELECT "Ivanov", 490 UNION ALL
  SELECT "Silva", 550);

-- Create a view that includes ExamTable.
CREATE VIEW mydataset.ExamView
OPTIONS(
  privacy_policy= '{"join_restriction_policy": {"join_condition": "JOIN_NOT_REQUIRED", "join_allowed_columns": ["test_score"]}}'
)
AS ( SELECT * FROM mydataset.ExamTable );

-- Query the ExamView view.
SELECT *
FROM mydataset.ExamView INNER JOIN mydataset.StudentTable USING (last_name)
GROUP BY test_id;

앞의 쿼리를 실행하려면 USING 절에서 last_nametest_score로 바꿉니다.

모든 조인 작업 차단

모든 조인 작업을 차단할 수 있습니다. 이렇게 하려면 조인 제한 분석 규칙에 다음 부분만 포함합니다.

"join_restriction_policy": {
  "join_condition": "JOIN_BLOCKED",
}

예를 들어 다음 쿼리에서는 조인 작업이 있으므로 쿼리가 차단됩니다.

-- Create a table called ExamTable.
CREATE TABLE mydataset.ExamTable AS (
  SELECT "Hansen" AS last_name, "P91" AS test_id, 510 AS test_score UNION ALL
  SELECT "Wang", "U25", 500 UNION ALL
  SELECT "Wang", "C83", 520 UNION ALL
  SELECT "Wang", "U25", 460 UNION ALL
  SELECT "Hansen", "C83", 420 UNION ALL
  SELECT "Hansen", "C83", 560 UNION ALL
  SELECT "Devi", "U25", 580 UNION ALL
  SELECT "Devi", "P91", 480 UNION ALL
  SELECT "Ivanov", "U25", 490 UNION ALL
  SELECT "Ivanov", "P91", 540 UNION ALL
  SELECT "Silva", "U25", 550);

-- Create a table called StudentTable.
CREATE TABLE mydataset.StudentTable AS (
  SELECT "Hansen" AS last_name, 510 AS test_score UNION ALL
  SELECT "Wang", 500 UNION ALL
  SELECT "Devi", 580 UNION ALL
  SELECT "Ivanov", 490 UNION ALL
  SELECT "Silva", 550);

-- Create a view that includes ExamTable.
CREATE VIEW mydataset.ExamView
OPTIONS(
  privacy_policy= '{"join_restriction_policy": {"join_condition": "JOIN_BLOCKED"}}'
)
AS ( SELECT * FROM mydataset.ExamTable );

-- Query the ExamView view.
SELECT *
FROM mydataset.ExamView INNER JOIN mydataset.StudentTable USING (last_name)
GROUP BY test_id;

앞의 쿼리를 실행하려면 INNER JOIN 작업을 삭제합니다.

모든 필수 열이 없는 내부 조인 작업 차단

필요한 모든 열을 포함하지 않은 경우 내부 조인 작업을 차단할 수 있습니다. 이렇게 하려면 조인 제한 분석 규칙에 다음 부분을 포함합니다.

"join_restriction_policy": {
  "join_condition": "JOIN_ALL",
  "join_allowed_columns": ["column_name", ...]
}

예를 들어 다음 쿼리에서는 쿼리가 조인 작업에 test_score를 포함하지 않으므로 오류와 함께 차단됩니다.

-- Create a table called ExamTable.
CREATE TABLE mydataset.ExamTable AS (
  SELECT "Hansen" AS last_name, "P91" AS test_id, 510 AS test_score UNION ALL
  SELECT "Wang", "U25", 500 UNION ALL
  SELECT "Wang", "C83", 520 UNION ALL
  SELECT "Wang", "U25", 460 UNION ALL
  SELECT "Hansen", "C83", 420 UNION ALL
  SELECT "Hansen", "C83", 560 UNION ALL
  SELECT "Devi", "U25", 580 UNION ALL
  SELECT "Devi", "P91", 480 UNION ALL
  SELECT "Ivanov", "U25", 490 UNION ALL
  SELECT "Ivanov", "P91", 540 UNION ALL
  SELECT "Silva", "U25", 550);

-- Create a table called StudentTable.
CREATE TABLE mydataset.StudentTable AS (
  SELECT "Hansen" AS last_name, 510 AS test_score UNION ALL
  SELECT "Wang", 500 UNION ALL
  SELECT "Devi", 580 UNION ALL
  SELECT "Ivanov", 490 UNION ALL
  SELECT "Silva", 550);

-- Create a view that includes ExamTable.
CREATE VIEW mydataset.ExamView
OPTIONS(
  privacy_policy= '{"join_restriction_policy": {"join_condition": "JOIN_ALL", "join_allowed_columns": ["test_score", "last_name"]}}'
)
AS ( SELECT * FROM mydataset.ExamTable );

-- Query the ExamView view.
SELECT *
FROM mydataset.ExamView INNER JOIN mydataset.StudentTable USING (last_name)
GROUP BY test_id;

앞의 쿼리를 실행하려면 USING (last_name)USING (last_name, test_score)로 바꿉니다.

목록 겹침 분석 규칙

특정 열에 사용할 수 있는 조인 유형을 제한합니다. 조인이 쿼리에 있어야 하며 특정 열은 차단할 수 없습니다. 데이터 클린룸의 뷰에 대한 목록 겹침 분석 규칙을 정의하고 업데이트할 수 있습니다. 자세한 내용은 데이터 클린룸에서 민감한 정보 공유를 참조하세요.

제한사항

분석 규칙에는 다음과 같은 제한사항이 있습니다.

  • 이미 분석 규칙을 뷰에 추가한 경우 집계 기준 분석 규칙과 차등 분석 규칙 간에 전환할 수 없습니다.

집계 기준 분석 규칙에는 다음과 같은 제한사항이 있습니다.

  • 집계 기준 분석 규칙 적용 뷰의 쿼리에서는 지원되는 집계 함수만 사용할 수 있습니다.
  • 구체화된 뷰에는 집계 기준 분석 규칙을 추가할 수 없습니다.
  • 집계 기준 쿼리에서 집계 기준 분석 규칙 적용 뷰를 사용하는 경우, 둘 다 개인 정보 보호 단위 열에 대해 동일한 값을 가져야 합니다.
  • 집계 기준 쿼리에서 집계 기준 분석 규칙 적용 뷰를 사용하는 경우 쿼리의 기준은 뷰의 기준보다 크거나 같아야 합니다.
  • 집계 기준 분석 규칙이 있는 모든 뷰에서는 시간 이동이 사용 중지됩니다.

개인 정보 차등 보호 분석 규칙에는 다음과 같은 제한사항이 있습니다.

  • 뷰에 대한 개인 정보 보호 예산이 소진되면 해당 뷰를 사용할 수 없으며 새 뷰를 만들어야 합니다.

조인 제한 분석 규칙에는 다음과 같은 제한사항이 있습니다.

  • 조인 제한 분석 규칙에 privacy_unit_columnjoin_allowed_column으로 배치하지 않으면 특정 상황에서 어떤 열도 조인하지 못할 수 있습니다.

가격 책정