SnowConvert: 名前の変更機能¶
データベースの移行プロセス中にオブジェクトの名前を変更することは、多くのユーザーが行う必要があることです。このため、 SnowConvert では、以下のタイプのユーザー定義オブジェクトに新しい名前を定義できる名前の変更機能を提供しています。
注釈
この機能は、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"
}
]
}
使用状況¶
名前の変更機能を使用するには、 SnowConvert の CLI バージョンに次の引数 --RenamingFile
を付けて実行し、名前の変更情報を含む.jsonファイルのパスを指定する必要があります。コマンドの例は次のようになります。
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_"プレフィックスを追加します。
名前の変更の優先順位¶
同じオブジェクトに適用される名前の変更があり、そのうちの1つだけが選択されるかもしれません。同じセクション内で、 SnowConvert は現在のオブジェクトの名前と一致する最初の名前の変更を適用し、そのオブジェクトの名前を変更しようとするのを止めます。そのため、以下の例では、 "Tables"
セクションで"Table1"を"Table1-a"と"Table1-b"に名前を変更するよう指定されているにもかかわらず、 SnowConvert は"Table1-a"にのみ名前を変更します。
"Tables": {
"Schema1.Table1": "Schema1.Table1-a",
"Schema1.Table1": "Schema1.Table1-b",
},
また、 SnowConvert は、正規表現セクションを試す前に、まずオブジェクトの名前の変更セクションをチェックしてオブジェクトの名前の変更を試みます。したがって、以下の例では、同じオブジェクト"Schema1.Table1"に両方の名前の変更が適用できるにもかかわらず、 "Tables"
セクションで定義された方だけが適用されます。
"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"に名前を変更されていることに注目してください