SnowConvert AI - Renaming feature¶
Renaming objects during a database migration process is something that a lot of users need to do. For this reason, SnowConvert AI enables the Renaming feature to allow defining new names for the following types of user-defined objects:
Nota
Esse recurso é compatível com Teradata e Redshift ONLY.
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.
{
"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¶
In order to use the renaming feature you have to execute the CLI version of SnowConvert AI with the following argument --RenamingFile and provide the path to the .json file containing the renaming information. An example of the command can look like this:
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¶
There might be renamings that apply to the same object and only one of them is chosen. Within the same section, SnowConvert AI will apply the first renaming that matches the current object’s name, and it will stop trying to rename that object. So in the following example, despite the fact that "Tables" section specifies renaming «Table1» to «Table1-a» and also to «Table1-b», SnowConvert AI will only rename it to «Table1-a».
"Tables": {
"Schema1.Table1": "Schema1.Table1-a",
"Schema1.Table1": "Schema1.Table1-b",
},
Also, SnowConvert AI will try to rename an object first checking the object by object renaming section before trying the regular expressions section. So, in the following example despite the fact that both renamings can apply to the same object «Schema1.Table1», only the one defined in the "Tables" section is applied.
"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»