SnowConvert AI - Recurso de renomeação¶
Renomear objetos durante um processo de migração de banco de dados é algo que muitos usuários precisam fazer. Por esse motivo, o SnowConvert AI habilita o recurso de renomeação para permitir a definição de novos nomes para os seguintes tipos de objetos definidos pelo usuário:
Nota
Este recurso é compatível com Teradata, SQL Server e RedShift ONLY.
Esquemas
Tabelas
Exibições
Exibições materializadas
Procedimentos
Funções
Macros
Nota
O recurso de renomeação será aplicado à definição do objeto e aos usos do objeto.
Esses objetos geralmente são qualificados em um esquema ou em um banco de dados, portanto, dependendo da plataforma do banco de dados, o objeto Table1 pode ser referenciado simplesmente como Table1, como MySchema.Table1 ou como MyDatabase.MySchema.Table1. É essencial qualificar totalmente cada objeto no arquivo de renomeação para evitar ambiguidade.
Os novos nomes de objetos são especificados por meio de um arquivo .json com o seguinte formato.
Nota
Observe que este exemplo contém uma seção «Macros», que é um elemento específico do Teradata e pode variar dependendo da linguagem especificada.
{
"Schemas": {
"SchemaName": "NewSchema"
},
"Tables": {
"SchemaName.TableName": "NewSchema.TableNameChanged",
"Table1": "Table2"
},
"TablesRegex": [
{
"RegexExpr": "(Schema1)\\.(.*)",
"RegexReplace": "Prefix_$1.$2"
}
],
"Views": {
"ViewName": "ViewNameChanged",
"MaterializedViewName": "MaterializedViewNameChanged",
},
"ViewsRegex": [
{
"RegexExpr": "(Schema1)\\.(.*)",
"RegexReplace": "$2.$1"
}
],
"Procedures": {
"ProcedureName": "ProcedureNameChanged"
},
"ProceduresRegex": [
{
"RegexExpr": "(Schema1)\\.(.*)",
"RegexReplace": "$2.$1"
}
],
"Macros": {
"SchemaName.MacroName": "MacroNameChanged",
"SimpleMacro": "SimpleMacroSf"
},
"MacrosRegex": [
{
"RegexExpr": "(Schema1)\\.(.*)",
"RegexReplace": "$2.$1"
}
],
"Functions": {
"SchemaName.FunctionName": "FunctionNameChanged",
"SimpleFunction": "SimpleFunctionSf"
},
"FunctionsRegex": [
{
"RegexExpr": "(Schema1)\\.(.*)",
"RegexReplace": "$2.$1"
}
]
}
Uso¶
Para usar o recurso de renomeação, você deve executar a versão CLI do SnowConvert AI com o seguinte argumento --RenamingFile e fornecer o caminho para o arquivo .json contendo as informações de renomeação. Um exemplo do comando pode ser parecido com este:
snowct.exe -i «somePath/input» -o «somePath/output» –RenamingFile «somePath/renamings.json»
Modos de renomeação¶
Observe que há dois campos para cada tipo de objeto: "Tables" e "TablesRegex", "Views" e "ViewsRegex", e assim por diante. Isso ocorre porque há duas maneiras de especificar as renomeações.
Objeto por objeto (linha por linha)¶
Nesse modo, cada linha representa um objeto e deve conter o nome original totalmente qualificado e o novo nome. Portanto, se quisermos mover um objeto chamado «Table1» dentro do esquema «OriginalSchema» para o esquema «SchemaSF», a linha deverá ser a seguinte:
"OriginalSchema.Table1": "SchemaSF.Table1"
Se também quisermos renomeá-la para «Table2», a linha deverá ser a seguinte:
"OriginalSchema.Table1": "SchemaSF.Table2"
Essas informações devem ser especificadas nas seções "Tables", _ "Views", _ "Procedures"_, _ "Macros" e "Functions" do arquivo .json e cada linha deve ser separada por vírgula. Vamos dar uma olhada em um exemplo:
TableExample1
"Tables": {
"Schema1.Table1": "SF_Schema1.SF_Table1",
"Schema1.Table2": "SF_Schema1.SF_Table2",
"Schema1.Table3": "SF_Schema1.SF_Table3"
},
O exemplo acima diz que as únicas três tabelas em toda a carga de trabalho a serem renomeadas são as chamadas «Table1», «Table2» e «Table3», todas localizadas dentro do esquema «Schema1»; elas devem ser renomeadas para «_SF\Table1», «SF_Table2» e «SF_Table3», respectivamente; e, por fim, elas estarão localizadas no esquema «SF_Schema1» no Snowflake.
Expressões regulares¶
Se houver necessidade de renomear vários objetos da mesma forma, o recurso também permite que expressões regulares definam padrões a serem aplicados a objetos do mesmo tipo. São necessárias duas linhas para especificar cada renomeação, a primeira linha é "RegexExpr", que é a expressão de correspondência, e a segunda linha é "RegexReplace", que é a expressão de substituição. Essas informações devem ser fornecidas nas seções "TablesRegex", "ViewsRegex", "ProceduresRegex", "MacrosRegex" e "FunctionsRegex" do arquivo .json. Portanto, o exemplo anterior também pode ser escrito da seguinte maneira, usando o recurso de expressão regular.
TableExample2
"TablesRegex": [
{
"RegexExpr": "Schema1\\.(.*)",
"RegexReplace": "SF_Schema1.SF_$1"
}
],
A única diferença é que essa forma se aplica a todas as tabelas localizadas no esquema «Schema1». A expressão regex corresponderia a todas as tabelas definidas no esquema «Schema1» e criaria um grupo de captura com tudo o que estiver após o ponto. A substituição de regex moverá as tabelas para o esquema «SF_Schema1» e adicionará o prefixo «SF_» a todas as tabelas encontradas fazendo referência ao primeiro grupo criado ($1) na expressão regex.
Renomear a prioridade¶
Pode haver renomeações que se aplicam ao mesmo objeto e apenas uma delas é escolhida. Na mesma seção, o SnowConvert AI aplicará a primeira renomeação que corresponde ao nome do objeto atual e deixará de tentar renomear esse objeto. Portanto, no exemplo a seguir, apesar de a seção "Tabelas" especificar a renomeação de «Table1» como «Table1-a» e também para «Table1-b», o SnowConvert AI só a renomeará como «Table1-a».
"Tables": {
"Schema1.Table1": "Schema1.Table1-a",
"Schema1.Table1": "Schema1.Table1-b",
},
Além disso, o SnowConvert AI tentará renomear um objeto primeiro verificando-o pela seção de renomeação de objeto antes de tentar a seção de expressões regulares. Assim, no exemplo a seguir, apesar de ambas as renomeações poderem ser aplicadas ao mesmo objeto «Schema1.Table1», apenas a que está definida na seção "Tabelas" é aplicada.
"Tables": {
"Schema1.Table1": "Schema1.TableA",
},
"TablesRegex": [
{
"RegexExpr": "Schema1\\.(.*)",
"RegexReplace": "Schema1.SF_$1"
}
],
Exemplo¶
Digamos que temos o seguinte código de entrada.
Código de entrada
CREATE TABLE CLIENT (
ID INTEGER,
NAME varchar(20));
CREATE TABLE TICKET (
CLIENT_ID INTEGER,
FOREIGN KEY (CLIENT_ID_FK) REFERENCES CLIENT(ID));
SELECT * FROM CLIENT;
E as seguintes informações de renomeação
Renomeando o arquivo (.JSON)
{
"Tables": {
"CLIENT": "USER"
}
}
Esse seria o código de saída com e sem renomeação.
Código de saída do Snowflake¶
CREATE OR REPLACE TABLE CLIENT (
ID INTEGER,
NAME varchar(20))
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "11/13/2024", "domain": "test" }}'
;
CREATE OR REPLACE TABLE TICKET (
CLIENT_ID INTEGER,
FOREIGN KEY (CLIENT_ID_FK) REFERENCES CLIENT (ID))
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "11/13/2024", "domain": "test" }}'
;
SELECT
* FROM
CLIENT;
CREATE OR REPLACE TABLE USER (
ID INTEGER,
NAME varchar(20))
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "11/13/2024", "domain": "test" }}'
;
CREATE OR REPLACE TABLE TICKET (
CLIENT_ID INTEGER,
FOREIGN KEY (CLIENT_ID_FK) REFERENCES USER (ID))
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "11/13/2024", "domain": "test" }}'
;
SELECT
* FROM
USER;
Observe como todas as referências a «CLIENT» foram renomeadas para «USER»