Mapeie nomes de objetos SQL para tradução em lote
Este documento descreve como configurar o mapeamento de nomes para mudar o nome de objetos SQL durante a tradução em lote.
Vista geral
O mapeamento de nomes permite-lhe identificar os nomes dos objetos SQL nos seus ficheiros de origem e especificar nomes de destino para esses objetos no BigQuery. Pode usar alguns ou todos os seguintes componentes para configurar o mapeamento de nomes de um objeto:
- Uma regra de mapeamento de nomes, composta por:
- Partes do 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.
- Segmente partes do nome que fornecem o nome do objeto no BigQuery.
- Um nome de base de dados predefinida a usar com quaisquer objetos de origem que não especifiquem um.
- Um nome de esquema predefinido a usar com quaisquer objetos de origem que não especifiquem um.
Nome das peças
Fornece os valores para os nomes dos objetos de origem e de destino numa regra de mapeamento de nomes usando uma combinação das seguintes partes do nome:
- Base de dados: o nível superior da hierarquia de nomenclatura. A sua plataforma de origem pode usar um termo alternativo para isto, por exemplo, projeto.
- Esquema: o segundo nível da hierarquia de nomenclatura. A sua plataforma de origem pode usar um termo alternativo para isto, por exemplo, conjunto de dados.
- Relação: o terceiro nível da hierarquia de nomenclatura. A sua plataforma de origem pode usar um termo alternativo para isto, por exemplo, tabela.
- Atributo: o nível mais baixo da hierarquia de nomenclatura. A sua plataforma de origem pode usar um termo alternativo para isto, por exemplo, coluna.
Tipos de objetos
Também tem de especificar o tipo de objeto de origem que está a mudar o nome numa regra de mapeamento de nomes. São suportados os seguintes tipos de objetos:
Database
: um objeto de nível superior na hierarquia de objetos, por exemplo,database
.schema.relation.attribute
. A sua plataforma de origem pode usar um termo alternativo para isto, por exemplo, projeto. A especificação dedatabase
como o tipo de objeto altera todas as referências à string de origem nas declarações DDL e DML.Schema
: um objeto de segundo nível na hierarquia de objetos. A sua plataforma de origem pode usar um termo alternativo para isto, por exemplo, conjunto de dados. A especificação deschema
como o tipo de objeto altera todas as referências à string de origem nas declarações DDL e DML.Relation
: um objeto de terceiro nível na hierarquia de objetos. A sua plataforma de origem pode usar um termo alternativo para isto, por exemplo, tabela. A especificação derelation
como o tipo de objeto altera todas as referências à string de origem nas declaraçõ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. A especificação derelation alias
como o tipo de objeto cria alias para todas as referências à string de origem nas declarações DML. Por exemplo, setableA
for especificado como o nome de destino, os exemplos anteriores são traduzidos comoSELECT tableA.field1, tableA.field2 FROM myTable AS tableA;
eSELECT tableA.field1, tableA.field2 FROM schema1.table1 AS tableA
, respetivamente.Function
: um procedimento, por exemplo,create procedure db.test.function1(a int)
. A especificação defunction
como o tipo de objeto altera todas as referências à string de origem nas declarações DDL e DML.Attribute
: um objeto de quarto nível na hierarquia de objetos. A sua plataforma de origem pode usar um termo alternativo para isto, por exemplo, coluna. A especificação deattribute
como o tipo de objeto altera todas as referências à string de origem nas declaraçõ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 altera todas as referências à string de origem nas declarações DML.
Partes do nome obrigatórias para tipos de objetos
Para descrever um objeto numa regra de mapeamento de nomes, use as partes do nome identificadas para cada tipo de objeto na tabela seguinte:
Tipo | Nome do objeto de origem | Nome do objeto de destino | ||||||
---|---|---|---|---|---|---|---|---|
Parte do nome da base de dados | Parte do nome do esquema | Parte do nome da relação | Parte do nome do atributo | Parte do nome da base 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 |
Base de dados predefinida
Se quiser anexar um nome de projeto do BigQuery a todos os objetos traduzidos, a forma mais fácil de o fazer é especificar um nome de base de dados predefinido quando criar uma tarefa de tradução. Isto funciona para ficheiros de origem em que é usada a nomenclatura de três partes ou em que é usada a nomenclatura de quatro partes, mas o nome do objeto de nível mais elevado não está especificado.
Por exemplo, se especificar o nome da base de dados predefinido myproject
, uma declaração de origem como SELECT * FROM database.table
é traduzida para SELECT * FROM myproject.database.table
. Se tiver objetos que já usam uma parte do nome da base de dados, como SELECT * FROM database.schema.table
, tem de usar uma regra de mapeamento de nomes para mudar o nome de database.schema.table
para myproject.schema.table
.
Esquema predefinido
Se quiser qualificar totalmente todos os nomes de objetos nos ficheiros de origem que não usam a nomenclatura de quatro partes, pode fornecer um nome da base de dados predefinido e um nome do esquema predefinido quando criar uma tarefa de tradução. O nome do esquema predefinido é fornecido como o primeiro nome do esquema na opção de caminho de pesquisa do esquema.
Por exemplo, se especificar o nome da base de dados predefinido myproject
e o
nome do esquema predefinido myschema
, as seguintes declarações de origem:
SELECT * FROM database.table
SELECT * FROM table1
São traduzidas para:
SELECT * FROM myproject.database.table
.SELECT * FROM myproject.myschema.table1
Comportamento da regra de mapeamento de nomes
As secções seguintes descrevem o comportamento das regras de mapeamento de nomes.
A herança de regras flui na hierarquia de objetos
Uma alteração de nome que afeta um objeto de nível superior afeta o objeto de destino e também todos os respetivos objetos secundários na mesma hierarquia.
Por exemplo, se especificar a seguinte regra de mapeamento de nomes com um tipo de objeto de schema
:
Parte do nome | Fonte | Alvo |
---|---|---|
Bases de dados | sales_db |
sales |
Esquema | cust_mgmt |
cms |
Relação | ||
Atributo |
Quando é aplicado, os nomes das partes da base de dados e do esquema de todos os objetos relation
e attribute
no esquema sales_db.cust_mgmt
também são alterados. Por exemplo, um objeto relation
com o nome sales_db.cust_mgmt.history
torna-se sales.cms.history
.
Por outro lado, as alterações de nomes que têm como alvo objetos de nível inferior não afetam os objetos de nível superior ou do mesmo nível na hierarquia de objetos.
Por exemplo, se especificar a seguinte regra de mapeamento de nomes com um tipo de objeto de relation
:
Parte do nome | Fonte | Alvo |
---|---|---|
Bases de dados | sales_db |
sales |
Esquema | cust_mgmt |
cms |
Relação | clients |
accounts |
Atributo |
Quando é aplicado, o nome de nenhum outro objeto ao nível da hierarquia de objetos sales_db
ou sales_db.cust_mgmt
é alterado.
É aplicada a regra mais específica
Apenas uma regra de mapeamento de nomes é aplicada a um objeto. Se várias regras puderem afetar um único objeto, é aplicada a regra que afeta a parte do nome de nível mais baixo. Por exemplo, se uma regra de mapeamento de nomes de tipo database
e uma regra de mapeamento de nomes de tipo schema
puderem afetar o nome de um objeto relation
, é aplicada a regra de mapeamento de nomes de tipo schema
.
Use uma combinação única de valores de tipo e origem
Não pode especificar mais do que uma regra de mapeamento de nomes com o mesmo tipo e valores de origem. Por exemplo, não pode especificar as seguintes regras de mapeamento de nomes:
Regra 1, tipo attribute |
Regra 2, tipo attribute |
|||
---|---|---|---|---|
Parte do nome | Fonte | Alvo | Fonte | Alvo |
Bases de dados | project |
project |
||
Esquema | dataset1 |
dataset1 |
||
Relação | table1 |
table1 |
||
Atributo | lname |
last_name |
lname |
lastname |
Crie regras de mapeamento de nomes attribute
e attribute alias
correspondentes
Quando usa uma regra de mapeamento de nomes do tipo attribute
para alterar o nome de um atributo
em declarações DDL, tem de criar uma regra de mapeamento de nomes do tipo attribute alias
para
alterar também o nome desse atributo em declarações DML.
As alterações de nomes não são propagadas
As alterações de nomes não são aplicadas em cascata nas regras de nomes.
Por exemplo, se criou uma regra de mapeamento de nomes que muda o nome de database1
para project1
e outra que muda o nome de project1
para project2
, o tradutor não mapeia database1
para project2
.
Trate objetos de origem que não tenham nomes de quatro partes
Alguns sistemas de origem, como o Teradata, usam três partes do nome para qualificar totalmente os nomes dos objetos. Muitos sistemas de origem também permitem usar nomes parcialmente qualificados nos respetivos dialetos SQL, por exemplo, usar database1.schema1.table1
, schema1.table1
e table1
para se referir ao mesmo objeto em contextos diferentes. Se os seus ficheiros de origem contiverem objetos que não usam nomes de objetos de quatro partes, pode usar o mapeamento de nomes em combinação com a especificação de um nome da base de dados predefinido e um nome do esquema predefinido para conseguir o mapeamento de nomes que quer.
Para ver exemplos de utilização de regras de mapeamento de nomes com um nome da base de dados predefinido ou um nome do esquema predefinido, consulte os artigos Alterar a parte do nome da base de dados para objetos com vários níveis de conclusão de nomes e Alterar um nome de objeto de relação parcialmente qualificado.
Exemplos de mapeamento de nomes
Use os exemplos nesta secção para ver como funcionam as regras de mapeamento de nomes para exemplos de utilização comuns.
Altere a parte do nome da base de dados para objetos totalmente qualificados
O exemplo seguinte muda o nome da parte do nome da base de dados de td_project
para bq_project
para todos os objetos database
, schema
, relation
e function
que tenham nomes totalmente qualificados.
Partes dos nomes de origem e de destino
Parte do nome | Fonte | Alvo |
---|---|---|
Bases 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
Altere a parte do nome da base de dados para objetos com níveis variáveis de conclusão de nomes
O exemplo seguinte muda o nome da parte project
do nome da base de dados para bq_project
para todos os tipos de objetos e também adiciona bq_project
como a parte do nome da base de dados
para objetos que não especificam um.
Para tal, tem de especificar um valor predefinido da base de dados quando configurar a tarefa de tradução, além de especificar regras de mapeamento de nomes. Para mais informações sobre como especificar um nome de base de dados predefinido, consulte o artigo Envie uma tarefa de tradução.
Valor predefinido da base de dados
project
Partes dos nomes de origem e de destino
Parte do nome | Fonte | Alvo |
---|---|---|
Bases 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
Altere a parte do nome da base de dados e a parte do nome do esquema para objetos totalmente qualificados
O exemplo seguinte altera a parte do nome da base de dados warehouse1
para myproject
e também altera a parte do nome do esquema database1
para mydataset
.
Também pode alterar as partes de um nome de objeto relation
da mesma forma, usando um tipo relation
e especificando valores de origem e destino para a parte do nome da relação.
Partes dos nomes de origem e de destino
Parte do nome | Fonte | Alvo |
---|---|---|
Bases 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;
Altere um relation
nome de objeto totalmente qualificado
O exemplo seguinte muda o nome de mydb.myschema.mytable
para
mydb.myschema.table1
.
Partes dos nomes de origem e de destino
Parte do nome | Fonte | Alvo |
---|---|---|
Bases 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));
Altere um nome de objeto relation
parcialmente qualificado
O exemplo seguinte muda o nome de myschema.mytable
para
mydb.myschema.table1
.
Valor predefinido da base de dados
mydb
Partes dos nomes de origem e de destino
Parte do nome | Fonte | Alvo |
---|---|---|
Bases 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));
Altere o nome de um objeto relation alias
O exemplo seguinte muda o nome de todas as instâncias do objeto relation alias
table
para t
.
Partes dos nomes de origem e de destino
Parte do nome | Fonte | Alvo |
---|---|---|
Bases 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
Altere o nome de um objeto function
O exemplo seguinte muda o nome de mydb.myschema.myfunction
para
mydb.myschema.function1
.
Partes dos nomes de origem e de destino
Parte do nome | Fonte | Alvo |
---|---|---|
Bases 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);
Altere o nome de um objeto attribute
O exemplo seguinte muda o nome de mydb.myschema.mytable.myfield
para
mydb.myschema.mytable.field1
. Uma vez que os objetos attribute
estão no nível mais baixo da hierarquia de objetos, este mapeamento de nomes não altera o nome de nenhum outro objeto.
Partes dos nomes de origem e de destino
Parte do nome | Fonte | Alvo |
---|---|---|
Bases 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);
Altere o nome de um objeto attribute alias
O exemplo seguinte muda o nome de mydb.myschema.mytable.myfield
para
mydb.myschema.mytable.field1
. Uma vez que os objetos attribute alias
estão no nível mais baixo da hierarquia de objetos, esta associação de nomes não altera o nome de nenhum outro objeto.
Partes dos nomes de origem e de destino
Parte do nome | Fonte | Alvo |
---|---|---|
Bases 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 ficheiro JSON
Se optar por especificar regras de mapeamento de nomes através de um ficheiro JSON em vez da Google Cloud consola, o ficheiro JSON tem de 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 ficheiro tem de ser inferior a 5 MB.
Para mais informações sobre como especificar regras de mapeamento de nomes para uma tarefa de tradução, consulte o artigo Envie uma tarefa de tradução.
Exemplos JSON
Os exemplos seguintes mostram como especificar regras de mapeamento de nomes através de ficheiros JSON.
Exemplo 1
As regras de mapeamento de nomes neste exemplo fazem as seguintes alterações aos nomes dos objetos:
- Mude o nome das instâncias do objeto
project.dataset2.table2
relation
parabq_project.bq_dataset2.bq_table2
. - Muda o nome de todas as instâncias do objeto
project
database
parabq_project
. Por exemplo,project.mydataset.table2
passa abq_project.mydataset.table2
, eCREATE DATASET project.mydataset
passa aCREATE 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 nomes neste exemplo fazem as seguintes alterações aos nomes dos objetos:
- Mude o nome das instâncias do objeto
project.dataset2.table2.field1
attribute
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"
}
}]
}