針對批次翻譯找出對應的 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 陳述式中對來源字串的所有參照。
物件類型所需的名稱部分
如要在名稱對應規則中描述物件,請使用下表為每個物件類型識別的名稱部分:
| 類型 | 來源物件名稱 | 目標物件名稱 | ||||||
|---|---|---|---|---|---|---|---|---|
| 資料庫名稱部分 | 結構定義名稱部分 | 關係名稱部分 | 屬性名稱部分 | 資料庫名稱部分 | 結構定義名稱部分 | 關係名稱部分 | 屬性名稱部分 | |
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.tableSELECT * FROM table1
翻譯成:
SELECT * FROM myproject.database.table。SELECT * FROM myproject.myschema.table1
名稱對應規則行為
以下各節說明名稱對應規則的運作方式。
規則沿用機制會向下傳遞物件階層
如果名稱變更影響上層物件,目標物件和同一階層中的所有子項物件都會受到影響。
舉例來說,如果您指定下列名稱對應規則,且物件類型為 schema:
| 名稱部分 | 來源 | 目標 |
|---|---|---|
| 資料庫 | sales_db |
sales |
| 結構定義 | cust_mgmt |
cms |
| 關係 | ||
| 屬性 |
套用後,sales_db.cust_mgmt 結構定義下所有 relation 和 attribute 物件的資料庫和結構定義名稱部分也會變更。舉例來說,名為 sales_db.cust_mgmt.history 的 relation 物件會變成 sales.cms.history。
反之,如果變更名稱的目標是較低層級的物件,則不會影響物件階層中較高或相同層級的物件。
舉例來說,如果您指定下列名稱對應規則,且物件類型為 relation:
| 名稱部分 | 來源 | 目標 |
|---|---|---|
| 資料庫 | sales_db |
sales |
| 結構定義 | cust_mgmt |
cms |
| 關係 | clients |
accounts |
| 屬性 |
套用後,物件階層的 sales_db 或 sales_db.cust_mgmt 層級中,其他物件的名稱不會變更。
系統會套用最精確的規則
一個物件只能套用一項名稱對應規則。如果多項規則可能會影響單一物件,系統會套用影響最低層級名稱部分的規則。舉例來說,如果 database 類型名稱對應規則和 schema 類型名稱對應規則都可能影響 relation 物件的名稱,系統會套用 schema 類型名稱對應規則。
使用不重複的類型和來源值組合
您無法指定多個具有相同類型和來源值的名稱對應規則。舉例來說,您無法同時指定下列名稱對應規則:
規則 1,類型 attribute |
規則 2,類型 attribute |
|||
|---|---|---|---|---|
| 名稱部分 | 來源 | 目標 | 來源 | 目標 |
| 資料庫 | 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 在不同環境中參照相同物件。如果來源檔案包含未使用四部分物件名稱的物件,您可以搭配指定預設資料庫名稱和預設結構定義名稱,使用名稱對應來達成所需的名稱對應。
如需使用名稱對應規則搭配預設資料庫名稱或預設結構定義名稱的範例,請參閱「變更名稱完成程度不同的物件的資料庫名稱部分」和「變更部分限定的關聯物件名稱」。
名稱對應範例
請參閱本節範例,瞭解名稱對應規則在常見用途中的運作方式。
變更完全符合規定的物件的資料庫名稱部分
在下列範例中,所有具有完整名稱的 database、schema、relation 和 function 物件,其資料庫名稱部分都會從 td_project 重新命名為 bq_project。
來源和目標名稱部分
| 名稱部分 | 來源 | 目標 |
|---|---|---|
| 資料庫 | 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
來源和目標名稱部分
| 名稱部分 | 來源 | 目標 |
|---|---|---|
| 資料庫 | 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 物件名稱的部分。
來源和目標名稱部分
| 名稱部分 | 來源 | 目標 |
|---|---|---|
| 資料庫 | 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。
來源和目標名稱部分
| 名稱部分 | 來源 | 目標 |
|---|---|---|
| 資料庫 | 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
來源和目標名稱部分
| 名稱部分 | 來源 | 目標 |
|---|---|---|
| 資料庫 | 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 物件的所有執行個體重新命名為 t。table
來源和目標名稱部分
| 名稱部分 | 來源 | 目標 |
|---|---|---|
| 資料庫 | ||
| 結構定義 | ||
| 關係 | 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。
來源和目標名稱部分
| 名稱部分 | 來源 | 目標 |
|---|---|---|
| 資料庫 | 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 物件位於物件階層的最低層級,因此這項名稱對應不會變更任何其他物件的名稱。
來源和目標名稱部分
| 名稱部分 | 來源 | 目標 |
|---|---|---|
| 資料庫 | 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 物件位於物件階層的最低層級,因此這個名稱對應不會變更任何其他物件的名稱。
來源和目標名稱部分
| 名稱部分 | 來源 | 目標 |
|---|---|---|
| 資料庫 | 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"
}
}
]
}
檔案大小不得超過 5 MB。
如要進一步瞭解如何為翻譯工作指定名稱對應規則,請參閱「提交翻譯工作」。
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
這個範例中的名稱對應規則會進行下列物件名稱變更:
- 在 DDL 和 DML 陳述式中,將
project.dataset2.table2.field1attribute物件的執行個體重新命名為bq_project.bq_dataset2.bq_table2.bq_field。
{
"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"
}
}]
}