מיפוי של שמות אובייקטים ב-SQL לתרגום באצווה
.במאמר הזה מוסבר איך להגדיר מיפוי שמות כדי לשנות את השם של אובייקטים של SQL במהלך תרגום באצווה.
סקירה כללית
מיפוי שמות מאפשר לכם לזהות את השמות של אובייקטים ב-SQL בקובצי המקור, ולציין שמות יעד לאובייקטים האלה ב-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.tableSELECT * 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.table2relationל-bq_project.bq_dataset2.bq_table2. - משנה את השם של כל המופעים של האובייקט
projectdatabaseל-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.field1attributeל-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"
}
}]
}