針對批次翻譯找出對應的 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 陳述式中對來源字串的所有參照。

物件類型名稱的必要部分

如要在名稱對應規則中描述物件,請使用下表為每個物件類型識別的名稱部分:

類型 來源物件名稱 目標物件名稱
資料庫名稱部分 結構定義名稱部分 關係名稱部分 屬性名稱部分 資料庫名稱部分 結構定義名稱部分 關係名稱部分 屬性名稱部分
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 結構定義下所有 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 檔案 (而非 Trusted 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"
    }
  }]
}