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

אם החלונית הימנית לא מוצגת, לוחצים על הרחבת החלונית הימנית כדי לפתוח אותה.
בחלונית Explorer, מרחיבים את הפרויקט, לוחצים על Datasets ואז בוחרים מערך נתונים.
בחלונית הפרטים, לוחצים על שיתוף > אישור שגרות.
בדף Authorized routines (שגרות מורשות), בקטע Authorize routine (אישור שגרה), בוחרים את Project (פרויקט), Dataset (מערך נתונים) ו-Routine (שגרה) עבור השגרה שרוצים לאשר.
לוחצים על הוספת הרשאה.
BQ
משתמשים בפקודה
bq showכדי לקבל את הייצוג ב-JSON של מערך הנתונים שרוצים שהשגרה תגשת אליו. הפלט מהפקודה הוא ייצוג JSON של משאבDataset. שומרים את התוצאה בקובץ מקומי.bq show --format=prettyjson TARGET_DATASET > dataset.json
מחליפים את
TARGET_DATASETבשם של מערך הנתונים שהשגרה יכולה לגשת אליו.עורכים את הקובץ כדי להוסיף את אובייקט ה-JSON הבא למערך
accessבמשאבDataset:{ "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
מחליפים את מה שכתוב בשדות הבאים:
-
DATASET_NAME: השם של מערך הנתונים שמכיל את השגרה. -
PROJECT_ID: מזהה הפרויקט שמכיל את השגרה. -
ROUTINE_NAME: השם של התרחיש.
-
אופציונלי: אם מאשרים הרשאה לפרוצדורה מאוחסנת, מצרפים תפקיד IAM. התפקיד הזה מגביל את הגישה להליך המורשה על סמך ההרשאות שלו. כדי לעשות את זה, מוסיפים
"role"לאובייקט ה-JSON:{ "role": "ROLE_NAME", "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
מחליפים את
ROLE_NAMEבשם התפקיד שרוצים לצרף. אפשר לצרף את התפקידים הבאים לפרוצדורה מאוחסנת:- BigQuery Routine Metadata Viewer (
roles/bigquery.routineMetadataViewer) - BigQuery Routine Data Viewer (
roles/bigquery.routineDataViewer) - עריכה של נתוני BigQuery Routine (
roles/bigquery.routineDataEditor) - אדמין של שגרות BigQuery (
roles/bigquery.routineAdmin)
- BigQuery Routine Metadata Viewer (
משתמשים בפקודה
bq updateכדי לעדכן את מערך הנתונים:bq update --source dataset.json TARGET_DATASET
API
מבצעים קריאה ל-
datasets.getכדי לאחזר את מערך הנתונים שרוצים שהשגרה תגשת אליו. גוף התגובה מכיל ייצוג של משאבDataset.מוסיפים את אובייקט ה-JSON הבא למערך
accessבמשאבDataset:{ "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
מחליפים את מה שכתוב בשדות הבאים:
-
DATASET_NAME: השם של מערך הנתונים שמכיל את הפונקציה המוגדרת על ידי המשתמש. -
PROJECT_ID: מזהה הפרויקט שמכיל את הפונקציה המוגדרת על ידי המשתמש. -
ROUTINE_NAME: השם של התרחיש.
-
אופציונלי: אם מאשרים הרשאה להפעלה של פרוצדורה מאוחסנת, צריך לצרף תפקיד IAM. התפקיד הזה מגביל את הגישה להליך המורשה על סמך ההרשאות שלו. כדי לעשות את זה, מוסיפים את
"role"לאובייקט JSON:{ "role": "ROLE_NAME", "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
מחליפים את
ROLE_NAMEבשם התפקיד שרוצים לצרף. אפשר לצרף את התפקידים הבאים לפרוצדורה מאוחסנת:- BigQuery Routine Metadata Viewer (
roles/bigquery.routineMetadataViewer) - BigQuery Routine Data Viewer (
roles/bigquery.routineDataViewer) - עריכה של נתוני BigQuery Routine (
roles/bigquery.routineDataEditor) - אדמין של שגרות BigQuery (
roles/bigquery.routineAdmin)
- BigQuery Routine Metadata Viewer (
מבצעים קריאה ל-method
dataset.updateעם הייצוגDatasetששונה.
מכסות ומגבלות
שגרות מורשות כפופות למגבלות של מערך הנתונים. מידע נוסף מופיע במאמר בנושא מגבלות על מערכי נתונים.
אם מעדכנים שגרה, ההרשאה הקיימת שלה פוקעת. מערכת BigQuery מסירה אוטומטית רשומות הרשאה ישנות של שגרות מורשות תוך 24 שעות. כדי לעדכן את הרשומות באופן מיידי, צריך למחוק ידנית את הרשומה מהרשימה 'שגרות שמאושרות כרגע' לפני שמאשרים אותה מחדש.
דוגמה לשגרה מורשית
הדוגמה הבאה היא של תהליך מקצה לקצה של יצירה ושימוש בפונקציה מוגדרת על ידי המשתמש (UDF) עם הרשאה.
יוצרים שני מערכי נתונים בשם
private_datasetו-public_dataset. מידע נוסף על יצירת מערך נתונים זמין במאמר יצירת מערך נתונים.מריצים את ההצהרה הבאה כדי ליצור טבלה בשם
private_tableב-private_dataset:CREATE OR REPLACE TABLE private_dataset.private_table AS SELECT key FROM UNNEST(['key1', 'key1','key2','key3']) key;מריצים את ההצהרה הבאה כדי ליצור 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));נותנים למשתמש את התפקיד
bigquery.dataViewerבמערך הנתוניםpublic_dataset. התפקיד הזה כולל את ההרשאהbigquery.routines.get, שמאפשרת למשתמש לקרוא לשגרה. במאמר שליטה בגישה למערכי נתונים מוסבר איך להקצות אמצעי בקרת גישה למערך נתונים.בשלב הזה, למשתמש יש הרשאה להפעיל את שגרת
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.
מריצים את הפקודה
showבאמצעות כלי שורת הפקודה של BigQuery באופן הבא:bq show --format=prettyjson private_dataset > dataset.json
הפלט נשמר בקובץ מקומי בשם
dataset.json.עורכים את
dataset.jsonכדי להוסיף את אובייקט ה-JSON הבא למערךaccess:{ "routine": { "datasetId": "public_dataset", "projectId": "PROJECT_ID", "routineId": "count_key" } }
מחליפים את
PROJECT_IDבמזהה הפרויקט שלpublic_dataset.מריצים את הפקודה
updateבאמצעות כלי שורת הפקודה של BigQuery באופן הבא:bq update --source dataset.json private_dataset
כדי לוודא של-UDF יש גישה ל-
private_dataset, המשתמש יכול להריץ את השאילתה הבאה:SELECT public_dataset.count_key('key1');