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

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

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

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

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

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

המסוף

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

    כניסה ל-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. אופציונלי: אם מאשרים הרשאה לפרוצדורה מאוחסנת, מצרפים תפקיד 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: השם של מערך הנתונים שמכיל את הפונקציה המוגדרת על ידי המשתמש.
    • PROJECT_ID: מזהה הפרויקט שמכיל את הפונקציה המוגדרת על ידי המשתמש.
    • 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. מריצים את ההצהרה הבאה כדי ליצור UDF בשם 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');