針對批次翻譯找出對應的 SQL 物件名稱
本文件說明如何設定名稱對應,以便在批次翻譯期間重新命名 SQL 物件。
總覽
您可以透過名稱對應功能,在來源檔案中找出 SQL 物件的名稱,並在 BigQuery 中指定這些物件的目標名稱。您可以使用下列部分或全部元件,為物件設定名稱對應項目:
名稱部分
您可以使用下列名稱部分組合,在名稱對應規則中提供來源和目標物件名稱的值:
- 資料庫:命名階層的頂層。來源平台可能會使用其他字詞,例如「專案」。
- 結構定義:命名階層的第二層級。來源平台可能會使用其他字詞,例如「資料集」。
- Relation:命名階層的第 3 層。來源平台可能會使用其他字詞,例如「table」。
- 屬性:命名階層結構中的最低層級。來源平台可能會使用其他字詞,例如「欄」。
物件類型
您還必須在名稱對應規則中指定要重新命名的來源物件類型。支援下列物件類型:
Database
:物件階層中的頂層物件,例如database
.schema.relation.attribute
。來源平台可能會使用其他字詞,例如「專案」。將database
指定為物件類型,會變更 DDL 和 DML 陳述式中所有對來源字串的參照。Schema
:物件階層中的第二層物件。來源平台可能會使用其他字詞,例如「資料集」。將schema
指定為物件類型,即可變更 DDL 和 DML 陳述式中所有對來源字串的參照。Relation
:物件階層中的第三層物件。來源平台可能會使用其他字詞,例如「table」。將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.table
SELECT * 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
物件 table
的所有例項重新命名為 t
。
來源和目標名稱部分
名稱部分 | 來源 | 目標 |
---|---|---|
資料庫 | ||
結構定義 | ||
關係 | 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.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
這個範例中的名稱對應規則會導致下列物件名稱變更:
- 在 DDL 和 DML 陳述式中,將
project.dataset2.table2.field1
attribute
物件的例項重新命名為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"
}
}]
}