מיפוי של שמות אובייקטים של 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.

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

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

לדוגמה, אם מציינים את שם מסד הנתונים שמוגדר כברירת מחדל 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 ולא באמצעות מסוף Cloud de Confiance , קובץ ה-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"
    }
  }]
}