Restreindre l'accès aux données à l'aide de règles d'analyse

Ce document fournit des informations générales sur les règles d'analyse dans GoogleSQL pour BigQuery.

Qu'est-ce qu'une règle d'analyse  ?

Une règle d'analyse applique une condition de partage de données. Avec BigQuery, vous pouvez appliquer une règle d'analyse à une vue à l'aide d'une data clean room ou en appliquant la règle d'analyse directement à la vue. Lorsque vous appliquez une règle d'analyse, vous exigez que toutes les personnes qui interrogent cette vue respectent cette règle d'analyse sur la vue. Si la règle d'analyse est satisfaite, la requête génère un résultat conforme à la règle d'analyse. Si la requête ne satisfait pas la règle d'analyse, une erreur est générée.

Règles d'analyse compatibles

Les règles d'analyse suivantes sont acceptées :

  • Règle d'analyse du seuil d'agrégation : applique le nombre minimal d'entités distinctes devant être présentes dans un ensemble de données. Vous pouvez appliquer cette règle au niveau d'une vue, à l'aide d'instructions ou d'une data clean room.
  • Règle d'analyse de confidentialité différentielle : applique un budget de confidentialité, qui limite les données divulguées à un abonné lorsque les données sont protégées par la confidentialité différentielle. Vous pouvez appliquer cette règle au niveau d'une vue, à l'aide d'instructions ou d'une data clean room.
  • Règle d'analyse de restriction de jointure : limite les types de jointures pouvant être utilisés avec des colonnes spécifiques. Les jointures n'ont pas besoin d'être présentes dans les requêtes, et certaines colonnes peuvent être bloquées. Peut être incluse dans une règle d'analyse du seuil d'agrégation ou une règle d'analyse de confidentialité différentielle. Vous pouvez appliquer cette règle au niveau d'une vue, à l'aide d'instructions ou d'une data clean room.
  • Règle d'analyse du chevauchement de liste : semblable à la règle d'analyse de restriction de jointure, mais ne peut pas être utilisée avec d'autres règles d'analyse. Vous pouvez appliquer cette règle à une vue à l'aide de data clean room.

Règle d'analyse du seuil d'agrégation

Une règle d'analyse du seuil d'agrégation applique le nombre minimal d'entités distinctes qui doivent être présentes dans un ensemble de données, de sorte que les statistiques de cet ensemble de données soient incluses dans les résultats d'une requête.

Lorsqu'elle est appliquée, la règle d'analyse du seuil d'agrégation regroupe les données entre les dimensions, tout en garantissant que le seuil d'agrégation est atteint. Elle compte le nombre d'unités de confidentialité distinctes (représentées par la colonne d'unité de confidentialité) pour chaque groupe et ne génère que les groupes dont le nombre d'unités de confidentialité distincte respecte le seuil d'agrégation.

Une vue qui inclut cette règle d'analyse peut également inclure la règle d'analyse de restriction des jointures.

Définir une règle d'analyse du seuil d'agrégation pour une vue

Vous pouvez définir une règle d'analyse du seuil d'agrégation pour une vue dans une data clean room ou avec l'instruction suivante :

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

Remplacez les valeurs suivantes :

  • VIEW_NAME : chemin d'accès et nom de la vue.
  • THRESHOLD : nombre minimal d'unités de confidentialité distinctes qui doivent contribuer à chaque ligne dans les résultats de la requête. Si une ligne potentielle ne respecte pas ce seuil, elle est omise des résultats de la requête.
  • PRIVACY_UNIT_COLUMN : représente la colonne d'unité de confidentialité. Une colonne d'unités de confidentialité est un identifiant unique pour une unité de confidentialité. Une unité de confidentialité est une valeur de la colonne d'unité de confidentialité qui représente l'entité dans un ensemble de données protégées.

    Vous ne pouvez utiliser qu'une seule colonne d'unité de confidentialité. Le type de données de cette colonne doit être groupable.

    Les valeurs de la colonne d'unité de confidentialité ne peuvent pas être projetées directement via une requête. Vous ne pouvez utiliser que des fonctions d'agrégation compatibles avec les règles d'analyse pour agréger les données de cette colonne.

  • QUERY : requête de la vue.

Dans l'exemple suivant, une règle d'analyse du seuil d'agrégation est créée :

-- 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 );

Pour examiner la syntaxe privacy_policy de CREATE VIEW, consultez la liste OPTIONS dans CREATE VIEW.

Mettre à jour une règle d'analyse du seuil d'agrégation pour une vue

Vous pouvez modifier la règle d'analyse du seuil d'agrégation pour une vue dans une data clean room ou avec l'instruction suivante :

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

Remplacez les valeurs suivantes :

  • VIEW_NAME : chemin d'accès et nom de la vue.
  • THRESHOLD : nombre minimal d'unités de confidentialité distinctes qui doivent contribuer à chaque ligne dans les résultats de la requête. Si une ligne potentielle ne respecte pas ce seuil, elle est omise des résultats de la requête.
  • PRIVACY_UNIT_COLUMN : représente la colonne d'unité de confidentialité. Une colonne d'unités de confidentialité est un identifiant unique pour une unité de confidentialité. Une unité de confidentialité est une valeur de la colonne d'unité de confidentialité qui représente l'entité dans un ensemble de données protégées.

    Vous ne pouvez utiliser qu'une seule colonne d'unité de confidentialité. Le type de données de cette colonne doit être groupable.

    Les valeurs de la colonne d'unité de confidentialité ne peuvent pas être projetées directement via une requête. Vous ne pouvez utiliser que des fonctions d'agrégation compatibles avec les règles d'analyse pour agréger les données de cette colonne.

Dans l'exemple suivant, une règle d'analyse du seuil d'agrégation est mise à jour :

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

Pour examiner la syntaxe de privacy_policy pour ALTER VIEW, consultez la liste OPTIONS dans ALTER VIEW SET OPTIONS.

Interroger une vue associée à une règle d'analyse du seuil d'agrégation

Vous pouvez interroger une vue dotée d'une règle d'analyse de seuil d'agrégation à l'aide de la clause AGGREGATION_THRESHOLD. La requête doit inclure des fonctions d'agrégation. Vous ne pouvez utiliser que les fonctions d'agrégation compatibles avec les règles d'analyse dans cette requête.

Dans l'exemple suivant, une vue avec une règle d'analyse de seuil d'agrégation est interrogée :

-- 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             |
 *---------+---------------*/

Pour consulter d'autres exemples sur la clause AGGREGATION_THRESHOLD, reportez-vous à la section Clause AGGREGATION_THRESHOLD.

Règle d'analyse de confidentialité différentielle

La règle d'analyse de confidentialité différentielle applique un budget de confidentialité, qui limite les données présentées à un abonné lorsque celles-ci sont protégées par la confidentialité différentielle. Un budget de confidentialité empêche tout abonné d'interroger les données partagées lorsque la somme des valeurs epsilon ou delta de toutes les requêtes atteint la valeur epsilon totale ou delta totale. Vous pouvez utiliser cette règle d'analyse dans une vue. Une vue qui inclut cette règle d'analyse peut également inclure la règle d'analyse de restriction des jointures.

Définir une règle d'analyse de confidentialité différentielle pour une vue

Vous pouvez définir une règle d'analyse de confidentialité différentielle pour une vue dans une data clean room ou avec l'instruction suivante :

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;

Remplacez les valeurs suivantes :

  • PRIVACY_UNIT_COLUMN : colonne qui identifie l'entité d'un ensemble de données protégé à l'aide d'une règle d'analyse de la confidentialité. Il s'agit d'une chaîne JSON.
  • MAX_EPSILON_PER_QUERY : détermine la force de la garantie de confidentialité par requête et empêche la valeur epsilon totale d'être atteinte par une seule requête. Cette valeur est un nombre JSON compris entre 0.001 et 1e+15.
  • EPSILON_BUDGET : budget epsilon qui représente la force d'une garantie de confidentialité générale. Elle est utilisée dans son intégralité pour toutes les requêtes différentiellement privées sur la vue. Cette valeur doit être supérieure à MAX_EPSILON_PER_QUERY, et il s'agit d'un nombre JSON compris entre 0.001 et 1e+15.
  • DELTA_PER_QUERY : probabilité maximale de perte de confidentialité par requête au-delà de la garantie déterminée par le nombre total d'epsilon. Empêche que la valeur delta totale soit atteinte par une seule requête. Cette valeur est un nombre JSON compris entre 1e-15 et 1.
  • DELTA_BUDGET : budget delta, qui représente la probabilité maximale de perte globale de confidentialité au-delà de la garantie déterminée par la valeur epsilon totale. Elle est utilisée dans son intégralité pour toutes les requêtes différentiellement privées sur la vue. Cette valeur doit être supérieure à DELTA_PER_QUERY, et il s'agit d'un nombre JSON compris entre 1e-15 et 1000.
  • MAX_GROUPS_CONTRIBUTED : facultatif. Limite le nombre de groupes auxquels une entité d'une colonne d'unité de confidentialité peut contribuer. Cette valeur doit être un entier JSON non négatif.
  • QUERY : requête de la vue.

Dans l'exemple suivant, une règle d'analyse de confidentialité différentielle est créée :

-- 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.

Pour examiner la syntaxe privacy_policy de CREATE VIEW, consultez la liste OPTIONS dans CREATE VIEW.

Mettre à jour une règle d'analyse de confidentialité différentielle pour une vue

Vous pouvez modifier la règle d'analyse de confidentialité différentielle pour une vue dans une data clean room ou avec l'instruction suivante :

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

Remplacez les valeurs suivantes :

  • PRIVACY_UNIT_COLUMN : colonne qui identifie l'entité d'un ensemble de données protégé à l'aide d'une règle d'analyse de la confidentialité. Il s'agit d'une chaîne JSON.
  • MAX_EPSILON_PER_QUERY : détermine la force de la garantie de confidentialité par requête et empêche la valeur epsilon totale d'être atteinte par une seule requête. Cette valeur est un nombre JSON compris entre 0.001 et 1e+15.
  • EPSILON_BUDGET : budget epsilon qui représente la force d'une garantie de confidentialité générale. Elle est utilisée dans son intégralité pour toutes les requêtes différentiellement privées sur la vue. Cette valeur doit être supérieure à MAX_EPSILON_PER_QUERY, et il s'agit d'un nombre JSON compris entre 0.001 et 1e+15.
  • DELTA_PER_QUERY : probabilité maximale de perte de confidentialité par requête au-delà de la garantie déterminée par le nombre total d'epsilon. Empêche que la valeur delta totale soit atteinte par une seule requête. Cette valeur est un nombre JSON compris entre 1e-15 et 1.
  • DELTA_BUDGET : budget delta, qui représente la probabilité maximale de perte globale de confidentialité au-delà de la garantie déterminée par la valeur epsilon totale. Elle est utilisée dans son intégralité pour toutes les requêtes différentiellement privées sur la vue. Cette valeur doit être supérieure à DELTA_PER_QUERY, et il s'agit d'un nombre JSON compris entre 1e-15 et 1000.
  • MAX_GROUPS_CONTRIBUTED : facultatif. Limite le nombre de groupes auxquels une entité d'une colonne d'unité de confidentialité peut contribuer. Cette valeur doit être un entier JSON non négatif.

Dans l'exemple suivant, une règle d'analyse de confidentialité différentielle est mise à jour :

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.

Pour examiner la syntaxe de privacy_policy pour ALTER VIEW, consultez la liste OPTIONS dans ALTER VIEW SET OPTIONS.

Interroger une vue associée à une règle d'analyse de confidentialité différentielle

Vous pouvez interroger une vue comportant une règle d'analyse de confidentialité différentielle à l'aide de la clause DIFFERENTIAL_PRIVACY. Pour examiner la syntaxe et obtenir des exemples supplémentaires de la clause DIFFERENTIAL_PRIVACY, consultez la page Clause DIFFERENTIAL_PRIVACY.

Vérifier que la requête différentiellement privée s'exécute

Créez une requête différentiellement privée pour la vue associée à la règle d'analyse et assurez-vous que la requête s'exécute.

Par exemple, dans la requête suivante, les données différentiellement privées sont renvoyées par ExamView, car epsilon, delta et max_groups_contributed satisfont toutes aux conditions de la règle d'analyse différentielle dans 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 );

Une fois la vue créée, patientez brièvement puis, lorsque vous êtes certain qu'elle a été créée, exécutez la requête suivante :

-- 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.

Bloquer une requête avec un epsilon hors limites

Epsilon peut être utilisé pour ajouter ou supprimer du bruit. Plus le nombre epsilon est élevé, plus le bruit est ajouté. Si vous souhaitez vous assurer qu'une requête différentiellement privée comporte un minimum de bruit, vérifiez attentivement la valeur de max_epsilon_per_query dans votre règle d'analyse de confidentialité différentielle.

Par exemple, dans la requête suivante, la requête est bloquée avec une erreur, car la valeur de epsilon dans la clause DIFFERENTIAL_PRIVACY est supérieure à max_epsilon_per_query dans 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": 10.01, "epsilon_budget": 1000.0, "delta_per_query": 0.01, "delta_budget": 1000.0, "max_groups_contributed": 2}}'
)
AS ( SELECT * FROM mydataset.ExamTable );

Une fois la vue créée, attendez brièvement le temps d'exécuter la requête suivante :

-- 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.

Bloquer une requête n'ayant pas une valeur delta spécifique

La valeur delta représente le seuil qui détermine si des données peuvent avoir été divulguées accidentellement. Plus la valeur delta augmente, plus le seuil est faible. Pour vous assurer qu'une requête différentiellement privée possède un seuil spécifique, mettez à jour le paramètre delta_per_query dans votre règle d'analyse de confidentialité différentielle.

Par exemple, dans la requête suivante, la requête est bloquée avec une erreur, car delta dans la clause DIFFERENTIAL_PRIVACY ne correspond pas à delta_per_query dans 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": 10.01, "epsilon_budget": 1000.0, "delta_per_query": 0.01, "delta_budget": 1000.0, "max_groups_contributed": 2}}'
)
AS ( SELECT * FROM mydataset.ExamTable );

Une fois la vue créée, attendez brièvement le temps d'exécuter la requête suivante :

-- 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.

Bloquer les requêtes ayant dépassé un budget epsilon

Epsilon peut être utilisé pour ajouter ou supprimer du bruit. Une valeur epsilon plus faible augmente le bruit, et une valeur plus élevée réduit le bruit. Même lorsque le bruit est important, plusieurs requêtes portant sur les mêmes données peuvent à terme révéler la version sans bruit des données. Pour éviter cela, vous pouvez créer un budget epsilon. Si vous souhaitez ajouter un budget epsilon, vérifiez la valeur de epsilon_budget dans la règle d'analyse de confidentialité différentielle de votre vue.

Exécutez la requête suivante trois fois. La troisième fois, la requête est bloquée, car la valeur epsilon totale utilisée est de 30, mais epsilon_budget dans ExamView n'autorise que 25.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 );

Une fois la vue créée, attendez brièvement puis exécutez la requête suivante trois fois :

-- 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.

Bloquer les requêtes ayant dépassé un budget delta

La valeur delta représente le seuil qui détermine si des données peuvent avoir été divulguées accidentellement. Plus la valeur delta augmente, plus le seuil est faible. Même lorsque le seuil est élevé, plusieurs requêtes sur les mêmes données peuvent à terme révéler les données différentiellement privées. Pour éviter cela, vous pouvez créer un budget delta. Si vous souhaitez ajouter un budget delta, vérifiez la valeur de delta_budget dans la règle d'analyse de confidentialité différentielle de votre vue.

Exécutez la requête suivante sept fois. La septième fois, la requête est bloquée, car la valeur delta totale utilisée est de 0.7, mais delta_budget dans ExamView n'autorise que 0.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 );

Une fois que vous avez créé la vue, attendez brièvement, puis exécutez la requête suivante sept fois :

-- 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.

Bloquer une requête autorisant trop de contributions de groupe

Vous pouvez limiter le nombre de groupes auxquels chaque entité peut contribuer dans une requête différentiellement privée. Si vous souhaitez vous assurer qu'une requête différentiellement privée dispose d'un nombre limité de groupes auxquels chaque entité peut contribuer, prêtez une attention particulière à la valeur de max_groups_contributed dans votre règle d'analyse de confidentialité différentielle.

Par exemple, dans la requête suivante, la requête est bloquée avec une erreur, car la valeur de max_groups_contributed dans la clause DIFFERENTIAL_PRIVACY est supérieure à max_groups_contributed dans 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": 10.01, "epsilon_budget": 1000.0, "delta_per_query": 0.01, "delta_budget": 1000.0, "max_groups_contributed": 2}}'
)
AS ( SELECT * FROM mydataset.ExamTable );

Une fois la vue créée, attendez brièvement le temps d'exécuter la requête suivante :

-- 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.

Règle d'analyse de restriction de jointure

Une règle d'analyse de restriction de jointure limite les types de jointures pouvant être utilisés avec des colonnes spécifiques d'une vue. Vous pouvez utiliser cette règle d'analyse dans une vue. Une vue qui inclut cette règle d'analyse peut également inclure la règle d'analyse du seuil d'agrégation ou la règle d'analyse de confidentialité différentielle.

Définir une règle d'analyse de restriction de jointure pour une vue

Vous pouvez définir une règle d'analyse de restriction de jointure pour une vue dans une data clean room ou avec l'instruction suivante.

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

Remplacez les valeurs suivantes :

  • JOIN_CONDITION : type de restriction de jointure à appliquer à une vue. Il peut s'agir de l'une des valeurs suivantes :

    • JOIN_NOT_REQUIRED : une jointure n'est pas nécessaire pour interroger cette vue. Si une jointure est utilisée, seules les colonnes de join_allowed_columns peuvent être utilisées.

    • JOIN_BLOCKED : cette vue ne peut être jointe à aucune colonne. Dans ce cas, ne définissez pas join_allowed_columns.

    • JOIN_ANY : au moins une colonne de join_allowed_columns doit être jointe pour que cette vue soit interrogée.

    • JOIN_ALL : toutes les colonnes de join_allowed_columns doivent être jointes en interne pour que cette vue soit interrogée.

  • JOIN_ALLOWED_COLUMNS : colonnes pouvant faire partie d'une opération de jointure.

  • QUERY : requête de la vue.

Dans l'exemple suivant, une règle d'analyse de restriction de jointure est créée :

-- 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 );

Utiliser une règle d'analyse de restriction de jointure avec une autre règle d'analyse

Vous pouvez utiliser une règle d'analyse de restriction de jointure avec une règle d'analyse de seuil d'agrégation ou une règle d'analyse de confidentialité différentielle. Toutefois, une fois que vous avez utilisé une restriction de jointure avec une autre règle d'analyse sur une vue, vous ne pouvez plus modifier cette autre règle d'analyse.

Dans l'exemple suivant, une règle d'analyse de restriction de jointure et une règle d'analyse de seuil d'agrégation sont utilisées conjointement :

-- 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 );

Mettre à jour une règle d'analyse de restriction de jointure pour une vue

Vous pouvez modifier la règle d'analyse de restriction de jointure pour une vue avec une data clean room ou avec l'instruction suivante :

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

Remplacez les valeurs suivantes :

  • JOIN_CONDITION : type de restriction de jointure à appliquer à une vue. Il peut s'agir de l'une des valeurs suivantes :

    • JOIN_NOT_REQUIRED : une jointure n'est pas nécessaire pour interroger cette vue. Si une jointure est utilisée, seules les colonnes de join_allowed_columns peuvent être utilisées.

    • JOIN_BLOCKED : cette vue ne peut être jointe à aucune colonne. Dans ce cas, ne définissez pas join_allowed_columns.

    • JOIN_ANY : au moins une colonne de join_allowed_columns doit être jointe pour que cette vue soit interrogée.

    • JOIN_ALL : toutes les colonnes de join_allowed_columns doivent être jointes en interne pour que cette vue soit interrogée.

  • JOIN_ALLOWED_COLUMNS : colonnes pouvant faire partie d'une opération de jointure.

  • QUERY : requête de la vue.

Dans l'exemple suivant, une règle d'analyse de restriction de jointure est mise à jour :

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

Pour examiner la syntaxe de privacy_policy pour ALTER VIEW, consultez la liste OPTIONS dans ALTER VIEW SET OPTIONS.

Interroger une vue associée à une règle d'analyse de restriction de jointure

Vous pouvez effectuer une opération de jointure sur une vue dotée d'une règle d'analyse de restriction de jointure. Pour examiner la syntaxe de l'opération JOIN, consultez la section Opération JOIN.

Assurez-vous que la requête de restriction de jointure s'exécute

Vous devez effectuer un test pour vous assurer que votre requête restrictive de jointure s'exécute.

Par exemple, dans la requête suivante, les données jointes sont renvoyées avec succès à partir de ExamView et de StudentTable :

-- 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     | ???                |
 *---------+--------------------*/

Bloquer une opération de jointure sans colonne obligatoire

Vous pouvez bloquer une opération de jointure si elle n'inclut pas au moins une colonne obligatoire. Pour ce faire, incluez les parties suivantes dans votre règle d'analyse de restriction de jointure :

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

Par exemple, dans la requête suivante, la requête est bloquée avec une erreur, car elle ne contient aucune opération de jointure sur la colonne test_score ou test_id de ExamView et StudentTable :

-- 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;

Pour exécuter la requête précédente, dans la clause USING, remplacez last_name par test_score.

Bloquer une requête sans opération de jointure

Si la requête doit comporter une opération de jointure, vous pouvez la bloquer si aucune opération de jointure n'est présente à l'aide de l'une des règles d'analyse de restriction de jointure suivantes :

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

Par exemple, dans la requête suivante, la requête est bloquée, car elle ne comporte aucune opération de jointure :

-- 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;

Bloquer une requête sans opération de jointure et sans colonne obligatoire

Si la requête doit comporter une opération de jointure et au moins une colonne obligatoire, incluez les parties suivantes dans votre règle d'analyse de restriction de jointure :

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

Par exemple, dans la requête suivante, la requête est bloquée, car l'opération de jointure n'inclut pas de colonne dans le tableau 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;

Pour exécuter la requête précédente, dans la clause USING, remplacez last_name par test_score.

Bloquer toutes les opérations de jointure

Vous pouvez bloquer toutes les opérations de jointure. Pour ce faire, n'incluez que les parties suivantes dans votre règle d'analyse de restriction des jointures :

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

Par exemple, dans la requête suivante, la requête est bloquée, car il existe une opération de jointure :

-- 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;

Pour exécuter la requête précédente, supprimez l'opération INNER JOIN.

Bloquer une opération de jointure interne sans toutes les colonnes obligatoires

Vous pouvez bloquer une opération de jointure interne si elle n'inclut pas toutes les colonnes obligatoires. Pour ce faire, incluez les parties suivantes dans votre règle d'analyse de restriction de jointure :

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

Par exemple, dans la requête suivante, la requête est bloquée avec une erreur, car elle n'inclut pas test_score dans l'opération de jointure :

-- 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;

Pour exécuter la requête précédente, remplacez USING (last_name) par USING (last_name, test_score).

Répertorier la règle d'analyse de chevauchement

Limite les types de jointures pouvant être utilisés avec des colonnes spécifiques. Les jointures doivent être présentes dans les requêtes, et certaines colonnes ne peuvent pas être bloquées. Vous pouvez définir et mettre à jour une règle d'analyse de chevauchement de liste pour une vue dans une data clean room. Pour en savoir plus, consultez la section Partager des données sensibles avec des data clean room.

Limites

Les règles d'analyse présentent les limites suivantes :

  • Si vous avez déjà ajouté une règle d'analyse à une vue, vous ne pouvez pas basculer entre les règles d'analyse du seuil d'agrégation et les règles d'analyse différentielle.

Une règle d'analyse du seuil d'agrégation présente les limites suivantes :

  • Vous ne pouvez utiliser que des fonctions d'agrégation compatibles dans une requête sur une vue associée à une règle d'analyse du seuil d'agrégation.
  • Vous ne pouvez pas ajouter une règle d'analyse du seuil d'agrégation à une vue matérialisée.
  • Si vous utilisez une vue associée à une règle d'analyse du seuil d'agrégation dans une requête de seuil d'agrégation, elles doivent toutes les deux avoir la même valeur pour la colonne d'unité de confidentialité.
  • Si vous utilisez une vue associée à une règle d'analyse du seuil d'agrégation dans une requête de seuil d'agrégation, le seuil de la requête doit être supérieur ou égal au seuil de la vue.
  • Les fonctionnalités temporelles sont désactivées sur les vues associées à une règle d'analyse du seuil d'agrégation.

Une règle d'analyse de confidentialité différentielle présente les limites suivantes :

  • Une fois le budget de confidentialité épuisé pour une vue, cette vue ne peut plus être utilisée. Vous devez donc créer une autre vue.

Une règle d'analyse de restriction de jointure présente les limites suivantes :

  • Si vous ne placez pas l'élément privacy_unit_column en tant que join_allowed_column dans une règle d'analyse de restriction de jointure, dans certains cas, vous ne pourrez peut-être pas joindre les colonnes.

Tarification