Mapear nomes de objetos SQL para tradução em lote
Neste documento, descrevemos como configurar o mapeamento de nomes para renomear objetos SQL durante a tradução em lote.
Visão geral
O mapeamento de nomes permite identificar os nomes de objetos SQL nos arquivos de origem e especificar nomes de destino para esses objetos no BigQuery. É possível usar alguns ou todos os seguintes componentes para configurar o mapeamento de nome para um objeto:
- Uma regra de mapeamento de nome composta por:
- Partes de nome de origem que fornecem o nome totalmente qualificado do objeto no sistema de origem.
- Um tipo que identifica o tipo do objeto de origem.
- Partes do nome de destino que fornecem o nome do objeto no BigQuery.
- Um nome de banco de dados padrão a ser usado com qualquer objeto de origem que não especifique um.
- Um nome de esquema padrão a ser usado com qualquer objeto de origem que não especifique um.
Partes de nome
Para fornecer os valores dos nomes de objetos de origem e de destino em uma regra de mapeamento de nome, use uma combinação das seguintes partes de nome:
- Banco de dados: o nível superior da hierarquia de nomes. Sua plataforma de origem pode usar um termo alternativo para isso, por exemplo, projeto.
- Esquema: o segundo nível da hierarquia de nomes. A plataforma de origem pode usar um termo alternativo para isso, por exemplo, conjunto de dados.
- Relação: o terceiro nível da hierarquia de nomenclatura. Sua plataforma de origem pode usar um termo alternativo para isso, por exemplo, tabela.
- Atributo: o nível mais baixo da hierarquia de nomes. A plataforma de origem pode usar um termo alternativo para isso, por exemplo, column.
Tipos de objeto
Também é preciso especificar o tipo de objeto de origem que você está renomeando em uma regra de mapeamento de nome. Os seguintes tipos de objetos são compatíveis:
Database
: um objeto de nível superior na hierarquia de objetos, por exemplo,database
.schema.relation.attribute
. Sua plataforma de origem pode usar um termo alternativo para isso, por exemplo, projeto. A especificação dedatabase
como o tipo de objeto muda todas as referências à string de origem em instruções DDL e DML.Schema
: um objeto de segundo nível na hierarquia de objetos. A plataforma de origem pode usar um termo alternativo para isso, por exemplo, conjunto de dados. A especificação deschema
como o tipo de objeto muda todas as referências à string de origem em instruções DDL e DML.Relation
: um objeto de terceiro nível na hierarquia de objetos. Sua plataforma de origem pode usar um termo alternativo para isso, por exemplo, tabela. A especificação derelation
como o tipo de objeto muda todas as referências à string de origem em instruções DDL.Relation alias
: um alias para um objeto de terceiro nível. Por exemplo, na consultaSELECT t.field1, t.field2 FROM myTable t;
,t
é um alias de relação. Na consultaSELECT field1, field2 FROM schema1.table1
,table1
também é um alias de relação. Especificarrelation alias
como o tipo de objeto cria aliases para todas as referências à string de origem em instruções DML. Por exemplo, setableA
for especificado como o nome do destino, os exemplos anteriores serão traduzidos comoSELECT tableA.field1, tableA.field2 FROM myTable AS tableA;
eSELECT tableA.field1, tableA.field2 FROM schema1.table1 AS tableA
, respectivamente.Function
: um procedimento, por exemplo,create procedure db.test.function1(a int)
. A especificação defunction
como o tipo de objeto muda todas as referências à string de origem em instruções DDL e DML.Attribute
: um objeto de quarto nível na hierarquia de objetos. A plataforma de origem pode usar um termo alternativo para isso, por exemplo, column. A especificação deattribute
como o tipo de objeto muda todas as referências à string de origem em instruções DDL.Attribute alias
: um alias para um objeto de quarto nível. Por exemplo, na consultaSELECT field1 FROM myTable;
,field1
é um alias de atributo. A especificação deattribute alias
como o tipo de objeto muda todas as referências à string de origem em instruções DML.
Partes de nome necessárias para tipos de objeto
Para descrever um objeto em uma regra de mapeamento de nome, use as partes de nome identificadas para cada tipo de objeto na tabela a seguir:
Tipo | Nome do objeto de origem | Nome do objeto de destino | ||||||
---|---|---|---|---|---|---|---|---|
Parte do nome do banco de dados | Parte do nome do esquema | Parte do nome da relação | Parte do nome do atributo | Parte do nome do banco de dados | Parte do nome do esquema | Parte do nome da relação | Parte do nome do atributo | |
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 |
Banco de dados padrão
Se você quiser anexar um nome de projeto do BigQuery a todos os objetos traduzidos, o mais fácil é especificar um nome de banco de dados padrão ao criar um job de tradução. Isso funciona para arquivos de origem em que a nomenclatura de três partes é usada ou em que a nomeação de quatro partes é usada, mas o nome de objeto de nível mais alto não é especificado.
Por exemplo, se você especificar o nome de banco de dados padrão myproject
, uma
instrução como SELECT * FROM database.table
será convertida em
SELECT * FROM myproject.database.table
. Se você tiver objetos que já usam uma
parte do nome do banco de dados, como SELECT * FROM database.schema.table
, use
uma regra de mapeamento de nome para renomear database.schema.table
como
myproject.schema.table
.
Esquema padrão
Para qualificar totalmente todos os nomes de objeto nos arquivos de origem que não usam nomeação de quatro partes, forneça um nome de banco de dados padrão e um nome de esquema padrão quando você cria um job de tradução. O nome de esquema padrão é fornecido como o primeiro nome de esquema na opção de caminho de pesquisa do esquema.
Por exemplo, se você especificar o nome padrão do banco de dados myproject
e o nome padrão do esquema myschema
, as seguintes instruções de origem:
SELECT * FROM database.table
SELECT * FROM table1
Estão traduzidos para:
SELECT * FROM myproject.database.table
.SELECT * FROM myproject.myschema.table1
Comportamento da regra de mapeamento de nome
As seções a seguir descrevem como as regras de mapeamento de nome se comportam.
A herança de regras flui para baixo na hierarquia de objetos
Uma mudança de nome que afeta um objeto de nível superior afeta o objeto de destino e todos os objetos filhos dele na mesma hierarquia.
Por exemplo, se você especificar a seguinte regra de mapeamento de nome com um tipo
de objeto schema
:
Parte do nome | Origem | Objetivo |
---|---|---|
Banco de dados | sales_db |
sales |
Esquema | cust_mgmt |
cms |
Relação | ||
Atributo |
Quando aplicado, as partes do nome do banco de dados e do esquema de todos os objetos relation
e attribute
no esquema sales_db.cust_mgmt
também são alteradas. Por
exemplo, um objeto relation
chamado sales_db.cust_mgmt.history
se torna
sales.cms.history
.
Por outro lado, as mudanças de nome que segmentam objetos de nível inferior não afetam os objetos de nível superior ou igual na hierarquia de objetos.
Por exemplo, se você especificar a seguinte regra de mapeamento de nome com um tipo
de objeto relation
:
Parte do nome | Origem | Objetivo |
---|---|---|
Banco de dados | sales_db |
sales |
Esquema | cust_mgmt |
cms |
Relação | clients |
accounts |
Atributo |
Quando aplicado, nenhum outro objeto no nível da hierarquia de sales_db
ou sales_db.cust_mgmt
tem o nome alterado.
A regra mais específica é aplicada
Apenas uma regra de mapeamento de nome é aplicada a um objeto. Se várias regras puderem
afetar um único objeto, a regra que afeta a parte do nome de nível mais baixo
será aplicada. Por exemplo, se uma regra de mapeamento de nome de tipo database
e uma regra de mapeamento de nome de tipo schema
podem afetar o nome de um objeto relation
, a
regra de mapeamento de nome de tipo schema
será aplicada.
Usar uma combinação única de tipos e valores de origem
Não é possível especificar mais de uma regra de mapeamento de nome com o mesmo tipo e valores de origem. Por exemplo, não é possível especificar as duas regras de mapeamento de nome a seguir:
Regra 1, digite attribute |
Regra 2, digite attribute |
|||
---|---|---|---|---|
Parte do nome | Origem | Objetivo | Origem | Objetivo |
Banco de dados | project |
project |
||
Esquema | dataset1 |
dataset1 |
||
Relação | table1 |
table1 |
||
Atributo | lname |
last_name |
lname |
lastname |
Criar regras de mapeamento de nome correspondentes a attribute
e attribute alias
Ao usar uma regra de mapeamento de nome de tipo attribute
para alterar um nome de atributo
em instruções DDL, também é necessário criar uma regra de mapeamento de nome attribute alias
para
alterar o nome desse atributo nas instruções DML.
Alterações de nome não são aplicadas em cascata
As alterações de nome não são aplicadas em cascata nas regras de nome.
Por exemplo, se você tiver criado uma regra de mapeamento de nome que renomeia database1
como
project1
e outra que renomeia project1
para project2
, o tradutor
não mapeia database1
para project2
.
Processar objetos de origem que não têm nomes de quatro partes
Alguns sistemas de origem, como o Teradata, usam três partes de nome para qualificar totalmente
os nomes de objetos. Muitos sistemas de origem também permitem usar nomes parcialmente qualificados nos
dialetos SQL,
por exemplo, usando database1.schema1.table1
, schema1.table1
e table1
para se referir ao mesmo objeto em contextos diferentes. Se os arquivos de origem tiverem
objetos que não usam nomes de objetos de quatro partes, é possível usar o mapeamento de nomes em
combinação especificando um nome de banco de dados padrão
e um nome do esquema padrão para fazer
o mapeamento de nomes que você quer.
Para ver exemplos de como usar regras de mapeamento de nome com um nome padrão de banco de dados ou de esquema padrão, consulte Alterar a parte do nome do banco de dados para objetos com níveis variados de conclusão de nome e Alterar um nome de objeto de relação parcialmente qualificado.
Exemplos de mapeamento de nome
Use os exemplos nesta seção para ver como as regras de mapeamento de nome funcionam em casos de uso comuns.
Alterar a parte do nome do banco de dados para objetos totalmente qualificados
O exemplo a seguir renomeia a parte do nome do banco de dados de td_project
para bq_project
para todos os objetos database
, schema
, relation
e function
que têm nomes qualificados.
Partes de nome de origem e destino
Parte do nome | Origem | Objetivo |
---|---|---|
Banco de dados | td_project |
bq_project |
Esquema | ||
Relação | ||
Atributo |
Tipo
database
Exemplo de entrada
SELECT * FROM td_project.schema.table;
SELECT * FROM td_project.schema1.table1;
Exemplo de saída
SELECT * FROM bq_project.schema.table;
SELECT * FROM bq_project.schema1.table1
Alterar a parte do nome do banco de dados para objetos com níveis variados de conclusão de nome
O exemplo a seguir renomeia a parte do nome do banco de dados project
para bq_project
para todos os tipos de objeto e também adiciona bq_project
como a parte do nome do banco de dados
para objetos que não especificam uma.
Para fazer isso, é preciso especificar um valor padrão de banco de dados ao configurar o job de tradução, além de especificar regras de mapeamento de nome. Para mais informações sobre como especificar um nome de banco de dados padrão, consulte Enviar um job de tradução.
Valor padrão do banco de dados
project
Partes de nome de origem e destino
Parte do nome | Origem | Objetivo |
---|---|---|
Banco de dados | project |
bq_project |
Esquema | ||
Relação | ||
Atributo |
Tipo
database
Exemplo de entrada
SELECT * FROM project.schema.table;
SELECT * FROM schema1.table1;
Exemplo de saída
SELECT * FROM bq_project.schema.table;
SELECT * FROM bq_project.schema1.table1
Alterar a parte do nome do banco de dados e a parte do nome do esquema para objetos totalmente qualificados
O exemplo a seguir altera a parte do nome do banco de dados warehouse1
para
myproject
e também a parte do nome do esquema database1
para mydataset
.
Também é possível mudar as partes de um nome de objeto relation
da
mesma maneira usando um tipo relation
e especificando valores de origem e destino
para a parte do nome da relação.
Partes de nome de origem e destino
Parte do nome | Origem | Objetivo |
---|---|---|
Banco de dados | warehouse1 |
myproject |
Esquema | database1 |
mydataset |
Relação | ||
Atributo |
Tipo
schema
Exemplo de entrada
SELECT * FROM warehouse1.database1.table1;
SELECT * FROM database2.table2;
Exemplo de saída
SELECT * FROM myproject.mydataset.table1;
SELECT * FROM __DEFAULT_DATABASE__.database2.table2;
Alterar um nome de objeto relation
totalmente qualificado
O exemplo a seguir renomeia mydb.myschema.mytable
como mydb.myschema.table1
.
Partes de nome de origem e destino
Parte do nome | Origem | Objetivo |
---|---|---|
Banco de dados | mydb |
mydb |
Esquema | myschema |
myschema |
Relação | mytable |
table1 |
Atributo |
Tipo
relation
Exemplo de entrada
CREATE table mydb.myschema.mytable(id int, name varchar(64));
Exemplo de saída
CREATE table mydb.myschema.table1(id integer, name string(64));
Mudar um nome de objeto relation
parcialmente qualificado
O exemplo a seguir renomeia myschema.mytable
como mydb.myschema.table1
.
Valor padrão do banco de dados
mydb
Partes de nome de origem e destino
Parte do nome | Origem | Objetivo |
---|---|---|
Banco de dados | mydb |
mydb |
Esquema | myschema |
myschema |
Relação | mytable |
table1 |
Atributo |
Tipo
relation
Exemplo de entrada
CREATE table myschema.mytable(id int, name varchar(64));
Exemplo de saída
CREATE table mydb.myschema.table1(id integer, name string(64));
Mudar o nome de um objeto relation alias
O exemplo a seguir renomeia todas as instâncias do objeto relation alias
table
para t
.
Partes de nome de origem e destino
Parte do nome | Origem | Objetivo |
---|---|---|
Banco de dados | ||
Esquema | ||
Relação | table |
t |
Atributo |
Tipo
relation alias
Exemplo de entrada
SELECT table.id, table.name FROM mydb.myschema.mytable table
Exemplo de saída
SELECT t.id, t.name FROM mydb.myschema.mytable AS t
Mudar o nome de um objeto function
O exemplo a seguir renomeia mydb.myschema.myfunction
como mydb.myschema.function1
.
Partes de nome de origem e destino
Parte do nome | Origem | Objetivo |
---|---|---|
Banco de dados | mydb |
mydb |
Esquema | myschema |
myschema |
Relação | myprocedure |
procedure1 |
Atributo |
Tipo
function
Exemplo de entrada
CREATE PROCEDURE mydb.myschema.myprocedure(a int) BEGIN declare i int; SET i = a + 1; END;
CALL mydb.myschema.myprocedure(7)
Exemplo de saída
CREATE PROCEDURE mydb.myschema.procedure1(a int) BEGIN declare i int; SET i = a + 1; END;
CALL mydb.myschema.procedure1(7);
Mudar o nome de um objeto attribute
O exemplo a seguir renomeia mydb.myschema.mytable.myfield
como mydb.myschema.mytable.field1
. Como os objetos attribute
estão no nível mais baixo
da hierarquia de objetos, esse mapeamento de nome não altera o nome
de nenhum outro objeto.
Partes de nome de origem e destino
Parte do nome | Origem | Objetivo |
---|---|---|
Banco de dados | mydb |
|
Esquema | myschema |
|
Relação | mytable |
|
Atributo | myfield |
field1 |
Tipo
attribute
Exemplo de entrada
CREATE table mydb.myschema.mytable(myfield int, name varchar(64), revenue int);
Exemplo de saída
CREATE table mydb.myschema.mytable(field1 int, name varchar(64), revenue int);
Mudar o nome de um objeto attribute alias
O exemplo a seguir renomeia mydb.myschema.mytable.myfield
como mydb.myschema.mytable.field1
. Como os objetos attribute alias
estão no nível mais baixo da hierarquia de objetos, esse mapeamento de nome não altera o nome de nenhum outro objeto.
Partes de nome de origem e destino
Parte do nome | Origem | Objetivo |
---|---|---|
Banco de dados | mydb |
|
Esquema | myschema |
|
Relação | mytable |
|
Atributo | myfield |
field1 |
Tipo
attribute alias
Exemplo de entrada
SELECT myfield, name FROM mydb.myschema.mytable;
Exemplo de saída
SELECT field1, name FROM mydb.myschema.mytable;
Formato de arquivo JSON
Se você optar por especificar regras de mapeamento de nome usando um arquivo JSON em vez do console do Google Cloud, o arquivo JSON precisará seguir este formato:
{
"name_map": [
{
"source": {
"type": "string",
"database": "string",
"schema": "string",
"relation": "string",
"attribute": "string"
},
"target": {
"database": "string",
"schema": "string",
"relation": "string",
"attribute": "string"
}
}
]
}
O tamanho do arquivo precisa ser inferior a 5 MB.
Para mais informações sobre como especificar regras de mapeamento de nome para um job de tradução, consulte Enviar um job de tradução.
Exemplos JSON
Os exemplos a seguir mostram como especificar regras de mapeamento de nome usando arquivos JSON.
Exemplo 1
As regras de mapeamento de nome neste exemplo fazem as seguintes mudanças no nome do objeto:
- Renomeia as instâncias do objeto
project.dataset2.table2
relation
comobq_project.bq_dataset2.bq_table2
. - Renomeia todas as instâncias do objeto
project
database
parabq_project
. Por exemplo,project.mydataset.table2
se tornabq_project.mydataset.table2
eCREATE DATASET project.mydataset
se tornaCREATE 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"
}
}]
}
Exemplo 2
As regras de mapeamento de nome neste exemplo fazem as seguintes mudanças no nome do objeto:
- Renomeia as instâncias do objeto
attribute
project.dataset2.table2.field1
parabq_project.bq_dataset2.bq_table2.bq_field
nas instruções DDL e 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"
}
}]
}