תרחישים מורשים

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

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

אפשר לתת הרשאה לסוגים הבאים של פעולות שגרתיות:

מתן הרשאה לתרחישים

כדי לתת הרשאה לשימוש בשגרה, משתמשים במסוף Cloud de Confiance , בכלי שורת הפקודה של BigQuery או ב-API בארכיטקטורת REST:

המסוף

  1. נכנסים לדף BigQuery במסוף Cloud de Confiance .

    כניסה ל-BigQuery

  2. בחלונית הימנית, לוחצים על כלי הניתוחים:

    כפתור מודגש לחלונית הסייר.

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

  3. בחלונית Explorer, מרחיבים את הפרויקט, לוחצים על Datasets ובוחרים מערך נתונים.

  4. בחלונית הפרטים, לוחצים על שיתוף > אישור של שגרה.

  5. בדף Authorized routines, בקטע Authorize routine, בוחרים את Project,‏ Dataset ו-Routine עבור השגרה שרוצים לאשר.

  6. לוחצים על הוספת הרשאה.

BQ

  1. משתמשים בפקודה bq show כדי לקבל את הייצוג ב-JSON של מערך הנתונים שרוצים שהשגרה תגשת אליו. הפלט של הפקודה הוא ייצוג JSON של משאב Dataset. שומרים את התוצאה בקובץ מקומי.

    bq show --format=prettyjson TARGET_DATASET > dataset.json

    מחליפים את TARGET_DATASET בשם של מערך הנתונים שהשגרה יכולה לגשת אליו.

  2. עורכים את הקובץ כדי להוסיף את אובייקט ה-JSON הבא למערך access במשאב Dataset:

    {
     "routine": {
       "datasetId": "DATASET_NAME",
       "projectId": "PROJECT_ID",
       "routineId": "ROUTINE_NAME"
     }
    }

    מחליפים את מה שכתוב בשדות הבאים:

    • DATASET_NAME: השם של מערך הנתונים שמכיל את השגרה.
    • PROJECT_ID: מזהה הפרויקט שמכיל את השגרה.
    • ROUTINE_NAME: השם של התרחיש.
  3. אופציונלי: אם מאשרים הרשאה ל-stored procedure, מצרפים תפקיד IAM. התפקיד הזה מגביל את הגישה להליך המורשה בהתאם להרשאות שלו. כדי לעשות את זה, מוסיפים "role" לאובייקט ה-JSON:

    {
     "role": "ROLE_NAME",
     "routine": {
       "datasetId": "DATASET_NAME",
       "projectId": "PROJECT_ID",
       "routineId": "ROUTINE_NAME"
     }
    }

    מחליפים את ROLE_NAME בשם התפקיד שרוצים לצרף. אפשר לצרף את התפקידים הבאים לפרוצדורה מאוחסנת:

    אי אפשר להשתמש בתפקידים בסוגים אחרים של שגרה.
  4. משתמשים בפקודה bq update כדי לעדכן את מערך הנתונים:

    bq update --source dataset.json TARGET_DATASET

API

  1. מבצעים קריאה ל-datasets.get כדי לאחזר את מערך הנתונים שרוצים שהשגרה תגש אליו. גוף התשובה מכיל ייצוג של משאב Dataset.

  2. מוסיפים את אובייקט ה-JSON הבא למערך access במשאב Dataset:

    {
     "routine": {
       "datasetId": "DATASET_NAME",
       "projectId": "PROJECT_ID",
       "routineId": "ROUTINE_NAME"
     }
    }

    מחליפים את מה שכתוב בשדות הבאים:

    • DATASET_NAME: השם של מערך הנתונים שמכיל את ה-UDF.
    • PROJECT_ID: מזהה הפרויקט שמכיל את ה-UDF.
    • ROUTINE_NAME: השם של התרחיש.
  3. אופציונלי: אם מאשרים הרשאה להפעלה של פרוצדורה מאוחסנת, צריך לצרף תפקיד IAM. התפקיד הזה מגביל את הגישה להליך המורשה על סמך ההרשאות שלו. כדי לעשות את זה, מוסיפים את "role" לאובייקט JSON:

    {
     "role": "ROLE_NAME",
     "routine": {
       "datasetId": "DATASET_NAME",
       "projectId": "PROJECT_ID",
       "routineId": "ROUTINE_NAME"
     }
    }

    מחליפים את ROLE_NAME בשם התפקיד שרוצים לצרף. אפשר לצרף את התפקידים הבאים לפרוצדורה מאוחסנת:

    אי אפשר להשתמש בתפקידים בסוגים אחרים של שגרה.
  4. מבצעים קריאה ל-method dataset.update עם הייצוג Dataset ששונה.

מכסות ומגבלות

שגרות מורשות כפופות למגבלות של מערך הנתונים. מידע נוסף מופיע במאמר בנושא מגבלות על מערכי נתונים.

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

מגבלות

אי אפשר ליצור שגרה מורשית בעותק משני. מידע נוסף זמין במאמר התנהגות של משאבים בשכפול של מערכי נתונים.

דוגמה לשגרה מורשית

הדוגמה הבאה היא של תהליך מלא ליצירה של UDF עם הרשאה ושימוש בה.

  1. יוצרים שני מערכי נתונים בשם private_dataset ו-public_dataset. מידע נוסף על יצירת מערך נתונים זמין במאמר יצירת מערך נתונים.

  2. מריצים את ההצהרה הבאה כדי ליצור טבלה בשם private_table ב-private_dataset:

    CREATE OR REPLACE TABLE private_dataset.private_table
    AS SELECT key FROM UNNEST(['key1', 'key1','key2','key3']) key;
    
  3. מריצים את ההצהרה הבאה כדי ליצור פונקציה מוגדרת על ידי המשתמש בשם count_key ב-public_dataset. ה-UDF כולל הצהרה SELECT לגבי private_table.

    CREATE OR REPLACE FUNCTION public_dataset.count_key(input_key STRING)
    RETURNS INT64
    AS
    ((SELECT COUNT(1) FROM private_dataset.private_table t WHERE t.key = input_key));
    
  4. נותנים למשתמש את התפקיד bigquery.dataViewer במערך הנתונים public_dataset. התפקיד הזה כולל את ההרשאה bigquery.routines.get, שמאפשרת למשתמש להפעיל את השגרה. מידע על הקצאת אמצעי בקרת גישה למערך נתונים זמין במאמר שליטה בגישה למערכי נתונים.

  5. בשלב הזה, למשתמש יש הרשאה להפעיל את שגרת count_key, אבל אין לו גישה לטבלה ב-private_dataset. אם המשתמש ינסה להפעיל את השגרה, תוצג לו הודעת שגיאה דומה לזו:

    Access Denied: Table myproject:private_dataset.private_table: User does
    not have permission to query table myproject:private_dataset.private_table.
    
  6. מריצים את הפקודה show באמצעות כלי שורת הפקודה של BigQuery באופן הבא:

    bq show --format=prettyjson private_dataset > dataset.json

    הפלט נשמר בקובץ מקומי בשם dataset.json.

  7. עורכים את dataset.json כדי להוסיף את אובייקט ה-JSON הבא למערך access:

    {
     "routine": {
       "datasetId": "public_dataset",
       "projectId": "PROJECT_ID",
       "routineId": "count_key"
     }
    }

    מחליפים את PROJECT_ID במזהה הפרויקט של public_dataset.

  8. מריצים את הפקודה update באמצעות כלי שורת הפקודה של BigQuery באופן הבא:

    bq update --source dataset.json private_dataset
  9. כדי לוודא של-UDF יש גישה ל-private_dataset, המשתמש יכול להריץ את השאילתה הבאה:

    SELECT public_dataset.count_key('key1');