分析ルールを使用してデータアクセスを制限する

このドキュメントでは、GoogleSQL for BigQuery の分析ルールに関する一般的な情報を提供します。

分析ルールとは

分析ルールは、データ共有のポリシーを適用します。ポリシーは、クエリを実行する前に満たす必要がある条件を表します。BigQuery では、データ クリーンルームを使用するか、分析ルールを直接ビューに適用することで、分析ルールをビューに適用できます。分析ルールが適用された場合、そのビューをクエリするすべてのユーザーは、そのビューに関する分析ルールに従う必要があります。分析ルールの条件を満たすと、分析ルールを満たす出力が生成されます。クエリが分析ルールの条件を満たしていない場合は、エラーが発生します。

サポートされている分析ルール

次の分析ルールがサポートされています。

  • 集計しきい値の分析ルール: データセットに存在する必要がある個々のエンティティを最小数にします。このルールは、DDL ステートメントまたはデータ クリーンルームを使用してビューに適用します。このルールは、集計しきい値ポリシーと結合制限ポリシーに対応しています。

  • 差分プライバシーの分析ルール: プライバシー バジェットを適用します。データが差分プライバシーで保護されている場合、サブスクライバーに公開されるデータが制限されます。このルールは、DDL ステートメントまたはデータ クリーンルームを使用してビューに適用します。このルールは、差分プライバシー ポリシーと結合制限ポリシーに対応しています。

  • リスト重複の分析ルール: 重複する行をクエリできるのは、ルールに準拠した結合オペレーションの後のみです。このルールは、DDL ステートメントまたはデータ クリーンルームを使用してビューに適用します。このルールは、結合制限ポリシーに対応しています。

集計しきい値の分析ルール

集計しきい値の分析ルールでは、クエリの出力行に寄与する必要がある最小数の個別エンティティを適用して、出力行がクエリ結果に含まれるようにします。

集計しきい値の分析ルールを適用すると、集計しきい値を確実に満たしながら、ディメンション間でデータがグループ化されます。各グループの個別のプライバシー ユニットの数(プライバシー ユニット列で表される)をカウントし、個別のプライバシー ユニット数が集計しきい値を満たすグループのみを出力します。

この分析ルールを含むビューには、集計しきい値ポリシーを含める必要があり、必要に応じて結合制限ポリシーを含めることもできます。

ビューに集計しきい値の分析ルールを定義する

ビューの集計しきい値の分析ルールは、データ クリーンルームで定義するか、CREATE VIEW ステートメントで定義します。

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

定義:

  • aggregation_threshold_policy: 集計しきい値の分析ルールの集計しきい値ポリシー。

    • VIEW_NAME: ビューのパスと名前。

    • THRESHOLD: クエリ結果の各行の出力に必要な個別のプライバシー ユニットの最小数。候補の行がこのしきい値を満たしていない場合、その行はクエリ結果から除外されます。

    • PRIVACY_UNIT_COLUMN: プライバシー ユニット列を表します。プライバシー ユニット列は、プライバシー ユニットの固有識別子です。プライバシー ユニットは、保護されている一連のデータ内のエンティティを表すプライバシー ユニット列の値です。

      使用できるプライバシー ユニット列は 1 つだけです。プライバシー ユニット列のデータ型は Groupable にする必要があります。

      プライバシー ユニット列の値をクエリで直接射影することはできません。この列のデータを集計するには、分析ルールでサポートされている集計関数を使用する必要があります。

  • join_restriction_policy(省略可): 集計しきい値の分析ルールの任意の結合制限ポリシー。

    • JOIN_CONDITION: ビューに適用する結合制限のタイプ。次のいずれかの値です。

      • JOIN_ALL: このビューをクエリするには、join_allowed_columns のすべての列を内部結合で結合する必要があります。

      • JOIN_ANY: このビューをクエリするには、join_allowed_columns の列を少なくとも 1 つ結合する必要があります。

      • JOIN_BLOCKED: このビューは、どの列とも結合できません。この場合、join_allowed_columns を設定しないでください。

      • JOIN_NOT_REQUIRED: このビューをクエリするために結合は必要ありません。結合を使用する場合は、join_allowed_columns の列のみを使用できます。

    • JOIN_ALLOWED_COLUMNS: 結合演算の一部となる列。

  • QUERY: ビューのクエリ。

例:

次の例では、ExamView というビューに集計しきい値の分析ルールを作成します。ExamView は、ExamTable というテーブルを参照しています。

CREATE OR REPLACE VIEW mydataset.ExamView
OPTIONS(
  privacy_policy= '{"aggregation_threshold_policy": {"threshold": 3, "privacy_unit_column": "last_name"}}'
)
AS ( SELECT * FROM mydataset.ExamTable );

CREATE VIEWprivacy_policy 構文を確認するには、CREATE VIEWOPTIONS リストをご覧ください。

ビューの集計しきい値の分析ルールを更新する

ビューの集計しきい値の分析ルールは、データ クリーンルームで変更するか、ALTER VIEW ステートメントで変更できます。

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

上記の構文でプライバシー ポリシーに設定できる値の詳細については、ビューの集計しきい値の分析ルールを定義するをご覧ください。

例:

次の例では、ExamView というビューで集計しきい値の分析ルールを更新しています。

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

ALTER VIEWprivacy_policy 構文を確認するには、ALTER VIEW SET OPTIONSOPTIONS リストをご覧ください。

集計しきい値の分析ルールが適用されたビューをクエリする

集計しきい値の分析ルールを含むビューは、AGGREGATION_THRESHOLD 句でクエリできます。クエリには集計関数を含める必要があります。このクエリで使用できるのは、集計しきい値がサポートされている集計関数だけです。

例:

次の例では、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 VIEW ステートメントで定義できます。

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
      },
      "join_restriction_policy": {
        "join_condition": "JOIN_CONDITION",
        "join_allowed_columns": JOIN_ALLOWED_COLUMNS
      }
    }'
  )
  AS QUERY;

定義:

  • differential_privacy_policy: 差分プライバシーの分析ルールの差分プライバシー ポリシー。

    • PRIVACY_UNIT_COLUMN: プライバシーの分析ルールで保護されているデータセット内のエンティティを識別する。この値は JSON 文字列です。

    • MAX_EPSILON_PER_QUERY: クエリごとに結果に追加されるノイズの量を決定し、単一クエリによってイプシロンの合計数に達することを防ぎます。この値は、0.0011e+15 の JSON 数値です。

    • EPSILON_BUDGET: ビューのすべての差分プライベート クエリで使用できるイプシロンの合計数を表すイプシロンの予算。この値は 0.0011e+15 の JSON 数値で、MAX_EPSILON_PER_QUERY より大きくする必要があります。

    • DELTA_PER_QUERY: 結果のいずれかの行がイプシロン差分プライベートにならない確率。この値は、1e-151 の JSON 数値です。

    • DELTA_BUDGET: デルタの予算。ビューのすべての差分プライバシー クエリで使用できるデルタの合計数を表します。この値は 1e-151000 の JSON 数値で、DELTA_PER_QUERY より大きくする必要があります。

    • MAX_GROUPS_CONTRIBUTED(省略可): プライバシー ユニット列のエンティティが寄与できるグループ数を制限します。この値は 0 または正の JSON 整数にする必要があります。

  • join_restriction_policy(省略可): 差分プライバシーの分析ルールの結合制限ポリシー。

    • JOIN_CONDITION: ビューに適用する結合制限のタイプ。次のいずれかの値です。

      • JOIN_ALL: このビューをクエリするには、join_allowed_columns のすべての列を内部結合で結合する必要があります。

      • JOIN_ANY: このビューをクエリするには、join_allowed_columns の列を少なくとも 1 つ結合する必要があります。

      • JOIN_BLOCKED: このビューは、どの列とも結合できません。この場合、join_allowed_columns を設定しないでください。

      • JOIN_NOT_REQUIRED: このビューをクエリするために結合は必要ありません。結合を使用する場合は、join_allowed_columns の列のみを使用できます。

    • JOIN_ALLOWED_COLUMNS: 結合演算の一部となる列。

  • QUERY: ビューのクエリ。

例:

次の例では、ExamView というビューに差分プライバシーの分析ルールを作成しています。ExamView は、ExamTable というテーブルを参照しています。

CREATE OR REPLACE VIEW mydataset.ExamView
OPTIONS(
  privacy_policy= '{"differential_privacy_policy": {"privacy_unit_column": "last_name", "max_epsilon_per_query": 1000.0, "epsilon_budget": 10000.1, "delta_per_query": 0.01, "delta_budget": 0.1, "max_groups_contributed": 2}}'
)
AS ( SELECT * FROM mydataset.ExamTable );

-- NOTE: Delta and epsilon parameters are set very high due to the small
-- dataset. In practice, these should be much smaller.

CREATE VIEWprivacy_policy 構文を確認するには、CREATE VIEWOPTIONS リストをご覧ください。

ビューの差分プライバシーの分析ルールを更新する

ビューの差分プライバシーの分析ルールは、データ クリーンルームで変更するか、ALTER VIEW ステートメントで変更できます。

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
    }
  }'
)

上記の構文でプライバシー ポリシーに設定できる値の詳細については、ビューの差分プライバシーの分析ルールを定義するをご覧ください。

例:

次の例では、ExamView というビューで差分プライバシーの分析ルールを更新しています。

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.05, "delta_budget": 0.1, "max_groups_contributed": 2}}'
);

-- NOTE: Delta and epsilon parameters are set very high due to the small
-- dataset. In practice, these should be much smaller.

ALTER VIEWprivacy_policy 構文を確認するには、ALTER VIEW SET OPTIONSOPTIONS リストをご覧ください。

差分プライバシーの分析ルールが適用されているビューをクエリする

差分プライバシーの分析ルールを含むビューは、DIFFERENTIAL_PRIVACY 句でクエリできます。DIFFERENTIAL_PRIVACY 句の構文とその他の例については、DIFFERENTIAL_PRIVACYをご覧ください。

例:

次の例では、ExamView というビューで差分プライバシーの分析ルールをクエリしています。epsilondeltamax_groups_contributed はすべて ExamView の差分分析ルールの条件を満たしているため、差分プライベート データが ExamView から正常に返されるはずです。

-- Query an analysis–rule enforced view called ExamView.
SELECT
  WITH DIFFERENTIAL_PRIVACY
    test_id,
    AVG(test_score) AS average_test_score
FROM mydataset.ExamView
GROUP BY test_id;

-- Results will vary.
/*---------+--------------------*
 | test_id | average_test_score |
 +---------+--------------------+
 | P91     | 512.627693163311   |
 | C83     | 506.01565971561649 |
 | U25     | 524.81202728847893 |
 *---------+--------------------*/

範囲外のイプシロンのあるクエリをブロックする

イプシロンはノイズの追加や削除に使用できます。イプシロンを大きくすると、ノイズが追加されなくなります。差分プライバシー クエリのノイズを最小限に抑えるには、差分プライバシーの分析ルールの max_epsilon_per_query の値に注意してください。

例:

次のクエリでは、DIFFERENTIAL_PRIVACY 句の epsilonExamViewmax_epsilon_per_query よりも大きいため、エラーでクエリがブロックされます。

-- Create a view that includes a table called ExamTable.
CREATE OR REPLACE 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": 0.1, "max_groups_contributed": 2}}'
)
AS ( SELECT * FROM mydataset.ExamTable );

-- NOTE: Delta and epsilon parameters are set very high due to the small
-- dataset. In practice, these should be much smaller.

ビューを作成したら、しばらく待ってから、次のクエリを実行します。

-- Error: Epsilon is too high: 1e+20, policy for table mydataset.
-- ExamView allows max 10.01
SELECT
  WITH DIFFERENTIAL_PRIVACY
    OPTIONS(epsilon=1e20)
    test_id,
    AVG(test_score) AS average_test_score
FROM mydataset.ExamView
GROUP BY test_id;

イプシロン予算を超えたクエリをブロックする

イプシロンはノイズの追加や削除に使用できます。イプシロンが小さいとノイズが増え、イプシロンが大きいとノイズが減ります。ノイズが多い場合でも、同じデータに対して複数のクエリを実行すると、最終的にはノイズのないデータが明らかになる可能性があります。これを防ぐには、イプシロンの予算を作成します。イプシロンの予算を追加する場合は、ビューの差分プライバシーの分析ルールで epsilon_budget の値を確認します。

例:

次のクエリを 3 回実行します。3 回目は、使用されるイプシロンの合計数が 30 であるにもかかわらず、ExamViewepsilon_budget25.6 のみを許可しているため、クエリはブロックされます。

-- Create a view that includes a table called ExamTable.
CREATE OR REPLACE 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": 0.1, "max_groups_contributed": 2}}'
)
AS ( SELECT * FROM mydataset.ExamTable );

-- NOTE: Delta and epsilon parameters are set very high due to the small
-- dataset. In practice, these should be much smaller.

ビューを作成したら、少し待ってから、次のクエリを 3 回実行します。

-- Error after three query runs: Privacy budget is not sufficient for
-- table 'mydataset.ExamView' in this query.

SELECT
  WITH DIFFERENTIAL_PRIVACY
    OPTIONS(epsilon=10)
    test_id,
    AVG(test_score) AS average_test_score
FROM mydataset.ExamView
GROUP BY test_id;

リスト重複の分析ルール

結合オペレーション後は重複行のみがクエリできますが、これは、リスト重複ルールに準拠しています。このルールは、DDL ステートメントまたはデータ クリーンルームを使用してビューに適用します。

この分析ルールを含むビューには、結合制限ポリシーのみを含める必要があります。

ビューのリスト重複の分析ルールを定義する

ビューのリスト重複の分析ルールは、データ クリーンルームで定義するか、CREATE VIEW ステートメントを使用して定義できます。

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_restriction_policy: リスト重複の分析ルールの結合制限ポリシー。

    • JOIN_CONDITION: ビューに適用するリストの重複のタイプ。次のいずれかの値です。

      • JOIN_ALL: このビューをクエリするには、join_allowed_columns のすべての列を内部結合で結合する必要があります。

      • JOIN_ANY: このビューをクエリするには、join_allowed_columns の列を少なくとも 1 つ結合する必要があります。

    • JOIN_ALLOWED_COLUMNS: 結合演算の一部となる列。

  • QUERY: ビューのクエリ。

例:

次の例では、ExamView というビューにリスト重複の分析ルールを作成しています。ExamView は、ExamTable というテーブルを参照しています。

-- Create a view that includes a table called ExamTable.
CREATE OR REPLACE 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 );

ビューのリスト重複の分析ルールを更新する

ビューのリスト重複の分析ルールは、データ クリーンルームまたは ALTER VIEW ステートメントを使用して変更できます。

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

上記の構文でプライバシー ポリシーに設定できる値の詳細については、ビューのリスト重複の分析ルールを定義するをご覧ください。

例:

次の例では、ExamView というビューでリスト重複の分析ルールを更新しています。

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

ALTER VIEWprivacy_policy 構文を確認するには、ALTER VIEW SET OPTIONSOPTIONS リストをご覧ください。

リスト重複の分析ルールが適用されたビューをクエリする

リスト重複の分析ルールを含むビューに結合オペレーションを実行できます。JOIN 演算の構文を確認するには、結合演算をご覧ください。

重複のない結合オペレーションをブロックする

結合オペレーションに必要な列と重複する列が 1 つも含まれていない場合は、結合演算をブロックできます。

例:

次のクエリでは、ExamView というビューが StudentTable というテーブルと結合されています。ビューには JOIN_ANY リスト重複の分析ルールが含まれているため、ExamViewStudentTable の重複する行が少なくとも 1 つ必要です。重複が少なくとも 1 つあるため、クエリは正常に動作します。

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

-- Query a view called ExamView and a table called StudentTable.
SELECT *
FROM mydataset.ExamView INNER JOIN mydataset.StudentTable USING (test_score);

/*------------+-----------+---------+-------------*
 | test_score | last_name | test_id | last_name_1 |
 +------------+-----------+---------+-------------+
 | 490        | Ivanov    | U25     | Ivanov      |
 | 500        | Wang      | U25     | Wang        |
 | 510        | Hansen    | P91     | Hansen      |
 | 550        | Silva     | U25     | Silva       |
 | 580        | Devi      | U25     | Devi        |
 *------------+-----------+---------+-------------*/

完全な重複のない内部結合オペレーションをブロックする

結合オペレーションに必要なすべての列との重複が含まれていない場合は、結合オペレーションをブロックできます。

例:

次の例では、ExamView というビューと StudentTable というテーブルで結合オペレーションが試行されますが、クエリは失敗します。このエラーは、ExamView リスト重複の分析ルールが、結合制限ポリシーに存在するすべての列との結合を必要とするため発生します。StudentTable という名前のテーブルにはこれらの列が含まれていないため、すべての行が重複するわけではなく、エラーが発生します。

-- Create a view that includes ExamTable.
CREATE OR REPLACE 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 error: Joining must occur on all of the following columns
-- [test_score, last_name] on table mydataset.ExamView.
SELECT *
FROM mydataset.ExamView INNER JOIN mydataset.StudentTable USING (last_name);

結合制限ポリシーを別のポリシーとともに使用する

結合制限ポリシーは、集計しきい値と差分プライバシーの分析ルールの他のポリシーとともに使用できます。ただし、結合制限ポリシーを別のポリシーとともに使用した場合、そのポリシーを後で変更することはできません。

例:

次の例では、結合制限ポリシーが集計しきい値の分析ルールで使用されています。

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

必要な列がまったくない結合オペレーションをブロックする

結合演算に必要な列が 1 つも含まれていない場合は、結合演算をブロックできます。そのためには、リスト重複の分析ルールに次の部分を含めます。

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

例:

次のクエリでは、ExamViewStudentTabletest_score 列または test_id 列に対する結合演算が含まれていないため、エラーでブロックされます。

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

-- Query error: Joining must occur on at least one of the following columns
-- [test_score, test_id] on table mydataset.ExamView.
SELECT *
FROM mydataset.ExamView INNER JOIN mydataset.StudentTable USING (last_name);

前のクエリを実行するには、USING 句で last_nametest_score に置き換えます。

結合オペレーションのないクエリをブロックする

クエリに結合演算が含まれている必要がある場合、次のリスト重複の分析ルールのいずれかを使用し、結合演算が存在しない場合にクエリをブロックできます。

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

例:

次のクエリでは、クエリ内に ExamView の結合演算がないため、クエリがブロックされます。

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

-- Query error: At least one allowed column must be specified with
-- join_condition = 'JOIN_NOT_REQUIRED'.
SELECT *
FROM mydataset.ExamView;

結合演算がなく、必要な列もないクエリをブロックする

クエリに結合演算が含まれ、結合演算に必要な列が 1 つ以上含まれている必要がある場合は、結合制限の分析ルールに次の部分を含めます。

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

例:

たとえば、次のクエリでは、結合オペレーションに ExamView join_allowed_columns 配列の列が含まれていないため、クエリがブロックされます。

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

-- Query error: Join occurring on a restricted column.
SELECT *
FROM mydataset.ExamView INNER JOIN mydataset.StudentTable USING (last_name);

前のクエリを実行するには、USING 句で last_nametest_score に置き換えます。

すべての結合オペレーションをブロックする

すべての結合オペレーションをブロックできます。そのためには、リスト重複の分析ルールに次の部分のみを含めます。

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

例:

次のクエリでは、ExamView というビューを含む結合オペレーションがあるため、クエリがブロックされます。

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

-- Query error: Join occurring on a restricted column.
SELECT *
FROM mydataset.ExamView INNER JOIN mydataset.StudentTable USING (last_name);

前のクエリを実行するには、INNER JOIN オペレーションを削除します。

必要な列が不足している内部結合オペレーションをブロックする

必要な列がすべて含まれていない場合、内部結合オペレーションをブロックできます。そのためには、リスト重複の分析ルールに次の部分を含めます。

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

例:

次のクエリでは、ExamView というビューとの結合演算に test_score が含まれていないため、エラーが出てクエリがブロックされます。

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

-- Query error: Joining must occur on all of the following columns
-- [test_score, last_name] on table mydataset.ExamView.
SELECT *
FROM mydataset.ExamView INNER JOIN mydataset.StudentTable USING (last_name);

前のクエリを実行するには、USING (last_name)USING (last_name, test_score) に置き換えます。

テーブルの例

このドキュメントのいくつかの例では、ExamTableStudentTable という 2 つのテーブルを参照しています。ExamTable には、生徒が作成したテストスコアのリストが含まれ、StudentTable には、生徒とそのテストスコアのリストが含まれます。

このドキュメントの例を検証するには、まず次のサンプル テーブルをプロジェクトに追加します。

-- Create a table called ExamTable.
CREATE OR REPLACE 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 OR REPLACE 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);

制限事項

分析ルールには次の制限があります。

  • 分析ルールをビューに追加している場合は、集計しきい値の分析ルールと差分プライバシーの分析ルールを切り替えることはできません。

集計しきい値の分析ルールには、次の制限があります。

  • 集計しきい値分析ルールが適用されているビューに対するクエリでは、サポートされている集計関数のみを使用できます。
  • 集計しきい値の分析ルールをマテリアライズド ビューに追加することはできません。
  • 集計しきい値クエリで集計しきい値の分析ルールが適用されているビューを使用する場合は、両方でプライバシー ユニット列の値が同じである必要があります。
  • 集計しきい値の分析ルールが適用されたビューを集計しきい値クエリで使用する場合は、クエリのしきい値がビューのしきい値以上である必要があります。
  • 集計しきい値の分析ルールが設定されているビューでは、タイムトラベルが無効になっています。

差分プライバシーの分析ルールには、次の制限があります。

  • ビューのプライバシー バジェットがすべて使用されると、そのビューは使用できなくなり、新しいビューを作成する必要があります。

リスト重複の分析ルールには次の制限があります。

  • 集計しきい値の分析ルールまたは差分プライバシーの分析ルールとリスト重複の分析ルールを組み合わせて、リスト重複の分析ルールで privacy_unit_columnjoin_allowed_column として配置しないと、特定の状況で列を結合できない場合があります。

料金