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

אם החלונית הימנית לא מוצגת, לוחצים על הרחבת החלונית הימנית כדי לפתוח אותה.
בחלונית 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 (
roles/bigquery.routineDataEditor) - אדמין של שגרות ב-BigQuery (
roles/bigquery.routineAdmin)
- BigQuery Routine Metadata Viewer (
משתמשים בפקודה
bq updateכדי לעדכן את מערך הנתונים:bq update --source dataset.json TARGET_DATASET
API
מפעילים את ה-method
datasets.getכדי לאחזר את קבוצת הנתונים שאליה רוצים שהתרחיש ייגש. גוף התשובה מכיל ייצוג של המשאבDataset.מוסיפים את אובייקט ה-JSON הבא למערך
accessבמשאבDataset:{ "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
מחליפים את מה שכתוב בשדות הבאים:
-
DATASET_NAME: שם קבוצת הנתונים שמכילה את ה-UDF. -
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 (
roles/bigquery.routineDataEditor) - אדמין של שגרות ב-BigQuery (
roles/bigquery.routineAdmin)
- BigQuery Routine Metadata Viewer (
מפעילים את ה-method
dataset.updateעם הייצוג שלDatasetששונה.
מכסות ומגבלות
שגרות מורשות כפופות למגבלות של מערך הנתונים. מידע נוסף זמין במאמר מגבלות של מערכי נתונים.
אם מעדכנים שגרה, פג התוקף של ההרשאה הקיימת שלה לשגרות מורשות. BigQuery מסיר באופן אוטומטי רשומות הרשאה של שגרות מורשות לא עדכניות תוך 24 שעות. כדי לעדכן את הרשומות באופן מיידי, צריך למחוק אותן באופן ידני מהרשימה "Currently authorized routines" לפני שנותנים להן הרשאה מחדש.
מגבלות
אי אפשר ליצור שגרה מורשית ברפליקה משנית. מידע נוסף זמין במאמר התנהגות המשאבים ברפליקציה של מערכי נתונים.
דוגמה לשגרה מורשית
הדוגמה הבאה היא מקצה לקצה, ומראה איך יוצרים 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;מריצים את ההצהרה הבאה כדי ליצור פונקציה מוגדרת-משתמש בשם
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');