SnowConvert: 이름 바꾸기 기능

데이터베이스 마이그레이션 프로세스 중 오브젝트 이름 바꾸기은 많은 사용자가 필요로 하는 작업입니다. 따라서 SnowConvert 에서 이름 바꾸기 기능을 사용하면 다음 유형의 사용자 정의 오브젝트에 대해 새 이름을 정의할 수 있습니다.

참고

이 기능은 Teradata 및 Redshift ONLY 에서 지원됩니다.

  • 테이블

  • 구체화된 뷰

  • 프로시저

  • 함수

  • 매크로

참고

이름 바꾸기 기능은 오브젝트 정의와 오브젝트의 용도 모두에 적용됩니다.

이러한 오브젝트는 일반적으로 스키마 또는 데이터베이스 내에서 한정되므로 데이터베이스 플랫폼에 따라 Table1 오브젝트는 Table1, MySchema.Table1 또는 MyDatabase.MySchema.Table1 로 간단히 참조될 수 있습니다. 모호함을 피하기 위해 이름 바꾸기 파일에서 각 오브젝트를 완전히 지정하는 것이 필수 입니다.

새 오브젝트 이름은 다음 형식의 .json 파일을 통해 지정됩니다.

참고

이 예제에는 “Macros” 섹션이 포함되어 있고, 이는 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"
    }
  ]
}
Copy

사용법

이름 바꾸기 기능을 사용하려면 SnowConvert 의 CLI 버전을 --RenamingFile 인자와 함께 실행하고 이름 바꾸기 정보가 포함된 .json 파일의 경로를 제공해야 합니다. 명령의 예는 다음과 같습니다.

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

모드 이름 바꾸기

각 종류의 오브젝트에 대해 "Tables""TablesRegex", "Views""ViewsRegex" 등 2개의 필드가 있음을 알 수 있습니다. 이는 이름 바꾸기을 지정할 수 있는 두 가지 방법이 있기 때문입니다.

오브젝트별(라인별)

이 모드에서 각 라인은 오브젝트를 나타내며, 원래 정규화된 이름과 새 이름을 포함해야 합니다. 따라서 스키마 “OriginalSchema” 내부의 “Table1”이라는 오브젝트를 스키마 _”SchemaSF”_로 이동하려면 다음과 같이 라인을 작성해야 합니다.

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

또한 이름을 “Table2”로 변경하려면 다음과 같이 라인을 작성해야 합니다.

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

이 정보는 .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"
  },  
Copy

위의 샘플은 전체 워크로드에서 이름을 변경해야 하는 테이블은 “Table1”, “Table2”, “Table3”라는 3개뿐이며, 모두 “Schema1” 스키마 내에 위치한다는 것을 말하고 있습니다. 각각 “SF_Table1”, “SF_Table2” and “SF__Table3”,_로 이름을 변경해야 하며, 최종적으로는 Snowflake의 “SF_Schema1” 스키마 아래에 위치하게 됩니다.

정규식

여러 오브젝트의 이름을 같은 방식으로 변경해야 하는 경우, 이 기능을 사용하면 정규식으로 같은 종류의 오브젝트에 적용할 패턴을 정의할 수도 있습니다. 각 이름 변경을 지정하려면 두 줄이 필요하며, 첫 번째 줄은 일치하는 식인 "RegexExpr", 두 번째 줄은 바꾸는 식인 "RegexReplace" 입니다. 이 정보는 .json 파일의 "TablesRegex", "ViewsRegex", "ProceduresRegex", "MacrosRegex""FunctionsRegex" 섹션에 제공해야 합니다. 따라서 앞의 예제는 정규식 기능을 사용하여 다음과 같은 방식으로 작성할 수도 있습니다.

TableExample2

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

유일한 차이점은 이 방식이 “Schema1” 스키마 내에 위치한 모든 테이블에 적용된다는 점입니다. 이 정규식 식은 “Schema1” 스키마에 정의된 모든 테이블과 일치하며 점 뒤에 오는 모든 항목이 포함된 캡처 그룹을 생성합니다. 정규식 바꾸기는 테이블을 “SF_Schema1” 스키마로 이동하고 정규식 식에서 생성된 첫 번째 그룹($1)을 참조하는 모든 테이블에 “SF_” 접두사를 추가합니다.

우선순위 이름 바꾸기

동일한 오브젝트에 적용되는 이름 바꾸기이 있을 수 있으며 그 중 하나만 선택됩니다. 같은 섹션 내에서 SnowConvert 는 현재 오브젝트의 이름과 일치하는 첫 번째 이름 바꾸기를 적용하고 해당 오브젝트의 이름 바꾸기 시도를 중지합니다. 따라서 다음 예제에서 "Tables" 섹션에 “Table1”의 이름을 “Table1-a”로 바꾸고 “Table1-b”로도 바꾸도록 지정되어 있지만, SnowConvert 는 “Table1-a”로만 이름을 바꿉니다.

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

또한 SnowConvert 는 정규식 섹션을 시도하기 전에 먼저 오브젝트 이름 바꾸기 섹션을 통해 오브젝트 이름 바꾸기를 시도합니다. 따라서 다음 예제에서는 두 가지 이름 바꾸기이 모두 동일한 오브젝트 “Schema1.Table1”에 적용될 수 있음에도 불구하고 "Tables" 섹션에 정의된 이름 바꾸기만 적용됩니다.

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

다음과 같은 입력 코드가 있다고 가정해 보겠습니다.

Input Code

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

및 다음과 같은 이름 변경 정보

파일 이름 바꾸기(.JSON)

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

이는 이름 바꾸기이 있는 경우와 없는 경우의 출력 코드입니다.

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

“CLIENT”에 대한 모든 참조가 “USER “로 이름이 변경된 것을 확인합니다