針對批次翻譯找出對應的 SQL 物件名稱

本文件說明如何設定名稱對應,以便在批次翻譯期間重新命名 SQL 物件。

總覽

您可以透過名稱對應功能,在來源檔案中找出 SQL 物件的名稱,並在 BigQuery 中指定這些物件的目標名稱。您可以使用下列部分或全部元件,為物件設定名稱對應項目:

  • 名稱對應規則,包含以下項目:
    • 來源系統中物件的完整名稱,提供來源系統中的物件名稱。名稱部分
    • 用於識別來源物件類型的類型
    • 提供 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 專案名稱,最簡單的方法是在建立轉譯工作時指定預設資料庫名稱。這項做法適用於使用三部分命名方式的來源檔案,或是使用四部分命名方式,但未指定最高層級物件名稱的來源檔案。

舉例來說,如果您指定預設資料庫名稱 myprojectSELECT * 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 結構定義下所有 relationattribute 物件的資料庫和結構定義名稱部分也會變更。舉例來說,名為 sales_db.cust_mgmt.historyrelation 物件會變成 sales.cms.history

相反地,針對較低層級物件進行的名稱變更不會影響物件階層中的較高或相同層級物件。

舉例來說,如果您使用 relation 物件類型指定下列名稱對應規則:

名稱部分 來源 目標
資料庫 sales_db sales
結構定義 cust_mgmt cms
關係 clients accounts
屬性

套用後,物件階層中 sales_dbsales_db.cust_mgmt 層級的其他物件名稱都不會變更。

系統會套用最精確的規則

系統只會將一個名稱對應規則套用至物件。如果有多項規則可能會影響單一物件,系統會套用影響最低層級名稱部分的規則。舉例來說,如果 database 類型名稱對應規則和 schema 類型名稱對應規則都會影響 relation 物件的名稱,則會套用 schema 類型名稱對應規則。

使用類型和來源值的獨特組合

您無法指定多個名稱對應規則,且這些規則的類型和來源值相同。舉例來說,您無法同時指定下列兩個名稱對應規則:

規則 1,類型 attribute 規則 2,類型 attribute
名稱部分 來源 目標 來源 目標
資料庫 project project
結構定義 dataset1 dataset1
關係 table1 table1
屬性 lname last_name lname lastname

建立相符的 attributeattribute alias 名稱對應規則

使用 attribute 類型名稱對應規則來變更 DDL 陳述式中的屬性名稱時,您必須建立 attribute alias 名稱對應規則,才能變更 DML 陳述式中的屬性名稱。

名稱變更不會層層套用

名稱變更不會連動至名稱規則。舉例來說,如果您建立了名稱對應規則,將 database1 重新命名為 project1,以及另一個將 project1 重新命名為 project2 的規則,轉譯器就不會將 database1 對應至 project2

處理沒有四部分名稱的來源物件

某些來源系統 (例如 Teradata) 會使用三個名稱部分來完整標示物件名稱。許多來源系統也允許您在 SQL 方言中使用部分限定名稱,例如使用 database1.schema1.table1schema1.table1table1 來參照不同情境中的相同物件。如果來源檔案包含不使用四部分物件名稱的物件,您可以使用名稱對應功能,並指定預設資料庫名稱預設結構定義名稱,以便取得所需的名稱對應。

如需使用名稱對應規則搭配預設資料庫名稱或預設結構定義名稱的範例,請參閱「變更具有不同名稱完成度等級的物件資料庫名稱部分」和「變更部分限定的關聯物件名稱」。

名稱對應範例

請參考本節的範例,瞭解名稱對應規則如何適用於常見用途。

變更完全符合規定的物件資料庫名稱部分

以下範例會將所有具有完整名稱的 databaseschemarelationfunction 物件的資料庫名稱部分,從 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.table2CREATE 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"
    }
  }]
}