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:
注釈
この機能は、TeradataおよびRedshift ONLY でサポートされています。
テーブル
ビュー
マテリアライズドビュー
プロシージャ
関数
マクロ
注釈
名前の変更機能は、オブジェクト定義とオブジェクトの用途の両方に適用されます。
これらのオブジェクトは、通常、スキーマまたはデータベース内で修飾されます。そのため、データベースプラットフォームによっては、オブジェクト Table1
は、単に Table1
、 MySchema.Table1
、または MyDatabase.MySchema.Table1
として参照されることがあります。曖昧さを避けるために、名前を変更するファイルで各オブジェクトを完全に修飾することは、 必須 です。
新しいオブジェクト名は、以下の形式の.jsonファイルで指定します。
注釈
この例は、「マクロ」セクションを含んでいることに注意してください。これは、 Teradata 固有の要素であり、指定された言語によって異なる場合があります。
{
"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"
}
]
}
使用状況¶
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"
モードの名前の変更¶
オブジェクトの種類ごとに2つのフィールドがあることに注意してください: "Tables"
と "TablesRegex"
, "Views"
と "ViewsRegex"
など。これは、名前の変更を指定する方法が2つあるためです。
オブジェクトごと(行ごと)¶
このモードでは、各行はオブジェクトを表し、元の完全修飾名と新しい名前を含む必要があります。つまり、スキーマ "OriginalSchema" の中にある"Table1"というオブジェクトをスキーマ "SchemaSF" に移動させたい場合、その行は次のようにしなければなりません。
"OriginalSchema.Table1": "SchemaSF.Table1"
"Table2"に名前を変更する場合は、その行は次のようにしなければなりません。
"OriginalSchema.Table1": "SchemaSF.Table2"
この情報は、.jsonファイルの "Tables"
、 "Views"
、 "Procedures"
、 "Macros"
および "Functions"
セクションで指定する必要があり、各行はコンマで区切る必要があります。例を見てみましょう。
TableExample1
"Tables": {
"Schema1.Table1": "SF_Schema1.SF_Table1",
"Schema1.Table2": "SF_Schema1.SF_Table2",
"Schema1.Table3": "SF_Schema1.SF_Table3"
},
上記のサンプルは、ワークロード全体の中で、"Table1"、"Table2"、"Table3"と呼ばれる、スキーマ"Schema1"内にある3つのテーブルの名前のみを変更することを意味しています。これらはそれぞれ、"SF_Table1"、"SF_Table2" および "SF_Table3", に名前を変更され、最終的にSnowflakeの "SF_Schema1"スキーマの下に配置されます。
正規表現¶
複数のオブジェクトの名前を同じように変更する必要がある場合、正規表現で同じ種類のオブジェクトに適用するパターンを定義することもできます。各名前の変更の指定には2行が必要で、1行目は "RegexExpr"
がマッチ式、2行目は "RegexReplace"
が置換式です。この情報は、.jsonファイルの "TablesRegex"
、 "ViewsRegex"
、 "ProceduresRegex"
、 "MacrosRegex"
および "FunctionsRegex"
セクションで提供されなければなりません。つまり、先の例は正規表現機能を用いて次のように書くこともできます。
TableExample2
"TablesRegex": [
{
"RegexExpr": "Schema1\\.(.*)",
"RegexReplace": "SF_Schema1.SF_$1"
}
],
唯一の違いは、この方法は"Schema1"スキーマ内にあるすべてのテーブルに適用されるということです。この正規表現は、"Schema1"スキーマ内で定義されたすべてのテーブルにマッチし、ドット以降のすべてのテーブルを含むキャプチャグループを作成します。正規表現による置換は、テーブルを"SF_Schema1"スキーマに移動し、正規表現で最初に作成されたグループ($1)を参照する全てのテーブルに"SF_"プレフィックスを追加します。
名前の変更の優先順位¶
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"
}
],
例¶
次のような入力コードがあるとします。
入力コード
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;
そして以下の名前変更情報があります
ファイルの名前の変更(.JSON)
{
"Tables": {
"CLIENT": "USER"
}
}
これは、名前を変更した場合としなかった場合の出力コードです。
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;
"CLIENT"への参照がすべて"USER"に名前を変更されていることに注目してください