מיפוי של שמות אובייקטים ב-SQL לתרגום באצווה

.

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

סקירה כללית

מיפוי שמות מאפשר לכם לזהות את השמות של אובייקטים ב-SQL בקובצי המקור, ולציין שמות יעד לאובייקטים האלה ב-BigQuery. כדי להגדיר מיפוי שמות לאובייקט, אפשר להשתמש בחלק מהרכיבים הבאים או בכולם:

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

שמות חלקים

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

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

סוגי אובייקטים

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

  • Database: אובייקט ברמה העליונה בהיררכיית האובייקטים, לדוגמה database.schema.relation.attribute. יכול להיות שבפלטפורמת המקור נעשה שימוש במונח אחר, למשל פרויקט. הגדרת database כסוג האובייקט משנה את כל ההפניות למחרוזת המקורית בהצהרות DDL ו-DML.
  • Schema: אובייקט ברמה השנייה בהיררכיית האובייקטים. יכול להיות שבפלטפורמת המקור שלכם יש מונח אחר לזה, למשל מערך נתונים. ציון schema כסוג האובייקט משנה את כל ההפניות למחרוזת המקורית בהצהרות DDL ו-DML.
  • Relation: אובייקט ברמה השלישית בהיררכיית האובייקטים. יכול להיות שבפלטפורמת המקור שלכם יש מונח אחר לזה, למשל טבלה. אם מציינים relation כסוג האובייקט, כל ההפניות למחרוזת המקור בהצהרות DDL משתנות.
  • Relation alias: כינוי לאובייקט ברמה השלישית. לדוגמה, בשאילתה SELECT t.field1, t.field2 FROM myTable t;, ‏ t הוא כינוי של קשר. בשאילתה SELECT field1, field2 FROM schema1.table1, ‏table1 הוא גם כינוי של קשר. אם מציינים relation alias כסוג האובייקט, נוצרים כינויים לכל ההפניות למחרוזת המקור בהצהרות DML. לדוגמה, אם מציינים את tableA כשם היעד, הדוגמאות הקודמות מתורגמות ל-SELECT tableA.field1, tableA.field2 FROM myTable AS tableA; ול-SELECT tableA.field1, tableA.field2 FROM schema1.table1 AS tableA, בהתאמה.
  • Function: פרוצדורה, לדוגמה create procedure db.test.function1(a int). אם מציינים function כסוג האובייקט, כל ההפניות למחרוזת המקורית משתנות בהצהרות DDL ו-DML.
  • Attribute: אובייקט ברמה הרביעית בהיררכיית האובייקטים. יכול להיות שבפלטפורמת המקור שלכם יש מונח אחר לזה, למשל עמודה. אם מציינים attribute כסוג האובייקט, כל ההפניות למחרוזת המקור בהצהרות DDL משתנות.
  • Attribute alias: כינוי לאובייקט ברמה הרביעית. לדוגמה, בשאילתה SELECT field1 FROM myTable;, ‏field1 הוא כינוי של מאפיין. אם מציינים attribute alias כסוג האובייקט, כל ההפניות למחרוזת המקור בהצהרות DML משתנות.

חלקים נדרשים בשם של סוגי אובייקטים

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

סוג שם אובייקט המקור שם אובייקט היעד
חלק משם מסד הנתונים חלק משם הסכימה Relation name part חלק משם המאפיין חלק משם מסד הנתונים חלק משם הסכימה Relation name part חלק משם המאפיין
Database X X
Schema X X X X
Relation X X X X X X
Function X X X X X X
Attribute X X X X X
Attribute alias X X X X X
Relation alias X X

מסד נתונים שמוגדר כברירת מחדל

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

לדוגמה, אם מציינים את שם מסד הנתונים שמוגדר כברירת מחדל myproject, אז משפט מקור כמו SELECT * FROM database.table מתורגם ל-SELECT * FROM myproject.database.table. אם יש לכם אובייקטים שכבר משתמשים בחלק משם מסד הנתונים, כמו SELECT * FROM database.schema.table, תצטרכו להשתמש בכלל למיפוי שמות כדי לשנות את השם של database.schema.table ל-myproject.schema.table.

סכימה שמוגדרת כברירת מחדל

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

לדוגמה, אם מציינים את שם מסד הנתונים שמוגדר כברירת מחדל myproject ואת שם הסכימה שמוגדר כברירת מחדל myschema, אז ההצהרות הבאות לגבי המקור:

  • SELECT * FROM database.table
  • SELECT * FROM table1

הם מתורגמים ל:

  • SELECT * FROM myproject.database.table.
  • SELECT * FROM myproject.myschema.table1

התנהגות של כלל מיפוי שמות

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

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

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

לדוגמה, אם מציינים את כלל מיפוי השמות הבא עם סוג אובייקט schema:

חלק בשם מקור Target
מסד נתונים sales_db sales
סכימה cust_mgmt cms
קשר
מאפיין

כשמחילים את האילוץ, גם חלקי השם של מסד הנתונים והסכימה של כל האובייקטים relation ו-attribute בסכימה sales_db.cust_mgmt משתנים. לדוגמה, אובייקט relation בשם sales_db.cust_mgmt.history הופך ל-sales.cms.history.

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

לדוגמה, אם מציינים את כלל מיפוי השמות הבא עם סוג אובייקט relation:

חלק בשם מקור Target
מסד נתונים sales_db sales
סכימה cust_mgmt cms
קשר clients accounts
מאפיין

כשמחילים אותו, השם של אף אובייקט אחר ברמה sales_db או sales_db.cust_mgmt בהיררכיית האובייקטים לא משתנה.

המערכת תחיל את הכלל הכי ספציפי.

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

שימוש בשילוב ייחודי של ערכי סוג ומקור

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

כלל 1, סוג attribute כלל 2, סוג attribute
חלק בשם מקור Target מקור Target
מסד נתונים project project
סכימה dataset1 dataset1
קשר table1 table1
מאפיין lname last_name lname lastname

יצירת כללי מיפוי שמות תואמים attribute ו-attribute alias

כשמשתמשים בכלל מיפוי של שם סוג attribute כדי לשנות שם מאפיין בהצהרות DDL, צריך ליצור כלל מיפוי של שם attribute alias כדי לשנות את השם של המאפיין הזה גם בפקודות DML.

שינויים בשם לא מועברים באופן אוטומטי

שינויים בשם לא מועברים באופן אוטומטי לכללי שמות אחרים. לדוגמה, אם יצרתם כלל למיפוי שמות שמשנה את השם database1 ל-project1, וכלל נוסף שמשנה את השם project1 ל-project2, הכלי לתרגום לא ימפה את database1 ל-project2.

טיפול באובייקטים במקור שאין להם שמות בני ארבעה חלקים

מערכות מקור מסוימות, כמו Teradata, משתמשות בשלושה חלקים של שם כדי לציין את השם המלא של אובייקט. במערכות מקור רבות אפשר גם להשתמש בשמות שמוגדרים באופן חלקי בניבי ה-SQL שלהן, למשל באמצעות database1.schema1.table1,‏ schema1.table1 ו-table1 כדי להתייחס לאותו אובייקט בהקשרים שונים. אם קובצי המקור מכילים אובייקטים שלא משתמשים בשמות אובייקטים בני ארבעה חלקים, אפשר להשתמש במיפוי שמות בשילוב עם ציון שם ברירת מחדל של מסד נתונים ושם ברירת מחדל של סכימה כדי להשיג את מיפוי השמות הרצוי.

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

דוגמאות למיפוי שמות

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

שינוי החלק של שם מסד הנתונים באובייקטים מוגדרים במלואם

בדוגמה הבאה, החלק של שם מסד הנתונים משתנה מ-td_project ל-bq_project בכל האובייקטים מסוג database, ‏ schema, ‏ relation ו-function שיש להם שמות מלאים.

חלקי שמות של מקורות ויעדים

חלק בשם מקור Target
מסד נתונים td_project bq_project
סכימה
קשר
מאפיין

סוג

  • database

קלט לדוגמה

  • SELECT * FROM td_project.schema.table;
  • SELECT * FROM td_project.schema1.table1;

פלט לדוגמה

  • SELECT * FROM bq_project.schema.table;
  • SELECT * FROM bq_project.schema1.table1

שינוי החלק של שם מסד הנתונים באובייקטים עם רמות שונות של השלמת שם

בדוגמה הבאה, השם של חלק ממסד הנתונים project משתנה ל-bq_project לכל סוגי האובייקטים, וגם נוסף bq_project כשם של חלק ממסד הנתונים לאובייקטים שלא צוין להם שם.

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

ערך ברירת מחדל במסד הנתונים

  • project

חלקי שמות של מקורות ויעדים

חלק בשם מקור Target
מסד נתונים project bq_project
סכימה
קשר
מאפיין

סוג

  • database

קלט לדוגמה

  • SELECT * FROM project.schema.table;
  • SELECT * FROM schema1.table1;

פלט לדוגמה

  • SELECT * FROM bq_project.schema.table;
  • SELECT * FROM bq_project.schema1.table1

שינוי החלק של שם מסד הנתונים והחלק של שם הסכימה באובייקטים מוגדרים במלואם

בדוגמה הבאה, החלק של שם מסד הנתונים warehouse1 משתנה ל-myproject, וגם החלק של שם הסכימה database1 משתנה ל-mydataset.

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

חלקי שמות של מקורות ויעדים

חלק בשם מקור Target
מסד נתונים warehouse1 myproject
סכימה database1 mydataset
קשר
מאפיין

סוג

  • schema

קלט לדוגמה

  • SELECT * FROM warehouse1.database1.table1;
  • SELECT * FROM database2.table2;

פלט לדוגמה

  • SELECT * FROM myproject.mydataset.table1;
  • SELECT * FROM __DEFAULT_DATABASE__.database2.table2;

שינוי שם אובייקט relation שמוגדר במלואו

בדוגמה הבאה, השם mydb.myschema.mytable משתנה ל-mydb.myschema.table1.

חלקי שמות של מקורות ויעדים

חלק בשם מקור Target
מסד נתונים mydb mydb
סכימה myschema myschema
קשר mytable table1
מאפיין

סוג

  • relation

קלט לדוגמה

  • CREATE table mydb.myschema.mytable(id int, name varchar(64));

פלט לדוגמה

  • CREATE table mydb.myschema.table1(id integer, name string(64));

שינוי שם אובייקט relation עם ציון חלקי של הנתיב

בדוגמה הבאה, השם myschema.mytable משתנה ל-mydb.myschema.table1.

ערך ברירת מחדל במסד הנתונים

  • mydb

חלקי שמות של מקורות ויעדים

חלק בשם מקור Target
מסד נתונים mydb mydb
סכימה myschema myschema
קשר mytable table1
מאפיין

סוג

  • relation

קלט לדוגמה

  • CREATE table myschema.mytable(id int, name varchar(64));

פלט לדוגמה

  • CREATE table mydb.myschema.table1(id integer, name string(64));

שינוי שם של אובייקט relation alias

בדוגמה הבאה משנים את השם של כל המופעים של האובייקט relation alias table ל-t.

חלקי שמות של מקורות ויעדים

חלק בשם מקור Target
מסד נתונים
סכימה
קשר table t
מאפיין

סוג

  • relation alias

קלט לדוגמה

  • SELECT table.id, table.name FROM mydb.myschema.mytable table

פלט לדוגמה

  • SELECT t.id, t.name FROM mydb.myschema.mytable AS t

שינוי שם של אובייקט function

בדוגמה הבאה, השם mydb.myschema.myfunction משתנה ל-mydb.myschema.function1.

חלקי שמות של מקורות ויעדים

חלק בשם מקור Target
מסד נתונים mydb mydb
סכימה myschema myschema
קשר myprocedure procedure1
מאפיין

סוג

  • function

קלט לדוגמה

  • CREATE PROCEDURE mydb.myschema.myprocedure(a int) BEGIN declare i int; SET i = a + 1; END;
  • CALL mydb.myschema.myprocedure(7)

פלט לדוגמה

  • CREATE PROCEDURE mydb.myschema.procedure1(a int) BEGIN declare i int; SET i = a + 1; END;
  • CALL mydb.myschema.procedure1(7);

שינוי שם של אובייקט attribute

בדוגמה הבאה, השם mydb.myschema.mytable.myfield משתנה ל-mydb.myschema.mytable.field1. מכיוון שאובייקטים מסוג attribute נמצאים ברמה הנמוכה ביותר בהיררכיית האובייקטים, מיפוי השמות הזה לא משנה את השם של אף אובייקט אחר.

חלקי שמות של מקורות ויעדים

חלק בשם מקור Target
מסד נתונים mydb
סכימה myschema
קשר mytable
מאפיין myfield field1

סוג

  • attribute

קלט לדוגמה

  • CREATE table mydb.myschema.mytable(myfield int, name varchar(64), revenue int);

פלט לדוגמה

  • CREATE table mydb.myschema.mytable(field1 int, name varchar(64), revenue int);

שינוי שם של אובייקט attribute alias

בדוגמה הבאה, השם mydb.myschema.mytable.myfield משתנה ל-mydb.myschema.mytable.field1. אובייקטים מסוג attribute alias נמצאים ברמה הנמוכה ביותר בהיררכיית האובייקטים, ולכן מיפוי השמות הזה לא משנה את השם של אף אובייקט אחר.

חלקי שמות של מקורות ויעדים

חלק בשם מקור Target
מסד נתונים mydb
סכימה myschema
קשר mytable
מאפיין myfield field1

סוג

  • attribute alias

קלט לדוגמה

  • SELECT myfield, name FROM mydb.myschema.mytable;

פלט לדוגמה

  • SELECT field1, name FROM mydb.myschema.mytable;

פורמט קובץ JSON

אם בוחרים לציין כללי מיפוי שמות באמצעות קובץ JSON ולא באמצעות Google Cloud המסוף, קובץ ה-JSON צריך להיות בפורמט הבא:

{
  "name_map": [
    {
      "source": {
        "type": "string",
        "database": "string",
        "schema": "string",
        "relation": "string",
        "attribute": "string"
      },
      "target": {
        "database": "string",
        "schema": "string",
        "relation": "string",
        "attribute": "string"
      }
    }
  ]
}

גודל הקובץ צריך להיות פחות מ-5MB.

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

דוגמאות ל-JSON

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

דוגמה 1

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

  • משנים את השם של מופעים של האובייקט project.dataset2.table2 relation ל-bq_project.bq_dataset2.bq_table2.
  • משנה את השם של כל המופעים של האובייקט project database ל-bq_project. לדוגמה, project.mydataset.table2 הופך ל-bq_project.mydataset.table2 ו-CREATE DATASET project.mydataset הופך ל-CREATE DATASET bq_project.mydataset.
{
  "name_map": [{
    "source": {
      "type": "RELATION",
      "database": "project",
      "schema": "dataset2",
      "relation": "table2"
    },
    "target": {
      "database": "bq_project",
      "schema": "bq_dataset2",
      "relation": "bq_table2"
    }
  }, {
    "source": {
      "type": "DATABASE",
      "database": "project"
    },
    "target": {
      "database": "bq_project"
    }
  }]
}

דוגמה 2

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

  • משנים את השם של מופעים של האובייקט project.dataset2.table2.field1 attribute ל-bq_project.bq_dataset2.bq_table2.bq_field בפקודות DDL ו-DML.
{
  "name_map": [{
    "source": {
      "type": "ATTRIBUTE",
      "database": "project",
      "schema": "dataset2",
      "relation": "table2",
      "attribute": "field1"
    },
    "target": {
      "database": "bq_project",
      "schema": "bq_dataset2",
      "relation": "bq_table2",
      "attribute": "bq_field"
    }
  }, {
    "source": {
      "type": "ATTRIBUTE_ALIAS",
      "database": "project",
      "schema": "dataset2",
      "relation": "table2",
      "attribute": "field1"
    },
    "target": {
      "database": "bq_project",
      "schema": "bq_dataset2",
      "relation": "bq_table2",
      "attribute": "bq_field"
    }
  }]
}