SnowConvert: Umbenennungsfeature

Das Umbenennen von Objekten während einer Datenbankmigration ist etwas, das viele Benutzer tun müssen. Aus diesem Grund bietet SnowConvert das Umbenennungsfeature, mit dem Sie neue Namen für die folgenden Typen von benutzerdefinierten Objekten definieren können:

Bemerkung

Dieses Feature wird NUR für Teradata und Redshift unterstützt.

  • Tabellen

  • Ansichten

  • Materialisierte Ansichten

  • Prozeduren

  • Funktionen

  • Makros

Bemerkung

Das Umbenennungsfeature gilt sowohl für die Objektdefinition als auch für die Verwendung des Objekts.

Diese Objekte werden normalerweise innerhalb eines Schemas oder einer Datenbank qualifiziert, sodass je nach Datenbankplattform das Objekt Table1 einfach als Table1, als MySchema.Table1 oder als MyDatabase.MySchema.Table1 referenziert werden kann. Es ist wichtig, jedes Objekt in der Umbenennungsdatei vollständig zu qualifizieren, um Mehrdeutigkeit zu vermeiden.

Die neuen Objektnamen werden über eine .json-Datei mit dem folgenden Format angegeben.

Bemerkung

Beachten Sie, dass dieses Beispiel einen Abschnitt „Macros“ enthält. Dies ist ein Teradata-spezifisches Element und kann je nach der angegebenen Sprache variieren.

{
  "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"
    }
  ]
}
Copy

Verwendung

Um das Umbenennungsfeature zu nutzen, müssen Sie die CLI-Version von SnowConvert mit dem Argument --RenamingFile ausführen und den Pfad zu der .json-Datei angeben, die die Umbenennungsinformationen enthält. Ein Beispiel für den Befehl kann wie folgt aussehen:

snowct.exe -i „somePath/input“ -o „somePath/output“ –RenamingFile „somePath/renamings.json“

Umbenennungsmodi

Beachten Sie, dass es zwei Felder für jeden Typ von Objekt gibt: "Tables" und "TablesRegex", "Views" und "ViewsRegex" usw. Es gibt nämlich zwei Möglichkeiten, wie Umbenennungen angegeben werden können.

Objekt für Objekt (Zeile für Zeile)

In diesem Modus steht jede Zeile für ein Objekt und muss den ursprünglichen vollqualifizierten Namen und den neuen Namen enthalten. Wenn wir also ein Objekt namens „Table1“ innerhalb des Schemas „OriginalSchema“ in das Schema „SchemaSF“ verschieben möchten, muss die Zeile wie folgt aussehen:

"OriginalSchema.Table1": "SchemaSF.Table1"
Copy

Wenn wir sie zudem in „Table2“ umbenennen wollen, sollte die Zeile so aussehen:

"OriginalSchema.Table1": "SchemaSF.Table2"
Copy

Diese Informationen müssen in den Abschnitten „Tables“, _ „Views", _ „Procedures“_, _ „Macros“ und „Functions“ der .json-Datei angegeben werden, und jede Zeile muss mit einem Komma getrennt werden. Schauen wir uns ein Beispiel an:

TableExample1

"Tables": {
    "Schema1.Table1": "SF_Schema1.SF_Table1",
    "Schema1.Table2": "SF_Schema1.SF_Table2",
    "Schema1.Table3": "SF_Schema1.SF_Table3"
  },  
Copy

Das obige Beispiel besagt, dass die einzigen drei Tabellen in der gesamten Workload, die umbenannt werden müssen, die Tabellen Table1, Table2 und Table3 sind, die sich alle innerhalb des Schemas „Schema1“ befinden; sie müssen in SF_Table1, SF__Table2 und SF_Table3 umbenannt werden und befinden sich schließlich unter dem Schema SF_Schema1 in Snowflake.

Reguläre Ausdrücke

Wenn mehrere Objekte auf die gleiche Weise umbenannt werden müssen, ermöglicht das Feature auch die Definition von Mustern mit regulären Ausdrücken, die auf Objekte der gleichen Art angewendet werden können. Für jede Umbenennung sind zwei Zeilen erforderlich. Die erste Zeile ist "RegexExpr", der übereinstimmende Ausdruck, und die zweite Zeile ist "RegexReplace", der ersetzende Ausdruck. Diese Informationen müssen in den Abschnitten "TablesRegex", _ "ViewsRegex", _ "ProceduresRegex"_, _ "MacrosRegex" und "FunctionsRegex" der .json-Datei angegeben werden. Das vorherige Beispiel kann also auch auf folgende Weise geschrieben werden, indem Sie das Regex-Feature verwenden.

TableExample2

"TablesRegex": [
    {
      "RegexExpr": "Schema1\\.(.*)",
      "RegexReplace": "SF_Schema1.SF_$1"
    }
  ],
Copy

Der einzige Unterschied besteht darin, dass dieses Verfahren auf alle Tabellen im Schema „Schema1“ angewendet wird. Der Regex-Ausdruck vergleicht alle Tabellen, die im Schema „Schema1“ definiert sind, und erstellt eine Erfassungsgruppe, die alle Elemente nach dem Punkt enthält. Die Regex-Ersetzung verschiebt die Tabellen in das Schema „SF_Schema1“ und fügt das Präfix „SF_“ zu allen gefundenen Tabellen hinzu, die die erste erstellte Gruppe ($1) im Regex-Ausdruck referenzieren.

Umbenennungspriorität

Es kann mehrere Umbenennungen geben, die für dasselbe Objekt gelten, und nur eine davon wird ausgewählt. SnowConvert wendet innerhalb desselben Abschnitts die erste Umbenennung an, die mit dem Namen des aktuellen Objekts übereinstimmt, und versucht nicht weiter, dieses Objekt umzubenennen. Im folgenden Beispiel wird also trotz der Tatsache, dass im Abschnitt "Tables" die Umbenennung von „Table1“ in „Table1-a“ und in „Table1-b“ festgelegt ist, SnowConvert die Tabelle nur in „Table1-a“ umbenennt.

"Tables": {
    "Schema1.Table1": "Schema1.Table1-a",
    "Schema1.Table1": "Schema1.Table1-b",
  }, 
Copy

Außerdem versucht SnowConvert, ein Objekt umzubenennen, indem es zuerst den Abschnitt für die Umbenennung von Objekt nach Objekt überprüft, bevor es den Abschnitt für reguläre Ausdrücke verwendet. So wird im folgenden Beispiel trotz der Tatsache, dass beide Umbenennungen für dasselbe Objekt „Schema1.Table1“ gelten können, nur die im Abschnitt "Tables" definierte angewendet.

"Tables": {
    "Schema1.Table1": "Schema1.TableA",
  }, 
  "TablesRegex": [
    {
      "RegexExpr": "Schema1\\.(.*)",
      "RegexReplace": "Schema1.SF_$1"
    }
  ],
Copy

Beispiel

Nehmen wir an, wir haben den folgenden Eingabecode.

Eingabecode

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;
Copy

Und die folgenden Umbenennungsinformationen

Umbenennungsdatei (.JSON)

{
  "Tables": {
    "CLIENT": "USER"
  }
}
Copy

Dies wäre der Ausgabecode mit und ohne Umbenennung.

Snowflake-Ausgabecode

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;
Copy
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;
Copy

Beachten Sie, dass alle Referenzen auf „CLIENT“ in „USER“ umbenannt werden.