הגבלת הגישה לנתונים באמצעות כללי ניתוח

במאמר הזה מוסבר על כללי ניתוח ב-GoogleSQL ל-BigQuery.

מהו כלל ניתוח?

כלל ניתוח אוכף מדיניות לשיתוף נתונים. מדיניות מייצגת תנאי שצריך להתקיים לפני שאפשר להריץ שאילתה. באמצעות BigQuery, אפשר לאכוף כלל ניתוח בתצוגה, באמצעות חדר נקי לנתונים או על ידי החלת כלל הניתוח ישירות על התצוגה. כשמחילים כלל ניתוח, מחייבים את כל מי שמבצע שאילתה בתצוגה המפורטת לפעול בהתאם לכלל הניתוח הזה בתצוגה המפורטת. אם מתקיימים התנאים של כלל הניתוח, השאילתה מפיקה פלט שעומד בדרישות של כלל הניתוח. אם השאילתה לא עומדת בדרישות של כלל הניתוח, נוצרת שגיאה.

כללי ניתוח נתמכים

אלה כללי הניתוח שנתמכים:

  • כלל ניתוח של הסף לצבירת נתונים: אוכף את המספר המינימלי של ישויות נפרדות שצריך להיות במערך נתונים. אפשר לאכוף את הכלל הזה בתצוגה באמצעות הצהרות DDL או חדרים נקיים לנתונים. הכלל הזה תומך במדיניות של סף צבירה ובמדיניות של הגבלת הצטרפות.

  • כלל ניתוח פרטיות דיפרנציאלית: אוכף תקציב פרטיות, שמגביל את הנתונים שנחשפים למנוי כשהנתונים מוגנים באמצעות פרטיות דיפרנציאלית. אפשר לאכוף את הכלל הזה בתצוגה באמצעות הצהרות DDL או חדרים נקיים לנתונים. הכלל הזה תומך במדיניות בנושא פרטיות דיפרנציאלית ובמדיניות בנושא הגבלת הצטרפות.

  • כלל ניתוח חפיפה בין רשימות: אפשר לשלוח שאילתות לגבי שורות חופפות רק אחרי פעולת צירוף, בהתאם לכלל. אפשר לאכוף את הכלל הזה בתצוגה באמצעות הצהרות DDL או מרחבי נתונים נקיים. הכלל הזה תומך במדיניות הגבלת ההצטרפות.

כלל ניתוח של סף צבירת נתונים

כלל ניתוח של הסף לצבירת נתונים אוכף את המספר המינימלי של ישויות נפרדות שצריכות לתרום לשורת פלט של שאילתה, כדי ששורת הפלט תיכלל בתוצאת השאילתה.

כשכלל הניתוח של הסף לצבירת נתונים נאכף, המערכת מקבצת נתונים לפי מאפיינים שונים, תוך הקפדה על עמידה בסף לצבירת נתונים. הפונקציה סופרת את מספר יחידות הפרטיות השונות (שמיוצגות על ידי העמודה privacy_unit) בכל קבוצה, ומחזירה רק את הקבוצות שבהן מספר יחידות הפרטיות השונות עומד בדרישות של הסף לצבירת נתונים.

תצוגה שכוללת את כלל הניתוח הזה חייבת לכלול את מדיניות הסף לצבירת נתונים, ויכולה לכלול גם את מדיניות הגבלת הצירוף.

הגדרה של כלל ניתוח של סף לצבירת נתונים בתצוגה מפורטת

אפשר להגדיר כלל ניתוח של הסף לצבירת נתונים בתצוגה מפורטת בחדר נקי לנתונים או באמצעות ההצהרה 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: מייצג את העמודה של יחידת הפרטיות. עמודה של יחידת פרטיות היא מזהה ייחודי של יחידת פרטיות. יחידת פרטיות היא ערך מעמודת יחידת הפרטיות שמייצג את הישות במערך נתונים שמוגן.

      אפשר להשתמש רק בעמודה אחת של יחידת פרטיות, וסוג הנתונים של העמודה הזו צריך להיות ניתן לקיבוץ.

      אי אפשר להקרין את הערכים בעמודה של יחידת הפרטיות ישירות באמצעות שאילתה, ואפשר להשתמש רק בפונקציות מצטברות שנתמכות על ידי כללי ניתוח כדי לצבור את הנתונים בעמודה הזו.

  • join_restriction_policy (אופציונלי): מדיניות ההגבלות האופציונלית על הצטרפות לכלל ניתוח הסף לצבירת נתונים.

    • JOIN_CONDITION: סוג הגבלת ההצטרפות שרוצים לאכוף בתצוגה. הערך יכול להיות אחד מהערכים הבאים:

      • JOIN_ALL: כל העמודות ב-join_allowed_columns חייבות להיות מצורפות באמצעות inner join כדי שאפשר יהיה להריץ שאילתות בתצוגה הזו.

      • JOIN_ANY: צריך להצטרף לעמודה אחת לפחות ב-join_allowed_columns כדי שאפשר יהיה לשלוח שאילתות לתצוגה הזו.

      • JOIN_BLOCKED: אי אפשר לצרף את התצוגה הזו לאורך אף עמודה. במקרה כזה, לא מגדירים את join_allowed_columns.

      • JOIN_NOT_REQUIRED: לא נדרש צירוף כדי לבצע שאילתה בתצוגה הזו. אם נעשה שימוש ב-join, אפשר להשתמש רק בעמודות ב-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 );

כדי לבדוק את התחביר של privacy_policy ב-CREATE VIEW, אפשר לעיין ברשימה OPTIONS ב-CREATE VIEW.

עדכון כלל ניתוח של הסף לצבירת נתונים בתצוגה מפורטת

אפשר לשנות את כלל הניתוח של הסף לצבירת נתונים עבור תצוגה מפורטת בחדר נקי לנתונים או באמצעות ההצהרה 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"}}'
);

כדי לבדוק את התחביר של privacy_policy ל-ALTER VIEW, אפשר לעיין ברשימה OPTIONS ב-ALTER VIEW SET OPTIONS.

שאילתה של תצוגה מפורטת שמופעל בה כלל ניתוח של סף לצבירת נתונים

אפשר להריץ שאילתה על תצוגה שיש בה כלל ניתוח של הסף לצבירת נתונים באמצעות פסוקית 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: קובע את כמות הרעש שנוספת לתוצאות של כל שאילתה, ומונע משאילתה אחת להגיע לערך אפסילון הכולל. הערך הזה הוא מספר JSON מ-0.001 עד 1e+15.

    • EPSILON_BUDGET: תקציב אפסילון שמייצג את סך האפסילון שאפשר להשתמש בו בכל השאילתות עם פרטיות דיפרנציאלית בתצוגה. הערך הזה צריך להיות גדול מ-MAX_EPSILON_PER_QUERY, והוא מספר JSON מ-0.001 עד 1e+15.

    • DELTA_PER_QUERY: ההסתברות שכל שורה בתוצאה לא תהיה פרטית באופן דיפרנציאלי עם אפסילון. הערך הזה הוא מספר JSON בין 1e-15 ל-1.

    • DELTA_BUDGET: תקציב הדלתא, שמייצג את הדלתא הכוללת שאפשר להשתמש בה בכל השאילתות עם פרטיות דיפרנציאלית בתצוגה. הערך הזה צריך להיות גדול מ-DELTA_PER_QUERY, והוא מספר JSON מ-1e-15 עד 1000.

    • MAX_GROUPS_CONTRIBUTED (אופציונלי): מגביל את מספר הקבוצות שאליהן יכולה לתרום ישות בעמודה של יחידת פרטיות. הערך הזה חייב להיות מספר שלם חיובי ב-JSON.

  • join_restriction_policy (אופציונלי): מדיניות ההגבלה האופציונלית להצטרפות לכלל הניתוח של פרטיות דיפרנציאלית.

    • JOIN_CONDITION: סוג הגבלת ההצטרפות שרוצים לאכוף בתצוגה. הערך יכול להיות אחד מהערכים הבאים:

      • JOIN_ALL: כל העמודות ב-join_allowed_columns חייבות להיות מצורפות באמצעות inner join כדי שאפשר יהיה להריץ שאילתות בתצוגה הזו.

      • JOIN_ANY: צריך להצטרף לעמודה אחת לפחות ב-join_allowed_columns כדי שאפשר יהיה לשלוח שאילתות לתצוגה הזו.

      • JOIN_BLOCKED: אי אפשר לצרף את התצוגה הזו לאורך אף עמודה. במקרה כזה, לא מגדירים את join_allowed_columns.

      • JOIN_NOT_REQUIRED: לא נדרש צירוף כדי לבצע שאילתה בתצוגה הזו. אם נעשה שימוש ב-join, אפשר להשתמש רק בעמודות ב-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.

כדי לבדוק את התחביר של privacy_policy ב-CREATE VIEW, אפשר לעיין ברשימה OPTIONS ב-CREATE VIEW.

עדכון כלל ניתוח של פרטיות דיפרנציאלית בתצוגה מפורטת

אפשר לשנות את כלל הניתוח של פרטיות דיפרנציאלית בתצוגה בחדר נקי לנתונים או באמצעות ההצהרה 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.

כדי לבדוק את התחביר של privacy_policy ל-ALTER VIEW, אפשר לעיין ברשימה OPTIONS ב-ALTER VIEW SET OPTIONS.

שאילתה של תצוגה שמופעל בה כלל ניתוח של פרטיות דיפרנציאלית

אפשר לשלוח שאילתה לתצוגה שכוללת כלל ניתוח של פרטיות דיפרנציאלית באמצעות פסקה DIFFERENTIAL_PRIVACY. כדי לעיין בתחביר ובדוגמאות נוספות של פסוקית DIFFERENTIAL_PRIVACY, אפשר לעבור אל פסוקית DIFFERENTIAL_PRIVACY.

דוגמה:

בדוגמה הבאה, מתבצעת שאילתה על כלל ניתוח של פרטיות דיפרנציאלית בתצוגה שנקראת ExamView. הנתונים עם הפרטיות הדיפרנציאלית אמורים לחזור מ-ExamView כי epsilon, delta ו-max_groups_contributed עומדים בתנאים של כלל הניתוח הדיפרנציאלי ב-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 |
 *---------+--------------------*/

חסימת שאילתה עם אפסילון שחורג מהגבולות

אפשר להשתמש ב-Epsilon כדי להוסיף רעש או להסיר אותו. ככל שערך האפסילון גבוה יותר, כך יתווסף פחות רעש. אם רוצים לוודא שבשאילתה עם פרטיות דיפרנציאלית יש כמות מינימלית של רעש, צריך לשים לב לערך של max_epsilon_per_query בכלל הניתוח של הפרטיות הדיפרנציאלית.

דוגמה:

בשאילתה הבאה, השאילתה נחסמת עם שגיאה כי הערך של epsilon בסעיף DIFFERENTIAL_PRIVACY גבוה מהערך של max_epsilon_per_query ב-ExamView:

-- 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 כדי להוסיף רעש או להסיר אותו. ערך אפסילון נמוך יותר מגביר את הרעש, וערך אפסילון גבוה יותר מפחית את הרעש. גם כשהרעש גבוה, הרצת כמה שאילתות על אותם נתונים יכולה בסופו של דבר לחשוף את הגרסה של הנתונים ללא הרעש. כדי למנוע את זה, אפשר ליצור תקציב אפסילון. אם רוצים להוסיף תקציב אפסילון, צריך לעיין בערך של epsilon_budget בכלל הניתוח של פרטיות דיפרנציאלית בתצוגה המפורטת.

דוגמה:

מריצים את השאילתה הבאה שלוש פעמים. בפעם השלישית, השאילתה נחסמת כי סכום האפסילון שנעשה בו שימוש הוא 30, אבל epsilon_budget ב-ExamView מאפשר רק 25.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.

אחרי שיוצרים את התצוגה, מחכים רגע ואז מריצים את השאילתה הבאה שלוש פעמים:

-- 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 חייבות להיות מצורפות באמצעות inner join כדי שאפשר יהיה להריץ שאילתות בתצוגה הזו.

      • JOIN_ANY: צריך להצטרף לעמודה אחת לפחות ב-join_allowed_columns כדי שאפשר יהיה לשלוח שאילתות לתצוגה הזו.

    • 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"]}}'
);

כדי לבדוק את התחביר של privacy_policy ל-ALTER VIEW, אפשר לעיין ברשימה OPTIONS ב-ALTER VIEW SET OPTIONS.

שאילתה של תצוגה שמופעל בה כלל ניתוח חפיפה של רשימות

אפשר לבצע פעולת איחוד בתצוגה שיש לה כלל ניתוח של חפיפה בין רשימות. כדי לבדוק את התחביר של הפעולה JOIN, אפשר לעיין במאמר בנושא איחוד בין מערכי נתונים.

חסימת פעולת איחוד ללא חפיפה

אפשר לחסום פעולת איחוד אם היא לא כוללת חפיפה אחת לפחות עם עמודה נדרשת.

דוגמה:

בשאילתה הבאה, תצוגה בשם ExamView מצורפת לטבלה בשם StudentTable. התצוגה מכילה את כלל הניתוח של חפיפה ברשימה JOIN_ANY, ולכן נדרשת לפחות שורה אחת של חפיפה מ-ExamView ומ-StudentTable. מכיוון שיש לפחות חפיפה אחת, השאילתה רצה בהצלחה.

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

חסימת פעולת הצטרפות ללא עמודה נדרשת

אפשר לחסום פעולת הצטרפות אם היא לא כוללת לפחות עמודה אחת נדרשת. כדי לעשות את זה, צריך לכלול את החלקים הבאים בכלל לניתוח חפיפה בין רשימות:

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

דוגמה:

בשאילתה הבאה, השאילתה נחסמת עם שגיאה כי היא לא מכילה פעולות של צירוף בעמודה test_score או test_id בטבלאות ExamView ו-StudentTable:

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

כדי להריץ את השאילתה הקודמת, מחליפים את last_name בסעיף USING ב-test_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;

חסימת שאילתה ללא פעולת צירוף וללא עמודה נדרשת

אם השאילתה צריכה לכלול פעולת צירוף, ולפעולת הצירוף צריכה להיות לפחות עמודה אחת נדרשת, צריך לכלול את החלקים הבאים בכלל לניתוח חפיפה של רשימות:

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

כדי להריץ את השאילתה הקודמת, מחליפים את last_name בסעיף USING ב-test_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", ...]
}

דוגמה:

בשאילתה הבאה, השאילתה נחסמת עם שגיאה כי היא לא כוללת את test_score בפעולת הצירוף עם התצוגה שנקראת 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_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).

טבלאות לדוגמה

במסמך הזה יש כמה דוגמאות שמתייחסות לשתי טבלאות שנקראות ExamTable ו-StudentTable. ‫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_column כ-join_allowed_column בכלל ניתוח החפיפה בין רשימות, יכול להיות שלא תוכלו לצרף עמודות מסוימות במקרים מסוימים.

תמחור