ניהול טבלאות

במאמר הזה מוסבר איך לנהל טבלאות ב-BigQuery. אפשר לנהל את הטבלאות ב-BigQuery בדרכים הבאות:

מידע על שחזור (או ביטול מחיקה) של טבלה שנמחקה זמין במאמר שחזור טבלאות שנמחקו.

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

לפני שמתחילים

מקצים תפקידים של ניהול זהויות והרשאות גישה (IAM) שמעניקים למשתמשים את ההרשאות הדרושות לביצוע כל משימה שמופיעה במאמר הזה. ההרשאות שנדרשות לביצוע משימה (אם יש כאלה) מפורטות בקטע 'הרשאות נדרשות' של המשימה.

עדכון מאפייני הטבלה

אפשר לעדכן את הרכיבים הבאים בטבלה:

ההרשאות הנדרשות

כדי לקבל את ההרשאות שנדרשות לעדכון מאפייני הטבלה, צריך לבקש מהאדמין להקצות לכם ב-IAM את התפקיד עורך נתונים (roles/bigquery.dataEditor) בטבלה. להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

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

ההרשאות הנדרשות

כדי לעדכן את מאפייני הטבלה, נדרשות ההרשאות הבאות:

  • bigquery.tables.update
  • bigquery.tables.get

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

בנוסף, אם יש לכם הרשאה bigquery.datasets.create, אתם יכולים לעדכן את המאפיינים של הטבלאות במערכי הנתונים שאתם יוצרים.

עדכון התיאור של טבלה

אפשר לעדכן את התיאור של טבלה בדרכים הבאות:

  • באמצעות מסוף Google Cloud .
  • באמצעות הצהרה של שפת הגדרת נתונים (DDL) ALTER TABLE.
  • שימוש בפקודה bq update של כלי שורת הפקודה של bq.
  • קריאה ל-API method ‏tables.patch.
  • שימוש בספריות לקוח.
  • יצירת תיאור באמצעות Gemini ב-BigQuery.

כדי לעדכן את התיאור של טבלה:

המסוף

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

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

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

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

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

  3. לוחצים על סקירה כללית > טבלאות ובוחרים טבלה.

  4. לוחצים על הכרטיסייה פרטים ואז על עריכת הפרטים.

  5. בקטע תיאור, מוסיפים תיאור חדש או עורכים תיאור קיים.

  6. לוחצים על Save.

SQL

משתמשים בהצהרה ALTER TABLE SET OPTIONS. בדוגמה הבאה מתעדכנת ההגדרה של טבלה בשם mytable:

  1. במסוף Google Cloud , עוברים לדף BigQuery.

    כניסה ל-BigQuery

  2. מזינים את ההצהרה הבאה בעורך השאילתות:

    ALTER TABLE mydataset.mytable
      SET OPTIONS (
        description = 'Description of mytable');

  3. לוחצים על הפעלה.

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

BQ

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. מריצים את הפקודה bq update עם הדגל --description. אם אתם מעדכנים טבלה בפרויקט שאינו פרויקט ברירת המחדל שלכם, צריך להוסיף את מזהה הפרויקט לשם מערך הנתונים בפורמט הבא: project_id:dataset.

    bq update \
    --description "description" \
    project_id:dataset.table

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

    • description: הטקסט שמתאר את הטבלה במירכאות
    • project_id: מזהה הפרויקט
    • dataset: שם מערך הנתונים שמכיל את הטבלה שאתם מעדכנים
    • table: שם הטבלה שרוצים לעדכן

    דוגמאות:

    כדי לשנות את התיאור של הטבלה mytable במערך הנתונים mydataset ל-Description of mytable, מזינים את הפקודה הבאה. מערך הנתונים mydataset נמצא בפרויקט ברירת המחדל.

    bq update --description "Description of mytable" mydataset.mytable
    

    כדי לשנות את התיאור של הטבלה mytable במערך הנתונים mydataset ל-Description of mytable, מזינים את הפקודה הבאה. מערך הנתונים mydataset נמצא בפרויקט myotherproject ולא בפרויקט ברירת המחדל.

    bq update \
    --description "Description of mytable" \
    myotherproject:mydataset.mytable
    
  3. API

    קוראים לשיטה tables.patch ומשתמשים במאפיין description במשאב table כדי לעדכן את התיאור של הטבלה. מומלץ להשתמש ב-method‏ tables.patch כי ה-method‏ tables.update מחליפה את כל משאב הטבלה.

    Go

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

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    import (
    	"context"
    	"fmt"
    
    	"cloud.google.com/go/bigquery"
    )
    
    // updateTableDescription demonstrates how to fetch a table's metadata and updates the Description metadata.
    func updateTableDescription(projectID, datasetID, tableID string) error {
    	// projectID := "my-project-id"
    	// datasetID := "mydataset"
    	// tableID := "mytable"
    	ctx := context.Background()
    	client, err := bigquery.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("bigquery.NewClient: %v", err)
    	}
    	defer client.Close()
    
    	tableRef := client.Dataset(datasetID).Table(tableID)
    	meta, err := tableRef.Metadata(ctx)
    	if err != nil {
    		return err
    	}
    	update := bigquery.TableMetadataToUpdate{
    		Description: "Updated description.",
    	}
    	if _, err = tableRef.Update(ctx, update, meta.ETag); err != nil {
    		return err
    	}
    	return nil
    }
    

    Java

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

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    import com.google.cloud.bigquery.BigQuery;
    import com.google.cloud.bigquery.BigQueryException;
    import com.google.cloud.bigquery.BigQueryOptions;
    import com.google.cloud.bigquery.Table;
    
    public class UpdateTableDescription {
    
      public static void runUpdateTableDescription() {
        // TODO(developer): Replace these variables before running the sample.
        String datasetName = "MY_DATASET_NAME";
        String tableName = "MY_TABLE_NAME";
        String newDescription = "this is the new table description";
        updateTableDescription(datasetName, tableName, newDescription);
      }
    
      public static void updateTableDescription(
          String datasetName, String tableName, String newDescription) {
        try {
          // Initialize client that will be used to send requests. This client only needs to be created
          // once, and can be reused for multiple requests.
          BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
    
          Table table = bigquery.getTable(datasetName, tableName);
          bigquery.update(table.toBuilder().setDescription(newDescription).build());
          System.out.println("Table description updated successfully to " + newDescription);
        } catch (BigQueryException e) {
          System.out.println("Table description was not updated \n" + e.toString());
        }
      }
    }

    Python

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

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    מגדירים את המאפיין Table.description וקוראים לפונקציה Client.update_table() כדי לשלוח את העדכון ל-API.
    # from google.cloud import bigquery
    # client = bigquery.Client()
    # project = client.project
    # dataset_ref = bigquery.DatasetReference(project, dataset_id)
    # table_ref = dataset_ref.table('my_table')
    # table = client.get_table(table_ref)  # API request
    
    assert table.description == "Original description."
    table.description = "Updated description."
    
    table = client.update_table(table, ["description"])  # API request
    
    assert table.description == "Updated description."

    Gemini

    אתם יכולים ליצור תיאור לטבלה באמצעות Gemini ב-BigQuery בעזרת תובנות לגבי נתונים. תובנות לגבי נתונים היא דרך אוטומטית לבדוק את הנתונים, להבין אותם ולערוך אותם.

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

    1. במסוף Google Cloud , עוברים לדף BigQuery.

      כניסה ל-BigQuery

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

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

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

    4. בחלונית הפרטים, לוחצים על הכרטיסייה סכימה.

    5. לוחצים על יצירה.

      ‫Gemini יוצר תיאור של הטבלה ותובנות לגביה. יעברו כמה דקות עד שהמידע יאוכלס. אפשר לראות את התובנות שנוצרו בכרטיסייה תובנות של הטבלה.

    6. כדי לערוך ולשמור את תיאור הטבלה שנוצר:

      1. לוחצים על הצגת תיאורי העמודות.

        מוצגים תיאור הטבלה הנוכחי והתיאור שנוצר.

      2. בקטע תיאור הטבלה, לוחצים על שמירה בפרטים.

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

      4. עורכים את תיאור הטבלה לפי הצורך ולוחצים על שמירה בפרטים.

        תיאור הטבלה מתעדכן באופן מיידי.

      5. כדי לסגור את החלונית תצוגה מקדימה של תיאורים, לוחצים על סגירה.

עדכון מועד התפוגה של טבלה

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

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

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

בכל שלב אחרי יצירת הטבלה, אפשר לעדכן את תאריך התפוגה של הטבלה בדרכים הבאות:

  • באמצעות מסוף Google Cloud .
  • באמצעות הצהרה של שפת הגדרת נתונים (DDL) ALTER TABLE.
  • שימוש בפקודה bq update של כלי שורת הפקודה של bq.
  • קריאה ל-API method ‏tables.patch.
  • שימוש בספריות לקוח.

כדי לעדכן את זמן התפוגה של טבלה:

המסוף

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

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

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

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

  3. לוחצים על סקירה כללית > טבלאות ובוחרים טבלה.

  4. לוחצים על הכרטיסייה פרטים ואז על עריכת הפרטים.

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

  6. לוחצים על Save. זמן התפוגה המעודכן מופיע בקטע פרטי הטבלה.

SQL

משתמשים בהצהרה ALTER TABLE SET OPTIONS. בדוגמה הבאה מעדכנים את זמן התפוגה של טבלה בשם mytable:

  1. במסוף Google Cloud , עוברים לדף BigQuery.

    כניסה ל-BigQuery

  2. מזינים את ההצהרה הבאה בעורך השאילתות:

    ALTER TABLE mydataset.mytable
      SET OPTIONS (
        -- Sets table expiration to timestamp 2025-02-03 12:34:56
        expiration_timestamp = TIMESTAMP '2025-02-03 12:34:56');

  3. לוחצים על הפעלה.

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

BQ

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. מריצים את הפקודה bq update עם הדגל --expiration. אם אתם מעדכנים טבלה בפרויקט שאינו פרויקט ברירת המחדל שלכם, צריך להוסיף את מזהה הפרויקט לשם מערך הנתונים בפורמט הבא: project_id:dataset.

    bq update \
    --expiration integer \
    project_id:dataset.table

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

    • integer: משך החיים שמוגדר כברירת מחדל (בשניות) לטבלה. הערך המינימלי הוא 3,600 שניות (שעה אחת). מועד התפוגה הוא השעה הנוכחית בתוספת הערך השלם. אם מציינים את הערך 0, תוקף הטבלה יוסר והתוקף שלה לא יפוג לעולם. צריך למחוק ידנית טבלאות ללא תאריך תפוגה.
    • project_id: מזהה הפרויקט.
    • dataset: השם של מערך הנתונים שמכיל את הטבלה שאתם מעדכנים.
    • table: שם הטבלה שרוצים לעדכן.

    דוגמאות:

    כדי לעדכן את זמן התפוגה של טבלת mytable במערך הנתונים mydataset ל-5 ימים (432,000 שניות), מזינים את הפקודה הבאה. מערך הנתונים mydataset נמצא בפרויקט שמוגדר כברירת מחדל.

    bq update --expiration 432000 mydataset.mytable
    

    כדי לעדכן את זמן התפוגה של טבלת mytable במערך הנתונים mydataset ל-5 ימים (432,000 שניות), מזינים את הפקודה הבאה. מערך הנתונים mydataset נמצא בפרויקט myotherproject ולא בפרויקט ברירת המחדל.

    bq update --expiration 432000 myotherproject:mydataset.mytable
    
  3. API

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

    Go

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

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    import (
    	"context"
    	"fmt"
    	"time"
    
    	"cloud.google.com/go/bigquery"
    )
    
    // updateTableExpiration demonstrates setting the table expiration of a table to a specific point in time
    // in the future, at which time it will be deleted.
    func updateTableExpiration(projectID, datasetID, tableID string) error {
    	// projectID := "my-project-id"
    	// datasetID := "mydataset"
    	// tableID := "mytable"
    	ctx := context.Background()
    	client, err := bigquery.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("bigquery.NewClient: %v", err)
    	}
    	defer client.Close()
    
    	tableRef := client.Dataset(datasetID).Table(tableID)
    	meta, err := tableRef.Metadata(ctx)
    	if err != nil {
    		return err
    	}
    	update := bigquery.TableMetadataToUpdate{
    		ExpirationTime: time.Now().Add(time.Duration(5*24) * time.Hour), // table expiration in 5 days.
    	}
    	if _, err = tableRef.Update(ctx, update, meta.ETag); err != nil {
    		return err
    	}
    	return nil
    }
    

    Java

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

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    import com.google.cloud.bigquery.BigQuery;
    import com.google.cloud.bigquery.BigQueryException;
    import com.google.cloud.bigquery.BigQueryOptions;
    import com.google.cloud.bigquery.Table;
    import java.util.concurrent.TimeUnit;
    
    public class UpdateTableExpiration {
    
      public static void runUpdateTableExpiration() {
        // TODO(developer): Replace these variables before running the sample.
        String datasetName = "MY_DATASET_NAME";
        String tableName = "MY_TABLE_NAME";
        // Update table expiration to one day.
        Long newExpiration = TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS);
        updateTableExpiration(datasetName, tableName, newExpiration);
      }
    
      public static void updateTableExpiration(
          String datasetName, String tableName, Long newExpiration) {
        try {
          // Initialize client that will be used to send requests. This client only needs to be created
          // once, and can be reused for multiple requests.
          BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
    
          Table table = bigquery.getTable(datasetName, tableName);
          bigquery.update(table.toBuilder().setExpirationTime(newExpiration).build());
    
          System.out.println("Table expiration updated successfully to " + newExpiration);
        } catch (BigQueryException e) {
          System.out.println("Table expiration was not updated \n" + e.toString());
        }
      }
    }

    Node.js

    לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Node.jsהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Node.js API.

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    // Import the Google Cloud client library
    const {BigQuery} = require('@google-cloud/bigquery');
    const bigquery = new BigQuery();
    
    async function updateTableExpiration() {
      // Updates a table's expiration.
    
      /**
       * TODO(developer): Uncomment the following lines before running the sample.
       */
      // const datasetId = 'my_dataset', // Existing dataset
      // const tableId = 'my_table', // Existing table
      // const expirationTime = Date.now() + 1000 * 60 * 60 * 24 * 5 // 5 days from current time in ms
    
      // Retreive current table metadata
      const table = bigquery.dataset(datasetId).table(tableId);
      const [metadata] = await table.getMetadata();
    
      // Set new table expiration to 5 days from current time
      metadata.expirationTime = expirationTime.toString();
      const [apiResponse] = await table.setMetadata(metadata);
    
      const newExpirationTime = apiResponse.expirationTime;
      console.log(`${tableId} expiration: ${newExpirationTime}`);
    }

    Python

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

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    מגדירים את המאפיין Table.expires ומפעילים את Client.update_table() כדי לשלוח את העדכון ל-API.
    # Copyright 2022 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     https://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    import datetime
    
    
    def update_table_expiration(table_id, expiration):
        orig_table_id = table_id
        orig_expiration = expiration
    
        from google.cloud import bigquery
    
        client = bigquery.Client()
    
        # TODO(dev): Change table_id to the full name of the table you want to update.
        table_id = "your-project.your_dataset.your_table_name"
    
        # TODO(dev): Set table to expire for desired days days from now.
        expiration = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(
            days=5
        )
    
        table_id = orig_table_id
        expiration = orig_expiration
    
        table = client.get_table(table_id)  # Make an API request.
        table.expires = expiration
        table = client.update_table(table, ["expires"])  # API request
    
        print(f"Updated {table_id}, expires {table.expires}.")
    

כדי לעדכן את זמן התפוגה של מחיצת ברירת המחדל של מערך הנתונים:

Java

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

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.Dataset;
import java.util.concurrent.TimeUnit;

// Sample to update partition expiration on a dataset.
public class UpdateDatasetPartitionExpiration {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    // Set the default partition expiration (applies to new tables, only) in
    // milliseconds. This example sets the default expiration to 90 days.
    Long newExpiration = TimeUnit.MILLISECONDS.convert(90, TimeUnit.DAYS);
    updateDatasetPartitionExpiration(datasetName, newExpiration);
  }

  public static void updateDatasetPartitionExpiration(String datasetName, Long newExpiration) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      Dataset dataset = bigquery.getDataset(datasetName);
      bigquery.update(dataset.toBuilder().setDefaultPartitionExpirationMs(newExpiration).build());
      System.out.println(
          "Dataset default partition expiration updated successfully to " + newExpiration);
    } catch (BigQueryException e) {
      System.out.println("Dataset partition expiration was not updated \n" + e.toString());
    }
  }
}

Python

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

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

# Copyright 2019 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


def update_dataset_default_partition_expiration(dataset_id: str) -> None:

    from google.cloud import bigquery

    # Construct a BigQuery client object.
    client = bigquery.Client()

    # TODO(developer): Set dataset_id to the ID of the dataset to fetch.
    # dataset_id = 'your-project.your_dataset'

    dataset = client.get_dataset(dataset_id)  # Make an API request.

    # Set the default partition expiration (applies to new tables, only) in
    # milliseconds. This example sets the default expiration to 90 days.
    dataset.default_partition_expiration_ms = 90 * 24 * 60 * 60 * 1000

    dataset = client.update_dataset(
        dataset, ["default_partition_expiration_ms"]
    )  # Make an API request.

    print(
        "Updated dataset {}.{} with new default partition expiration {}".format(
            dataset.project, dataset.dataset_id, dataset.default_partition_expiration_ms
        )
    )

עדכון מצב העיגול של טבלה

אפשר לעדכן את מצב העיגול שמוגדר כברירת מחדל בטבלה באמצעות הצהרת ה-DDL‏ ALTER TABLE SET OPTIONS. בדוגמה הבאה מעדכנים את מצב העיגול שמוגדר כברירת מחדל עבור mytable ל-ROUND_HALF_EVEN:

ALTER TABLE mydataset.mytable
SET OPTIONS (
  default_rounding_mode = "ROUND_HALF_EVEN");

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

עדכון הגדרת הסכימה של טבלה

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

שינוי שם של טבלה

אפשר לשנות את השם של טבלה אחרי שיוצרים אותה באמצעות הצהרת ALTER TABLE RENAME TO. בדוגמה הבאה, השם mytable משתנה ל-mynewtable:

ALTER TABLE mydataset.mytable
RENAME TO mynewtable;

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

מגבלות על שינוי השם של טבלאות

  • אם רוצים לשנות את השם של טבלה שמתבצעת אליה הזנת נתונים בסטרימינג, צריך להפסיק את הסטרימינג, לבצע קומיט לסטרימינג בהמתנה ולהמתין עד ש-BigQuery יציין שהסטרימינג לא בשימוש.
  • בדרך כלל אפשר לשנות את השם של טבלה 5 שעות אחרי פעולת הסטרימינג האחרונה, אבל לפעמים זה לוקח יותר זמן.
  • רשימות ACL קיימות של טבלאות ומדיניות גישה לשורות נשמרות, אבל עדכונים לרשימות ACL של טבלאות ולמדיניות גישה לשורות שבוצעו במהלך שינוי השם של הטבלה לא נשמרים.
  • אי אפשר לשנות את השם של טבלה ולהריץ פקודת DML על אותה טבלה בו-זמנית.
  • שינוי השם של טבלה מסיר את כל התגים של Data Catalog (הוצא משימוש) ואת ההיבטים של Dataplex Universal Catalog בטבלה.
  • כל אינדקס חיפוש או אינדקס וקטורי שנוצר בטבלה נמחק כשמשנים את השם של הטבלה.
  • אי אפשר לשנות את השם של טבלאות חיצוניות.

העתקת טבלה

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

אפשר להעתיק טבלה בדרכים הבאות:

  • משתמשים במסוף Google Cloud .
  • משתמשים בפקודה bq cp.
  • משתמשים בהצהרה של שפת הגדרת נתונים (DDL) CREATE TABLE COPY
  • קוראים לשיטת ה-API‏ jobs.insert ומגדירים משימת copy.
  • משתמשים בספריות הלקוח.

מגבלות על העתקת טבלאות

ההגבלות הבאות חלות על משימות של העתקת טבלאות:

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

    עדכונים מסוימים בסכימת הטבלה, כמו השמטה או שינוי שם של עמודות, יכולים לגרום לטבלאות להיראות עם סכימות זהות אבל עם ייצוגים פנימיים שונים. יכול להיות שבגלל זה העתקת הטבלה תיכשל עם השגיאה Maximum limit on diverging physical schemas reached. במקרה כזה, אפשר להשתמש בהצהרת CREATE TABLE LIKE כדי לוודא שהסכימה של טבלת המקור זהה בדיוק לסכימה של טבלת היעד.

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

  • אי אפשר להעתיק טבלת מקור ולהוסיף אותה לטבלת יעד שיש בה יותר עמודות מאשר בטבלת המקור, ולעמודות הנוספות יש ערכי ברירת מחדל. במקום זאת, אפשר להריץ את הפקודה INSERT destination_table SELECT * FROM source_table כדי להעתיק את הנתונים.

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

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

  • כשמעתיקים כמה טבלאות מקור לטבלת יעד, כל טבלאות המקור צריכות לכלול תגים זהים.

התפקידים הנדרשים

כדי לבצע את המשימות שמתוארות במאמר הזה, נדרשות ההרשאות הבאות.

תפקידים להעתקת טבלאות ומחיצות

כדי לקבל את ההרשאות שנדרשות להעתקת טבלאות ומחיצות, צריך לבקש מהאדמין להקצות לכם ב-IAM את התפקיד עורך נתונים (roles/bigquery.dataEditor) במערכי הנתונים של המקור והיעד. להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

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

ההרשאות הנדרשות

כדי להעתיק טבלאות ומחיצות, נדרשות ההרשאות הבאות:

  • bigquery.tables.getData במערכי הנתונים של המקור והיעד
  • bigquery.tables.get במערכי הנתונים של המקור והיעד
  • bigquery.tables.create במערך נתוני היעד
  • bigquery.tables.update במערך נתוני היעד

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

הרשאה להפעלת משימת העתקה

כדי לקבל את ההרשאה שנדרשת להפעלת עבודת העתקה, צריך לבקש מהאדמין להקצות לכם ב-IAM את התפקיד Job User (roles/bigquery.jobUser) במערכי הנתונים של המקור והיעד. להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

התפקיד המוגדר מראש הזה כולל את ההרשאה bigquery.jobs.create, שנדרשת כדי להפעיל משימת העתקה.

יכול להיות שתוכלו לקבל את ההרשאה הזו גם בתפקידים בהתאמה אישית או בתפקידים אחרים שמוגדרים מראש.

העתקה של טבלת מקור יחידה

אפשר להעתיק טבלה אחת באחת מהדרכים הבאות:

  • באמצעות מסוף Google Cloud .
  • שימוש בפקודה bq cp של כלי שורת הפקודה של bq.
  • באמצעות הצהרה של שפת הגדרת נתונים (DDL) CREATE TABLE COPY.
  • קוראים לשיטת ה-API‏ jobs.insert, מגדירים משימת copy ומציינים את המאפיין sourceTable.
  • שימוש בספריות לקוח.

ההצהרה Google Cloud והמסוף CREATE TABLE COPYתומכים רק בטבלת מקור אחת ובטבלת יעד אחת במשימת העתקה. כדי להעתיק כמה קובצי מקור לטבלת יעד, צריך להשתמש בכלי שורת הפקודה של BigQuery או ב-API.

כדי להעתיק טבלת מקור אחת:

המסוף

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

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

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

  3. לוחצים על סקירה כללית > טבלאות ובוחרים טבלה.

  4. בחלונית הפרטים, לוחצים על העתקה.

  5. בתיבת הדו-שיח העתקת הטבלה, בקטע יעד:

    • בשדה Project, בוחרים את הפרויקט שבו יישמר העותק של הטבלה.
    • בשדה Dataset, בוחרים את מערך הנתונים שבו רוצים לאחסן את הטבלה שהועתקה. מערכי הנתונים של המקור והיעד צריכים להיות באותו המיקום.
    • בשדה Table, מזינים שם לטבלה החדשה. השם חייב להיות ייחודי במערך הנתונים של היעד. אי אפשר להחליף טבלה קיימת במערך הנתונים של היעד באמצעות מסוף Google Cloud . מידע נוסף על הדרישות לשמות של טבלאות זמין במאמר בנושא שמות של טבלאות.
  6. לוחצים על העתקה כדי להתחיל את משימת ההעתקה.

SQL

משתמשים בהצהרה CREATE TABLE COPY כדי להעתיק טבלה בשם table1 לטבלה חדשה בשם table1copy:

  1. במסוף Google Cloud , עוברים לדף BigQuery.

    כניסה ל-BigQuery

  2. מזינים את ההצהרה הבאה בעורך השאילתות:

    CREATE TABLE myproject.mydataset.table1copy
    COPY myproject.mydataset.table1;

  3. לוחצים על הפעלה.

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

BQ

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. מריצים את הפקודה bq cp. אפשר להשתמש בדגלים אופציונליים כדי לשלוט בהגדרת הכתיבה של טבלת היעד:

    • -a או --append_table מוסיפים את הנתונים מהטבלה של המקור לטבלה קיימת במערך נתוני היעד.
    • -f או --force מחליפים טבלה קיימת במערך נתוני היעד בלי לבקש אישור.
    • הפונקציות -n או --no_clobber מחזירות את הודעת השגיאה הבאה אם הטבלה קיימת במערך נתוני היעד: Table 'project_id:dataset.table' already exists, skipping. אם לא מציינים את -n, ברירת המחדל היא הצגת בקשה לבחירה אם להחליף את טבלת היעד.
    • --destination_kms_key הוא מפתח Cloud KMS בניהול הלקוח שמשמש להצפנת טבלת היעד.

    השימוש ב---destination_kms_key לא מודגם כאן. מידע נוסף זמין במאמר הגנה על נתונים באמצעות מפתחות של Cloud Key Management Service.

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

    (אופציונלי) מציינים את הדגל --location ומגדירים את הערך למיקום.

    bq --location=location cp \
    -a -f -n \
    project_id:dataset.source_table \
    project_id:dataset.destination_table

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

    • location: שם המיקום. הדגל --location הוא אופציונלי. לדוגמה, אם אתם משתמשים ב-BigQuery באזור טוקיו, אתם יכולים להגדיר את הערך של הדגל ל-asia-northeast1. אפשר להגדיר ערך ברירת מחדל למיקום באמצעות קובץ .bigqueryrc.
    • project_id: מזהה הפרויקט.
    • dataset: השם של מערך הנתונים של המקור או היעד.
    • source_table: הטבלה שאתם מעתיקים.
    • destination_table: השם של הטבלה במערך הנתונים של היעד.

    דוגמאות:

    כדי להעתיק את הטבלה mydataset.mytable לטבלה mydataset2.mytable2, מזינים את הפקודה הבאה. שני מערכי הנתונים נמצאים בפרויקט שמוגדר כברירת המחדל.

    bq cp mydataset.mytable mydataset2.mytable2
    

    כדי להעתיק את הטבלה mydataset.mytable ולהחליף טבלת יעד עם אותו שם, מזינים את הפקודה הבאה. מערך הנתונים של המקור נמצא בפרויקט ברירת המחדל. מערך הנתונים של היעד נמצא בפרויקט myotherproject. מקש הקיצור -f משמש להחלפת טבלת היעד בלי להציג הנחיה.

    bq cp -f \
    mydataset.mytable \
    myotherproject:myotherdataset.mytable

    כדי להעתיק את הטבלה mydataset.mytable ולהחזיר שגיאה אם מערך הנתונים של היעד מכיל טבלה עם אותו שם, מזינים את הפקודה הבאה. מערך הנתונים של המקור נמצא בפרויקט ברירת המחדל שלכם. מערך הנתונים של היעד נמצא בפרויקט myotherproject. מקש הקיצור -n משמש כדי למנוע החלפה של טבלה עם אותו שם.

    bq cp -n \
    mydataset.mytable \
    myotherproject:myotherdataset.mytable

    כדי להעתיק את הטבלה mydataset.mytable ולצרף את הנתונים לטבלת יעד עם אותו שם, מזינים את הפקודה הבאה. מערך הנתונים של המקור נמצא בפרויקט ברירת המחדל. מערך הנתונים של היעד נמצא בפרויקט myotherproject. מקש הקיצור - a משמש להוספה לטבלת היעד.

    bq cp -a mydataset.mytable myotherproject:myotherdataset.mytable
    
  3. API

    אפשר להעתיק טבלה קיימת באמצעות ה-API על ידי הפעלת השיטה bigquery.jobs.insert והגדרת עבודת copy. מציינים את המיקום שלכם במאפיין location בקטע jobReference של משאב המשרה.

    צריך לציין את הערכים הבאים בהגדרות האישיות של המשימה:

    "copy": {
          "sourceTable": {       // Required
            "projectId": string, // Required
            "datasetId": string, // Required
            "tableId": string    // Required
          },
          "destinationTable": {  // Required
            "projectId": string, // Required
            "datasetId": string, // Required
            "tableId": string    // Required
          },
          "createDisposition": string,  // Optional
          "writeDisposition": string,   // Optional
        },
    

    הפרמטר sourceTable מספק מידע על הטבלה שרוצים להעתיק, הפרמטר destinationTable מספק מידע על הטבלה החדשה, הפרמטר createDisposition מציין אם ליצור את הטבלה אם היא לא קיימת, והפרמטר writeDisposition מציין אם להחליף טבלה קיימת או להוסיף לה נתונים.

    C#‎

    לפני שמנסים את הדוגמה הזו, צריך לפעול לפי C#הוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery C# API.

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    
    using Google.Apis.Bigquery.v2.Data;
    using Google.Cloud.BigQuery.V2;
    using System;
    
    public class BigQueryCopyTable
    {
        public void CopyTable(
            string projectId = "your-project-id",
            string destinationDatasetId = "your_dataset_id"
        )
        {
            BigQueryClient client = BigQueryClient.Create(projectId);
            TableReference sourceTableRef = new TableReference()
            {
                TableId = "shakespeare",
                DatasetId = "samples",
                ProjectId = "bigquery-public-data"
            };
            TableReference destinationTableRef = client.GetTableReference(
                destinationDatasetId, "destination_table");
            BigQueryJob job = client.CreateCopyJob(
                sourceTableRef, destinationTableRef)
                .PollUntilCompleted() // Wait for the job to complete.
                .ThrowOnAnyError();
    
            // Retrieve destination table
            BigQueryTable destinationTable = client.GetTable(destinationTableRef);
            Console.WriteLine(
                $"Copied {destinationTable.Resource.NumRows} rows from table "
                + $"{sourceTableRef.DatasetId}.{sourceTableRef.TableId} "
                + $"to {destinationTable.FullyQualifiedId}."
            );
        }
    }

    Go

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

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    import (
    	"context"
    	"fmt"
    
    	"cloud.google.com/go/bigquery"
    )
    
    // copyTable demonstrates copying a table from a source to a destination, and
    // allowing the copy to overwrite existing data by using truncation.
    func copyTable(projectID, datasetID, srcID, dstID string) error {
    	// projectID := "my-project-id"
    	// datasetID := "mydataset"
    	// srcID := "sourcetable"
    	// dstID := "destinationtable"
    	ctx := context.Background()
    	client, err := bigquery.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("bigquery.NewClient: %v", err)
    	}
    	defer client.Close()
    
    	dataset := client.Dataset(datasetID)
    	copier := dataset.Table(dstID).CopierFrom(dataset.Table(srcID))
    	copier.WriteDisposition = bigquery.WriteTruncate
    	job, err := copier.Run(ctx)
    	if err != nil {
    		return err
    	}
    	status, err := job.Wait(ctx)
    	if err != nil {
    		return err
    	}
    	if err := status.Err(); err != nil {
    		return err
    	}
    	return nil
    }
    

    Java

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

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    import com.google.cloud.bigquery.BigQuery;
    import com.google.cloud.bigquery.BigQueryException;
    import com.google.cloud.bigquery.BigQueryOptions;
    import com.google.cloud.bigquery.CopyJobConfiguration;
    import com.google.cloud.bigquery.Job;
    import com.google.cloud.bigquery.JobInfo;
    import com.google.cloud.bigquery.TableId;
    
    public class CopyTable {
    
      public static void runCopyTable() {
        // TODO(developer): Replace these variables before running the sample.
        String destinationDatasetName = "MY_DESTINATION_DATASET_NAME";
        String destinationTableId = "MY_DESTINATION_TABLE_NAME";
        String sourceDatasetName = "MY_SOURCE_DATASET_NAME";
        String sourceTableId = "MY_SOURCE_TABLE_NAME";
    
        copyTable(sourceDatasetName, sourceTableId, destinationDatasetName, destinationTableId);
      }
    
      public static void copyTable(
          String sourceDatasetName,
          String sourceTableId,
          String destinationDatasetName,
          String destinationTableId) {
        try {
          // Initialize client that will be used to send requests. This client only needs to be created
          // once, and can be reused for multiple requests.
          BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
    
          TableId sourceTable = TableId.of(sourceDatasetName, sourceTableId);
          TableId destinationTable = TableId.of(destinationDatasetName, destinationTableId);
    
          // For more information on CopyJobConfiguration see:
          // https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/JobConfiguration.html
          CopyJobConfiguration configuration =
              CopyJobConfiguration.newBuilder(destinationTable, sourceTable).build();
    
          // For more information on Job see:
          // https://googleapis.dev/java/google-cloud-clients/latest/index.html?com/google/cloud/bigquery/package-summary.html
          Job job = bigquery.create(JobInfo.of(configuration));
    
          // Blocks until this job completes its execution, either failing or succeeding.
          Job completedJob = job.waitFor();
          if (completedJob == null) {
            System.out.println("Job not executed since it no longer exists.");
            return;
          } else if (completedJob.getStatus().getError() != null) {
            System.out.println(
                "BigQuery was unable to copy table due to an error: \n" + job.getStatus().getError());
            return;
          }
          System.out.println("Table copied successfully.");
        } catch (BigQueryException | InterruptedException e) {
          System.out.println("Table copying job was interrupted. \n" + e.toString());
        }
      }
    }

    Node.js

    לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Node.jsהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Node.js API.

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    // Import the Google Cloud client library and create a client
    const {BigQuery} = require('@google-cloud/bigquery');
    const bigquery = new BigQuery();
    
    async function copyTable() {
      // Copies src_dataset:src_table to dest_dataset:dest_table.
    
      /**
       * TODO(developer): Uncomment the following lines before running the sample
       */
      // const srcDatasetId = "my_src_dataset";
      // const srcTableId = "my_src_table";
      // const destDatasetId = "my_dest_dataset";
      // const destTableId = "my_dest_table";
    
      // Copy the table contents into another table
      const [job] = await bigquery
        .dataset(srcDatasetId)
        .table(srcTableId)
        .copy(bigquery.dataset(destDatasetId).table(destTableId));
    
      console.log(`Job ${job.id} completed.`);
    
      // Check the job's status for errors
      const errors = job.status.errors;
      if (errors && errors.length > 0) {
        throw errors;
      }
    }

    PHP

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

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    use Google\Cloud\BigQuery\BigQueryClient;
    use Google\Cloud\Core\ExponentialBackoff;
    
    /** Uncomment and populate these variables in your code */
    // $projectId = 'The Google project ID';
    // $datasetId = 'The BigQuery dataset ID';
    // $sourceTableId   = 'The BigQuery table ID to copy from';
    // $destinationTableId = 'The BigQuery table ID to copy to';
    
    $bigQuery = new BigQueryClient([
        'projectId' => $projectId,
    ]);
    $dataset = $bigQuery->dataset($datasetId);
    $sourceTable = $dataset->table($sourceTableId);
    $destinationTable = $dataset->table($destinationTableId);
    $copyConfig = $sourceTable->copy($destinationTable);
    $job = $sourceTable->runJob($copyConfig);
    
    // poll the job until it is complete
    $backoff = new ExponentialBackoff(10);
    $backoff->execute(function () use ($job) {
        print('Waiting for job to complete' . PHP_EOL);
        $job->reload();
        if (!$job->isComplete()) {
            throw new Exception('Job has not yet completed', 500);
        }
    });
    // check if the job has errors
    if (isset($job->info()['status']['errorResult'])) {
        $error = $job->info()['status']['errorResult']['message'];
        printf('Error running job: %s' . PHP_EOL, $error);
    } else {
        print('Table copied successfully' . PHP_EOL);
    }

    Python

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

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    
    from google.cloud import bigquery
    
    # Construct a BigQuery client object.
    client = bigquery.Client()
    
    # TODO(developer): Set source_table_id to the ID of the original table.
    # source_table_id = "your-project.source_dataset.source_table"
    
    # TODO(developer): Set destination_table_id to the ID of the destination table.
    # destination_table_id = "your-project.destination_dataset.destination_table"
    
    job = client.copy_table(source_table_id, destination_table_id)
    job.result()  # Wait for the job to complete.
    
    print("A copy of the table created.")

העתקה של כמה טבלאות מקור

אפשר להעתיק כמה טבלאות מקור לטבלת יעד באופנים הבאים:

  • שימוש בפקודה bq cp של כלי שורת הפקודה של bq.
  • ביצוע קריאה לשיטה jobs.insert, הגדרת משימת copy וציון המאפיין sourceTables.
  • שימוש בספריות לקוח.

לכל טבלאות המקור צריכות להיות סכימות ותגים זהים, ומותרת רק טבלת יעד אחת.

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

כדי להעתיק כמה טבלאות מקור, בוחרים באחת מהאפשרויות הבאות:

BQ

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. מריצים את הפקודה bq cp וכוללים כמה טבלאות מקור כרשימה מופרדת בפסיקים. אפשר להשתמש בדגלים אופציונליים כדי לשלוט בהגדרת הכתיבה של טבלת היעד:

    • -a או --append_table מוסיפים את הנתונים מהטבלאות של המקור לטבלה קיימת במערך הנתונים של היעד.
    • -f או --force מחליפים טבלת יעד קיימת במערך נתוני היעד, ולא מוצגת בקשה לאישור.
    • אם הטבלה קיימת במערך הנתונים של היעד, הפקודות -n או --no_clobber מחזירות את הודעת השגיאה הבאה: Table 'project_id:dataset.table' already exists, skipping. אם לא מציינים את -n, התנהגות ברירת המחדל היא להציג בקשה לבחירה אם להחליף את טבלת היעד.
    • --destination_kms_key הוא מפתח Cloud Key Management Service בניהול הלקוח שמשמש להצפנת טבלת היעד.

    השימוש ב---destination_kms_key לא מודגם כאן. מידע נוסף זמין במאמר הגנה על נתונים באמצעות מפתחות של Cloud Key Management Service.

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

    (אופציונלי) מציינים את הדגל --location ומגדירים את הערך למיקום.

    bq --location=location cp \
    -a -f -n \
    project_id:dataset.source_table,project_id:dataset.source_table \
    project_id:dataset.destination_table

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

    • location: שם המיקום. הדגל --location הוא אופציונלי. לדוגמה, אם אתם משתמשים ב-BigQuery באזור טוקיו, אתם יכולים להגדיר את הערך של הדגל ל-asia-northeast1. אפשר להגדיר ערך ברירת מחדל למיקום באמצעות קובץ .bigqueryrc.
    • project_id: מזהה הפרויקט.
    • dataset: השם של מערך הנתונים של המקור או היעד.
    • source_table: הטבלה שאתם מעתיקים.
    • destination_table: השם של הטבלה במערך הנתונים של היעד.

    דוגמאות:

    כדי להעתיק את הטבלה mydataset.mytable ואת הטבלה mydataset.mytable2 לטבלה mydataset2.tablecopy, מזינים את הפקודה הבאה . כל מערכי הנתונים נמצאים בפרויקט ברירת המחדל שלכם.

    bq cp \
    mydataset.mytable,mydataset.mytable2 \
    mydataset2.tablecopy

    כדי להעתיק את הטבלה mydataset.mytable ואת הטבלה mydataset.mytable2 לטבלה myotherdataset.mytable ולדרוס טבלת יעד עם אותו שם, מזינים את הפקודה הבאה. מערך הנתונים של היעד נמצא בפרויקט myotherproject ולא בפרויקט ברירת המחדל. מקש הקיצור -f משמש להחלפת טבלת היעד בלי להציג הנחיה.

    bq cp -f \
    mydataset.mytable,mydataset.mytable2 \
    myotherproject:myotherdataset.mytable

    כדי להעתיק את הטבלה myproject:mydataset.mytable ואת הטבלה myproject:mydataset.mytable2 ולהחזיר שגיאה אם מערך הנתונים של היעד מכיל טבלה עם אותו שם, מזינים את הפקודה הבאה. מערך הנתונים של היעד נמצא בפרויקט myotherproject. משתמשים בקיצור הדרך -n כדי למנוע החלפה של טבלה עם אותו שם.

    bq cp -n \
    myproject:mydataset.mytable,myproject:mydataset.mytable2 \
    myotherproject:myotherdataset.mytable

    כדי להעתיק את הטבלה mydataset.mytable ואת הטבלה mydataset.mytable2 ולצרף את הנתונים לטבלת יעד עם אותו שם, מזינים את הפקודה הבאה. מערך הנתונים של המקור נמצא בפרויקט ברירת המחדל שלכם. מערך הנתונים של היעד נמצא בפרויקט myotherproject. מקש הקיצור -a משמש להוספה לטבלת היעד.

    bq cp -a \
    mydataset.mytable,mydataset.mytable2 \
    myotherproject:myotherdataset.mytable
  3. API

    כדי להעתיק כמה טבלאות באמצעות ה-API, צריך להפעיל את השיטה jobs.insert, להגדיר משימת copy של טבלה ולציין את המאפיין sourceTables.

    מציינים את האזור במאפיין location בקטע jobReference של משאב המשרה.

    Go

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

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    import (
    	"context"
    	"fmt"
    
    	"cloud.google.com/go/bigquery"
    )
    
    // copyMultiTable demonstrates using a copy job to copy multiple source tables into a single destination table.
    func copyMultiTable(projectID, srcDatasetID string, srcTableIDs []string, dstDatasetID, dstTableID string) error {
    	// projectID := "my-project-id"
    	// srcDatasetID := "sourcedataset"
    	// srcTableIDs := []string{"table1","table2"}
    	// dstDatasetID = "destinationdataset"
    	// dstTableID = "destinationtable"
    	ctx := context.Background()
    	client, err := bigquery.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("bigquery.NewClient: %v", err)
    	}
    	defer client.Close()
    
    	srcDataset := client.Dataset(srcDatasetID)
    	dstDataset := client.Dataset(dstDatasetID)
    	var tableRefs []*bigquery.Table
    	for _, v := range srcTableIDs {
    		tableRefs = append(tableRefs, srcDataset.Table(v))
    	}
    	copier := dstDataset.Table(dstTableID).CopierFrom(tableRefs...)
    	copier.WriteDisposition = bigquery.WriteTruncate
    	job, err := copier.Run(ctx)
    	if err != nil {
    		return err
    	}
    	status, err := job.Wait(ctx)
    	if err != nil {
    		return err
    	}
    	if err := status.Err(); err != nil {
    		return err
    	}
    	return nil
    }
    

    Java

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

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    import com.google.cloud.bigquery.BigQuery;
    import com.google.cloud.bigquery.BigQueryException;
    import com.google.cloud.bigquery.BigQueryOptions;
    import com.google.cloud.bigquery.CopyJobConfiguration;
    import com.google.cloud.bigquery.Job;
    import com.google.cloud.bigquery.JobInfo;
    import com.google.cloud.bigquery.TableId;
    import java.util.Arrays;
    
    public class CopyMultipleTables {
    
      public static void runCopyMultipleTables() {
        // TODO(developer): Replace these variables before running the sample.
        String destinationDatasetName = "MY_DATASET_NAME";
        String destinationTableId = "MY_TABLE_NAME";
        copyMultipleTables(destinationDatasetName, destinationTableId);
      }
    
      public static void copyMultipleTables(String destinationDatasetName, String destinationTableId) {
        try {
          // Initialize client that will be used to send requests. This client only needs to be created
          // once, and can be reused for multiple requests.
          BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
    
          TableId destinationTable = TableId.of(destinationDatasetName, destinationTableId);
    
          // For more information on CopyJobConfiguration see:
          // https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/JobConfiguration.html
          CopyJobConfiguration configuration =
              CopyJobConfiguration.newBuilder(
                      destinationTable,
                      Arrays.asList(
                          TableId.of(destinationDatasetName, "table1"),
                          TableId.of(destinationDatasetName, "table2")))
                  .build();
    
          // For more information on Job see:
          // https://googleapis.dev/java/google-cloud-clients/latest/index.html?com/google/cloud/bigquery/package-summary.html
          Job job = bigquery.create(JobInfo.of(configuration));
    
          // Blocks until this job completes its execution, either failing or succeeding.
          Job completedJob = job.waitFor();
          if (completedJob == null) {
            System.out.println("Job not executed since it no longer exists.");
            return;
          } else if (completedJob.getStatus().getError() != null) {
            System.out.println(
                "BigQuery was unable to copy tables due to an error: \n" + job.getStatus().getError());
            return;
          }
          System.out.println("Table copied successfully.");
        } catch (BigQueryException | InterruptedException e) {
          System.out.println("Table copying job was interrupted. \n" + e.toString());
        }
      }
    }

    Node.js

    לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Node.jsהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Node.js API.

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    // Import the Google Cloud client library
    const {BigQuery} = require('@google-cloud/bigquery');
    const bigquery = new BigQuery();
    
    async function copyTableMultipleSource() {
      // Copy multiple source tables to a given destination.
    
      /**
       * TODO(developer): Uncomment the following lines before running the sample.
       */
      // const datasetId = "my_dataset";
      // sourceTable = 'my_table';
      // destinationTable = 'testing';
    
      // Create a client
      const dataset = bigquery.dataset(datasetId);
    
      const metadata = {
        createDisposition: 'CREATE_NEVER',
        writeDisposition: 'WRITE_TRUNCATE',
      };
    
      // Create table references
      const table = dataset.table(sourceTable);
      const yourTable = dataset.table(destinationTable);
    
      // Copy table
      const [apiResponse] = await table.copy(yourTable, metadata);
      console.log(apiResponse.configuration.copy);
    }

    Python

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

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    
    from google.cloud import bigquery
    
    # Construct a BigQuery client object.
    client = bigquery.Client()
    
    # TODO(developer): Set dest_table_id to the ID of the destination table.
    # dest_table_id = "your-project.your_dataset.your_table_name"
    
    # TODO(developer): Set table_ids to the list of the IDs of the original tables.
    # table_ids = ["your-project.your_dataset.your_table_name", ...]
    
    job = client.copy_table(table_ids, dest_table_id)  # Make an API request.
    job.result()  # Wait for the job to complete.
    
    print("The tables {} have been appended to {}".format(table_ids, dest_table_id))

העתקת טבלאות בין אזורים

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

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

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

BQ

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. מריצים את הפקודה bq cp:

  3.    bq cp \
       -f -n \
       SOURCE_PROJECT:SOURCE_DATASET.SOURCE_TABLE \
       DESTINATION_PROJECT:DESTINATION_DATASET.DESTINATION_TABLE
       

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

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

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

    • SOURCE_DATASET: השם של מערך הנתונים של המקור.

    • DESTINATION_DATASET: השם של מערך הנתונים של היעד.

    • SOURCE_TABLE: הטבלה שרוצים להעתיק.

    • DESTINATION_TABLE: השם של הטבלה במערך הנתונים של היעד.

    בדוגמה הבאה מוצגת פקודה להעתקת הטבלה mydataset_us.mytable מהאזור us במספר אזורים לטבלה mydataset_eu.mytable2 באזור eu במספר אזורים. שני מערכי הנתונים נמצאים בפרויקט שמוגדר כברירת מחדל.

    bq cp --sync=false mydataset_us.mytable mydataset_eu.mytable2
    

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

    bq cp source-project-id:source-dataset-id.source-table-id destination-project-id:destination-dataset-id.destination-table-id
    

    לעומת זאת, כדי להעתיק טבלה עם CMEK לאזור אחר אל מערך נתונים של יעד, אתם יכולים להפעיל CMEK במערך נתוני היעד באמצעות מפתח מהאזור של מערך נתוני היעד. אפשר גם להשתמש בדגל destination_kms_keys בפקודה bq cp, כמו בדוגמה הבאה:

    bq cp --destination_kms_key=projects/project_id/locations/eu/keyRings/eu_key/cryptoKeys/eu_region mydataset_us.mytable mydataset_eu.mytable2
    

    API

    כדי להעתיק טבלה בין אזורים באמצעות ה-API, מפעילים את method‏ jobs.insert ומגדירים עבודת copy של טבלה.

    מציינים את האזור במאפיין location בקטע jobReference של משאב המשרה.

    C#‎

    לפני שמנסים את הדוגמה הזו, צריך לפעול לפי C#הוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery C# API.

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    
    using Google.Apis.Bigquery.v2.Data;
    using Google.Cloud.BigQuery.V2;
    using System;
    
    public class BigQueryCopyTable
    {
        public void CopyTable(
            string projectId = "your-project-id",
            string destinationDatasetId = "your_dataset_id"
        )
        {
            BigQueryClient client = BigQueryClient.Create(projectId);
            TableReference sourceTableRef = new TableReference()
            {
                TableId = "shakespeare",
                DatasetId = "samples",
                ProjectId = "bigquery-public-data"
            };
            TableReference destinationTableRef = client.GetTableReference(
                destinationDatasetId, "destination_table");
            BigQueryJob job = client.CreateCopyJob(
                sourceTableRef, destinationTableRef)
                .PollUntilCompleted() // Wait for the job to complete.
                .ThrowOnAnyError();
    
            // Retrieve destination table
            BigQueryTable destinationTable = client.GetTable(destinationTableRef);
            Console.WriteLine(
                $"Copied {destinationTable.Resource.NumRows} rows from table "
                + $"{sourceTableRef.DatasetId}.{sourceTableRef.TableId} "
                + $"to {destinationTable.FullyQualifiedId}."
            );
        }
    }

    Go

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

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    import (
    	"context"
    	"fmt"
    
    	"cloud.google.com/go/bigquery"
    )
    
    // copyTable demonstrates copying a table from a source to a destination, and
    // allowing the copy to overwrite existing data by using truncation.
    func copyTable(projectID, datasetID, srcID, dstID string) error {
    	// projectID := "my-project-id"
    	// datasetID := "mydataset"
    	// srcID := "sourcetable"
    	// dstID := "destinationtable"
    	ctx := context.Background()
    	client, err := bigquery.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("bigquery.NewClient: %v", err)
    	}
    	defer client.Close()
    
    	dataset := client.Dataset(datasetID)
    	copier := dataset.Table(dstID).CopierFrom(dataset.Table(srcID))
    	copier.WriteDisposition = bigquery.WriteTruncate
    	job, err := copier.Run(ctx)
    	if err != nil {
    		return err
    	}
    	status, err := job.Wait(ctx)
    	if err != nil {
    		return err
    	}
    	if err := status.Err(); err != nil {
    		return err
    	}
    	return nil
    }
    

    Java

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

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    import com.google.cloud.bigquery.BigQuery;
    import com.google.cloud.bigquery.BigQueryException;
    import com.google.cloud.bigquery.BigQueryOptions;
    import com.google.cloud.bigquery.CopyJobConfiguration;
    import com.google.cloud.bigquery.Job;
    import com.google.cloud.bigquery.JobInfo;
    import com.google.cloud.bigquery.TableId;
    
    public class CopyTable {
    
      public static void runCopyTable() {
        // TODO(developer): Replace these variables before running the sample.
        String destinationDatasetName = "MY_DESTINATION_DATASET_NAME";
        String destinationTableId = "MY_DESTINATION_TABLE_NAME";
        String sourceDatasetName = "MY_SOURCE_DATASET_NAME";
        String sourceTableId = "MY_SOURCE_TABLE_NAME";
    
        copyTable(sourceDatasetName, sourceTableId, destinationDatasetName, destinationTableId);
      }
    
      public static void copyTable(
          String sourceDatasetName,
          String sourceTableId,
          String destinationDatasetName,
          String destinationTableId) {
        try {
          // Initialize client that will be used to send requests. This client only needs to be created
          // once, and can be reused for multiple requests.
          BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
    
          TableId sourceTable = TableId.of(sourceDatasetName, sourceTableId);
          TableId destinationTable = TableId.of(destinationDatasetName, destinationTableId);
    
          // For more information on CopyJobConfiguration see:
          // https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/JobConfiguration.html
          CopyJobConfiguration configuration =
              CopyJobConfiguration.newBuilder(destinationTable, sourceTable).build();
    
          // For more information on Job see:
          // https://googleapis.dev/java/google-cloud-clients/latest/index.html?com/google/cloud/bigquery/package-summary.html
          Job job = bigquery.create(JobInfo.of(configuration));
    
          // Blocks until this job completes its execution, either failing or succeeding.
          Job completedJob = job.waitFor();
          if (completedJob == null) {
            System.out.println("Job not executed since it no longer exists.");
            return;
          } else if (completedJob.getStatus().getError() != null) {
            System.out.println(
                "BigQuery was unable to copy table due to an error: \n" + job.getStatus().getError());
            return;
          }
          System.out.println("Table copied successfully.");
        } catch (BigQueryException | InterruptedException e) {
          System.out.println("Table copying job was interrupted. \n" + e.toString());
        }
      }
    }

    Node.js

    לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Node.jsהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Node.js API.

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    // Import the Google Cloud client library and create a client
    const {BigQuery} = require('@google-cloud/bigquery');
    const bigquery = new BigQuery();
    
    async function copyTable() {
      // Copies src_dataset:src_table to dest_dataset:dest_table.
    
      /**
       * TODO(developer): Uncomment the following lines before running the sample
       */
      // const srcDatasetId = "my_src_dataset";
      // const srcTableId = "my_src_table";
      // const destDatasetId = "my_dest_dataset";
      // const destTableId = "my_dest_table";
    
      // Copy the table contents into another table
      const [job] = await bigquery
        .dataset(srcDatasetId)
        .table(srcTableId)
        .copy(bigquery.dataset(destDatasetId).table(destTableId));
    
      console.log(`Job ${job.id} completed.`);
    
      // Check the job's status for errors
      const errors = job.status.errors;
      if (errors && errors.length > 0) {
        throw errors;
      }
    }

    PHP

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

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    use Google\Cloud\BigQuery\BigQueryClient;
    use Google\Cloud\Core\ExponentialBackoff;
    
    /** Uncomment and populate these variables in your code */
    // $projectId = 'The Google project ID';
    // $datasetId = 'The BigQuery dataset ID';
    // $sourceTableId   = 'The BigQuery table ID to copy from';
    // $destinationTableId = 'The BigQuery table ID to copy to';
    
    $bigQuery = new BigQueryClient([
        'projectId' => $projectId,
    ]);
    $dataset = $bigQuery->dataset($datasetId);
    $sourceTable = $dataset->table($sourceTableId);
    $destinationTable = $dataset->table($destinationTableId);
    $copyConfig = $sourceTable->copy($destinationTable);
    $job = $sourceTable->runJob($copyConfig);
    
    // poll the job until it is complete
    $backoff = new ExponentialBackoff(10);
    $backoff->execute(function () use ($job) {
        print('Waiting for job to complete' . PHP_EOL);
        $job->reload();
        if (!$job->isComplete()) {
            throw new Exception('Job has not yet completed', 500);
        }
    });
    // check if the job has errors
    if (isset($job->info()['status']['errorResult'])) {
        $error = $job->info()['status']['errorResult']['message'];
        printf('Error running job: %s' . PHP_EOL, $error);
    } else {
        print('Table copied successfully' . PHP_EOL);
    }

    Python

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

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    
    from google.cloud import bigquery
    
    # Construct a BigQuery client object.
    client = bigquery.Client()
    
    # TODO(developer): Set source_table_id to the ID of the original table.
    # source_table_id = "your-project.source_dataset.source_table"
    
    # TODO(developer): Set destination_table_id to the ID of the destination table.
    # destination_table_id = "your-project.destination_dataset.destination_table"
    
    job = client.copy_table(source_table_id, destination_table_id)
    job.result()  # Wait for the job to complete.
    
    print("A copy of the table created.")

מגבלות

העתקת טבלה בין אזורים כפופה למגבלות הבאות:

  • אי אפשר להעתיק טבלה באמצעות מסוף Google Cloud או באמצעות הצהרת TABLE COPY DDL.
  • אי אפשר להעתיק טבלה אם יש בה תגי מדיניות.
  • אי אפשר להעתיק טבלה אם טבלת המקור גדולה מ-20TiB. מידע על הגודל הפיזי של טבלת המקור מופיע במאמר אחזור מידע על טבלאות. בנוסף, יכול להיות שיהיה צורך לנסות כמה פעמים להעתיק טבלאות מקור גדולות מ-1 פיזי TiB בין אזורים, כדי שההעתקה תצליח.
  • אי אפשר להעתיק מדיניות IAM שמשויכת לטבלאות. אחרי שההעתקה מסתיימת, אפשר להחיל את אותן מדיניות על היעד.
  • אם פעולת ההעתקה מחליפה טבלה קיימת, התגים בטבלה הקיימת מוסרים.
  • אי אפשר להעתיק כמה טבלאות מקור לטבלת יעד אחת.
  • אי אפשר להעתיק טבלאות במצב הוספה. אם משתמשים במצב write_empty, טבלת היעד לא יכולה להתקיים.
  • המידע על היסטוריית המיקומים לא מועתק לאזור היעד.
  • כשמעתיקים שיבוט או תמונת מצב של טבלה לאזור חדש, נוצר עותק מלא של הטבלה. הפעולה הזו כרוכה בעלויות אחסון נוספות.

צפייה בשימוש הנוכחי במכסה

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

SELECT
  sum(case  when job_type="QUERY" then 1 else 0 end) as QRY_CNT,
  sum(case  when job_type="LOAD" then 1 else 0 end) as LOAD_CNT,
  sum(case  when job_type="EXTRACT" then 1 else 0 end) as EXT_CNT,
  sum(case  when job_type="COPY" then 1 else 0 end) as CPY_CNT
FROM `region-REGION_NAME`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE date(creation_time)= CURRENT_DATE()

שגיאות שקשורות למכסה של מספר משימות ההעתקה המקסימלי ליום בכל פרויקט

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

הודעת השגיאה

Your project exceeded quota for copies per project

אבחון

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

  • אם עבודות ההעתקה שלכם ממוקמות באזור אחד או רק בכמה אזורים, אתם יכולים לנסות להריץ שאילתה בטבלה INFORMATION_SCHEMA.JOBS לאזורים ספציפיים. לדוגמה:

    SELECT
    creation_time, job_id, user_email, destination_table.project_id, destination_table.dataset_id, destination_table.table_id
    FROM `PROJECT_ID`.`region-REGION_NAME`.INFORMATION_SCHEMA.JOBS
    WHERE
    creation_time BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 2 DAY) AND CURRENT_TIMESTAMP()
    AND job_type = "COPY"
    order by creation_time DESC

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

  • כדי לראות את כל עבודות ההעתקה בכל האזורים, אפשר להשתמש במסנן הבא ב-Cloud Logging:

    resource.type="bigquery_resource"
    protoPayload.methodName="jobservice.insert"
    protoPayload.serviceData.jobInsertRequest.resource.jobConfiguration.tableCopy:*
    

רזולוציה

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

מחיקת טבלאות

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

  • באמצעות מסוף Google Cloud .
  • באמצעות הצהרה של שפת הגדרת נתונים (DDL) DROP TABLE.
  • שימוש בפקודה bq rm בכלי שורת הפקודה של BigQuery.
  • קריאה ל-API method ‏tables.delete.
  • שימוש בספריות לקוח.

כדי למחוק את כל הטבלאות בקבוצת הנתונים, צריך למחוק את קבוצת הנתונים.

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

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

התפקידים הנדרשים

כדי לקבל את ההרשאות שנדרשות למחיקת טבלה, צריך לבקש מהאדמין להקצות לכם ב-IAM את התפקיד עריכת נתונים (roles/bigquery.dataEditor) במערך הנתונים. להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

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

ההרשאות הנדרשות

כדי למחוק טבלה, נדרשות ההרשאות הבאות:

  • bigquery.tables.delete
  • bigquery.tables.get

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

מחיקת טבלה

כדי למחוק טבלה:

המסוף

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

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

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

  3. לוחצים על סקירה כללית > טבלאות ובוחרים טבלה.

  4. בחלונית הפרטים, לוחצים על מחיקה.

  5. בתיבת הדו-שיח, מקלידים "delete" ולוחצים על מחיקה כדי לאשר.

SQL

משתמשים בהצהרה DROP TABLE. בדוגמה הבאה נמחקת טבלה בשם mytable:

  1. במסוף Google Cloud , עוברים לדף BigQuery.

    כניסה ל-BigQuery

  2. מזינים את ההצהרה הבאה בעורך השאילתות:

    DROP TABLE mydataset.mytable;

  3. לוחצים על הפעלה.

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

BQ

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. משתמשים בפקודה bq rm עם הדגל --table (או במקש הקיצור -t) כדי למחוק טבלה. כשמשתמשים בכלי שורת הפקודה של BigQuery כדי להסיר טבלה, צריך לאשר את הפעולה. אפשר להשתמש בדגל --force (או בקיצור הדרך -f) כדי לדלג על האישור.

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

    bq rm \
    -f \
    -t \
    project_id:dataset.table

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

    • project_id: מזהה הפרויקט
    • dataset: השם של מערך הנתונים שמכיל את הטבלה
    • table: שם הטבלה שרוצים למחוק

    דוגמאות:

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

    bq rm -t mydataset.mytable
    

    כדי למחוק את הטבלה mytable מקבוצת הנתונים mydataset, מזינים את הפקודה הבאה. מערך הנתונים mydataset נמצא בפרויקט myotherproject, ולא בפרויקט ברירת המחדל.

    bq rm -t myotherproject:mydataset.mytable
    

    כדי למחוק את הטבלה mytable מקבוצת הנתונים mydataset, מזינים את הפקודה הבאה. מערך הנתונים mydataset נמצא בפרויקט ברירת המחדל שלכם. הפקודה משתמשת בקיצור הדרך -f כדי לעקוף את האישור.

    bq rm -f -t mydataset.mytable
    
  3. API

    קוראים ל-method ‏tables.delete של ה-API ומציינים את הטבלה למחיקה באמצעות הפרמטר tableId.

    C#‎

    לפני שמנסים את הדוגמה הזו, צריך לפעול לפי C#הוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery C# API.

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    
    using Google.Cloud.BigQuery.V2;
    using System;
    
    public class BigQueryDeleteTable
    {
        public void DeleteTable(
            string projectId = "your-project-id",
            string datasetId = "your_dataset_id",
            string tableId = "your_table_id"
        )
        {
            BigQueryClient client = BigQueryClient.Create(projectId);
            client.DeleteTable(datasetId, tableId);
            Console.WriteLine($"Table {tableId} deleted.");
        }
    }

    Go

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

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    import (
    	"context"
    	"fmt"
    
    	"cloud.google.com/go/bigquery"
    )
    
    // deleteTable demonstrates deletion of a BigQuery table.
    func deleteTable(projectID, datasetID, tableID string) error {
    	// projectID := "my-project-id"
    	// datasetID := "mydataset"
    	// tableID := "mytable"
    	ctx := context.Background()
    	client, err := bigquery.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("bigquery.NewClient: %v", err)
    	}
    	defer client.Close()
    
    	table := client.Dataset(datasetID).Table(tableID)
    	if err := table.Delete(ctx); err != nil {
    		return err
    	}
    	return nil
    }
    

    Java

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

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    import com.google.cloud.bigquery.BigQuery;
    import com.google.cloud.bigquery.BigQueryException;
    import com.google.cloud.bigquery.BigQueryOptions;
    import com.google.cloud.bigquery.TableId;
    
    public class DeleteTable {
    
      public static void runDeleteTable() {
        // TODO(developer): Replace these variables before running the sample.
        String datasetName = "MY_DATASET_NAME";
        String tableName = "MY_TABLE_NAME";
        deleteTable(datasetName, tableName);
      }
    
      public static void deleteTable(String datasetName, String tableName) {
        try {
          // Initialize client that will be used to send requests. This client only needs to be created
          // once, and can be reused for multiple requests.
          BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
          boolean success = bigquery.delete(TableId.of(datasetName, tableName));
          if (success) {
            System.out.println("Table deleted successfully");
          } else {
            System.out.println("Table was not found");
          }
        } catch (BigQueryException e) {
          System.out.println("Table was not deleted. \n" + e.toString());
        }
      }
    }

    Node.js

    לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Node.jsהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Node.js API.

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    // Import the Google Cloud client library
    const {BigQuery} = require('@google-cloud/bigquery');
    const bigquery = new BigQuery();
    
    async function deleteTable() {
      // Deletes "my_table" from "my_dataset".
    
      /**
       * TODO(developer): Uncomment the following lines before running the sample.
       */
      // const datasetId = "my_dataset";
      // const tableId = "my_table";
    
      // Delete the table
      await bigquery
        .dataset(datasetId)
        .table(tableId)
        .delete();
    
      console.log(`Table ${tableId} deleted.`);
    }

    PHP

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

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    use Google\Cloud\BigQuery\BigQueryClient;
    
    /** Uncomment and populate these variables in your code */
    // $projectId = 'The Google project ID';
    // $datasetId = 'The BigQuery dataset ID';
    // $tableId = 'The BigQuery table ID';
    
    $bigQuery = new BigQueryClient([
        'projectId' => $projectId,
    ]);
    $dataset = $bigQuery->dataset($datasetId);
    $table = $dataset->table($tableId);
    $table->delete();
    printf('Deleted table %s.%s' . PHP_EOL, $datasetId, $tableId);

    Python

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

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    
    from google.cloud import bigquery
    
    # Construct a BigQuery client object.
    client = bigquery.Client()
    
    # TODO(developer): Set table_id to the ID of the table to fetch.
    # table_id = 'your-project.your_dataset.your_table'
    
    # If the table does not exist, delete_table raises
    # google.api_core.exceptions.NotFound unless not_found_ok is True.
    client.delete_table(table_id, not_found_ok=True)  # Make an API request.
    print("Deleted table '{}'.".format(table_id))

    Ruby

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

    כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

    require "google/cloud/bigquery"
    
    def delete_table dataset_id = "my_dataset_id", table_id = "my_table_id"
      bigquery = Google::Cloud::Bigquery.new
      dataset  = bigquery.dataset dataset_id
      table    = dataset.table table_id
    
      table.delete
    
      puts "Table #{table_id} deleted."
    end

שחזור טבלאות שנמחקו

במאמר שחזור טבלאות שנמחקו מוסבר איך לשחזר טבלאות שנמחקו.

אבטחת טבלאות

כדי לשלוט בגישה לטבלאות ב-BigQuery, אפשר לעיין במאמר בנושא שליטה בגישה למשאבים באמצעות IAM.

המאמרים הבאים