SnowConvert AI - 최상위 코드 단위 보고서¶
최상위 코드 단위란 무엇인가요?¶
코드 유닛은 이름에서 알 수 있듯이 가장 원자적인 독립 실행형 실행 요소입니다. 대부분의 경우 문이지만 단일 요소로 실행되기 때문에 스크립트 파일도 포함될 수 있습니다.
일부 코드 단위는 다른 코드 단위 안에 중첩될 수 있습니다. 단위 계층 구조에서 그 위에 다른 코드 단위가 없는 경우 이를 최상위 코드 단위라고 합니다.
범위를 벗어난 코드 단위란 무엇인가요?¶
범위를 벗어나는 최상위 코드 단위는 SnowConvert AI의 변환 범위를 벗어나는 코드 단위입니다. 이 때문에 변환율을 계산할 때 이러한 코드 단위는 고려되지 않습니다. 이러한 각 코드 단위에는 변환율이 없습니다(N/A로 표시됨).
입력 코드에 범위를 벗어난 코드 단위만 포함된 경우 전체 마이그레이션의 코드 라인 변환율은 0%가 됩니다.
다음 CREATE TRIGGER 는 범위를 벗어난 코드 단위로 간주됩니다.
CREATE OR REPLACE TRIGGER my_trigger
AFTER
UPDATE
ON my_table
FOR EACH ROW
BEGIN
NULL;
END;
최상위 코드 단위의 예¶
다음 섹션에서는 최상위 코드 단위의 몇 가지 예를 살펴볼 수 있습니다.
쿼리¶
다음 예제에서는 SELECT 문을 하나만 사용합니다. 이 문은 단일 최상위 코드 단위입니다.
SELECT * FROM table1;
이 예제에서는 SELECT 문이 다른 SELECT 문 내에 중첩되어 있습니다. 전체 쿼리는 1개의 최상위 코드 단위로 계산됩니다.
SELECT * FROM (SELECT * FROM table1);
오브젝트¶
DDL 로 생성된 오브젝트는 그 안에 다른 코드 유닛이 포함되어 있더라도 1개의 최상위 코드 유닛으로 간주합니다.
다음 문은 쿼리가 있는 뷰를 생성합니다. 이 경우 CREATE VIEW 전체가 1개의 최상위 코드 단위로 계산됩니다.
CREATE VIEW view1 AS SELECT * FROM table1;
다음 CREATE PROCEDURE 문은 내부에 여러 문이 포함되어 있어도 1개의 최상위 코드 단위로 계산됩니다.
CREATE PROCEDURE procedure1
AS
BEGIN
DELETE FROM table1;
END;
명령¶
SQL 파일의 독립적인 명령은 최상위 코드 단위로 간주됩니다.
COMMIT 문은 단일 최상위 코드 단위로 계산됩니다.
COMMIT;
Oracle의 패키지 본문¶
패키지는 본문 내에 여러 요소를 정의할 수 있습니다. 패키지 본문을 최상위 코드 단위로 간주하는 이유는 전체 패키지 본문을 생성하지 않고는 이러한 요소를 개별적으로 생성할 수 없기 때문입니다. 패키지 본문 내의 요소 또는 코드 단위는 최상위 코드 단위로 계산되지 않습니다.
다음 코드는 단일 CREATE PACKAGE BODY 코드 단위로 보고됩니다.
CREATE PACKAGE package_body1 IS
FUNCTION function1
RETURN VARCHAR
IS
BEGIN
RETURN 'HELLO'';
END;
END;
Teradata 스크립트 파일¶
BTEQ 또는 TPUMP 같은 Teradata 스크립트 파일은 독립 실행형 코드 단위로 실행됩니다. 이 때문에 전체 파일은 1개의 최상위 코드 단위로 간주됩니다. 이 파일 내의 다른 가능한 코드 단위는 최상위 코드 단위로 계산되지 않습니다.
다음 BTEQ 스크립트 파일은 1개의 BTEQ 최상위 코드 단위로 보고됩니다.
.LOGON e/fml,notebook
.COMPILE FILE = example.spl;
COMMIT;
CALL samplesp1 (8888, pAmount);
.LOGOFF
GOTO 가 있는 Transact SQL 배치¶
Transact-SQL 의 각 문은 독립적으로 실행할 수 있습니다. 대부분의 경우 이러한 각 문은 최상위 코드 단위로 간주됩니다. 그러나 동일한 배치 내에 레이블에 GOTO 문이 포함된 배치가 있는 경우 배치의 문이 올바르게 작동하는지 확인하지 않고는 배치의 문을 독립적으로 실행할 수 없습니다. 따라서 GOTO 문과 함께 배치에 포함된 문은 최상위 코드 단위로 계산되지 않고 배치만 계산됩니다.
다음 코드 예제는 단일 GOTO/LABEL 코드 단위로 보고됩니다.
DECLARE @Counter int;
SET @Counter = 1;
WHILE @Counter < 10
BEGIN
SELECT @Counter
SET @Counter = @Counter + 1
IF @Counter = 4 GOTO Branch_One
IF @Counter = 5 GOTO Branch_Two
END
Branch_One:
SELECT 'Jumping To Branch One.'
GOTO Branch_Three;
Branch_Two:
SELECT 'Jumping To Branch Two.'
Branch_Three:
SELECT 'Jumping To Branch Three.';
GO
코드 단위 방법론은 다른 보고서에서 어떻게 표현되나요?¶
코드 단위 방법론은 다른 보고서에도 적용됩니다. 이 섹션에서는 이러한 값이 표시되는 방식 또는 다른 보고서와 관련된 내용을 설명합니다.
이슈 보고서¶
문제 보고서의 각 행에는 문제의 영향을 받는 코드 단위에 대한 몇 가지 정보가 있습니다. 코드 단위와 관련된 열은 다음과 같습니다.
코드 단위 데이터베이스: 문제가 발견된 최상위 코드 단위의 데이터베이스입니다. 오브젝트인 코드 단위에만 적용됩니다.
코드 단위 스키마: 문제가 발견된 최상위 코드 단위의 스키마입니다. 오브젝트인 코드 단위에만 적용됩니다.
코드 단위 패키지: 문제가 발견된 최상위 코드 단위의 패키지입니다. 오브젝트인 코드 단위에만 적용됩니다.
코드 단위 이름: 문제가 발견된 최상위 코드 단위의 이름입니다. 오브젝트와 같이 이름이 지정된 코드 단위에만 적용됩니다. 이 이름은 데이터베이스, 스키마 또는 패키지별로 한정되지 않습니다.
코드 단위 ID: 문제가 발견된 최상위 코드 단위의 ID 입니다. 이 이름은 정규화된 이름을 가지며 이름이 반복되는 코드 단위에는 숫자를 추가합니다.
코드 단위: 문제가 발견된 최상위 코드 단위의 유형입니다.
코드 단위 크기: 문제가 발견된 최상위 코드 단위의 크기입니다.
오브젝트 참조 보고서 및 누락된 오브젝트 보고서¶
오브젝트 참조 보고서의 각 행에는 다른 요소를 참조한 최상위 코드 단위에 대한 정보가 있습니다. 이러한 참조 요소는 최상위 레벨이 아닐 수 있으므로 다른 값은 최상위 코드 단위 보고서에 포함되지 않을 수 있습니다.
오브젝트 참조 보고서와 마찬가지로 누락된 오브젝트 보고서에는 코드에서 찾을 수 없는 요소를 참조한 최상위 코드 단위에 대한 정보가 있습니다.
호출자 코드 단위: 다른 요소를 참조하는 최상위 코드 단위의 유형입니다.
호출자 코드 단위 데이터베이스: 다른 요소를 참조하는 최상위 코드 단위의 데이터베이스입니다.
호출자 코드 단위 스키마: 다른 요소를 참조하는 최상위 코드 단위의 스키마입니다.
호출자 코드 단위 이름: 다른 요소를 참조하는 최상위 코드 단위의 이름입니다.
호출자 코드 단위 전체 이름: 다른 요소를 참조하는 최상위 코드 단위의 전체 이름입니다.
최상위 코드 단위 보고서의 정보¶
열 |
설명 |
|---|---|
파티션 키 |
변환의 고유 식별자입니다. |
파일 타입 |
코드 단위가 들어 있는 파일의 유형입니다. (SQL, BTEQ 등…) |
카테고리 |
각 코드 단위가 속하는 더 넓은 클래스 또는 유형입니다. |
코드 단위 |
이 요소가 속한 코드 단위의 유형입니다. |
소스 데이터베이스 |
소스 코드 단위가 있는 데이터베이스입니다. |
소스 스키마 |
소스 코드 단위가 있는 스키마입니다. |
소스 이름 |
소스 시스템에 표시되는 소스 코드 단위의 원래 이름입니다. |
코드 단위 ID |
이름이 반복되는 코드 단위에 대해 정규화된 이름 및 번호가 지정된 코드 단위의 고유 식별자입니다. |
파일 이름 |
오브젝트가 위치한 파일의 이름입니다. 입력 디렉터리에서 시작하는 상대 경로를 사용합니다. |
라인 번호 |
코드 단위가 위치한 파일 내부의 라인 번호입니다. |
Lines of Code |
코드 단위가 가지고 있는 총 코드 라인 수입니다. |
EWI 카운트 |
코드 단위 내에서 발견되는 EWIs 의 수량입니다. EWIs 에 대한 자세한 내용은 durl에서 알아볼 수 있습니다. |
FDM 카운트 |
코드 단위 내에서 발견되는 FDMs 의 수량입니다. FDMs 에 대한 자세한 내용은 여기에서 알아볼 수 있습니다. |
PRF 카운트 |
코드 단위 내에서 발견되는 PRFs의 수량입니다. PRFs에 대한 자세한 내용은 여기에서 확인할 수 있습니다. |
최고 EWI 심각도 |
<p>코드 단위 내에서 발견된 가장 높은 EWI 심각도입니다.<br>심각도 순서는 다음과 같습니다.</p><ul><li>N/A (EWIs 없음)</li><li>Low</li><li>Medium</li><li>High</li><li>Critical</li></ul> |
UDFs 사용됨 |
코드 단위 내에 있는 모든 사용자 정의 함수의 이름입니다. UDFs 의 이름이 2개 이상인 경우 파이프로 구분합니다. |
EWI |
코드 단위 내에 있는 모든 EWIs 의 코드입니다. 이러한 코드는 파이프로 구분되며 반복되는 코드는 포함되지 않습니다. |
FDM |
코드 단위 내에 있는 모든 FDMs 의 코드입니다. 이러한 코드는 파이프로 구분되며 반복되는 코드는 포함되지 않습니다. |
PRF |
코드 단위 내에 있는 모든 PRFs 의 코드입니다. 이러한 코드는 파이프로 구분되며 반복되는 코드는 포함되지 않습니다. |
변환 상태 |
<p>코드 단위의 최종 변환 상태입니다.</p><p>가능한 변환 상태는 다음과 같습니다.</p><ul><li>NotSupported: 코드 단위의 변환률이 0%인 경우.</li><li>Partial: 코드 단위의 변환율이 0%에서 100% 사이인 경우.</li><li>Success: 코드 단위 변환율이 100%인 경우.</li></ul> |
LoC 변환 비율 |
변환 비율은 코드 라인을 기준으로 합니다. 입력 코드의 형식에 따라 한 라인의 코드에도 지원되는 조각과 지원되지 않는 조각이 있을 수 있습니다. 이러한 경우 전체 라인이 지원되지 않는 것으로 간주됩니다. |
배포 순서 |
배포 순서는 해당 종속성을 기반으로 하는 각 코드 단위의 토폴로지 수준입니다. 배포 단계에서 종속성이 누락되지 않도록 코드 단위를 배포해야 하는 올바른 순서를 보여줍니다. |
언어 |
프로그래밍 언어 또는 소스 코드 단위의 SQL 언어입니다. |
예¶
ORACLE SQL 의 다음 CREATE TABLE 이 table_example.sql이라는 파일에 위치한다고 가정합니다.
CREATE TABLE my_table (
my_column DATE DEFAULT TO_DATE(CURRENT_DATE, 'J'),
NOT A VALID COLUMN
);
CREATE OR REPLACE TABLE my_table (
my_column TIMESTAMP /*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/ DEFAULT PUBLIC.JULIAN_TO_GREGORIAN_DATE_UDF(CURRENT_DATE(), 'J')
-- ,
-- ** SSC-EWI-0001 - UNRECOGNIZED TOKEN ON LINE '3' COLUMN '3' OF THE SOURCE CODE STARTING AT 'NOT'. EXPECTED 'Column Definition' GRAMMAR. LAST MATCHING TOKEN WAS ',' ON LINE '2' COLUMN '52'. FAILED TOKEN WAS 'NOT' ON LINE '3' COLUMN '3'. CODE '15'. **
-- NOT A VALID COLUMN
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
;
최상위 코드 단위 보고서에는 이전에 표시된 테이블의 단일 항목이 포함됩니다.
다음은 CREATE TABLE 문의 항목에 보고되는 모든 값입니다.
파티션 키 값은 마이그레이션에 따라 달라지므로 여기 값은 달라질 수 있습니다.
파일 형식 은 확장자가 .sql인 파일에서 마이그레이션되었으므로 SQL 이 됩니다.
CREATE TABLE문은 TABLE 코드 단위 카테고리의 일부이므로 카테고리 는 TABLE 이 됩니다.코드 단위 자체는
CREATE TABLE입니다.이 코드 단위가 발견된 파일 이름 은 테이블_example.sql입니다.
CREATE TABLE문이 파일 시작 부분에 있다고 가정하면 라인 번호 는 1이 됩니다.코드의 라인 번호는 4입니다.
EWI Count 열은 출력 코드에 구문 분석 EWI 가 1개 있기 때문에 1을 보고합니다.
출력 코드에 데이터 타입과 관련된 FDM 문제가 있기 때문에 FDM Count 열은 1을 보고합니다.
출력 코드에 PRF 문제가 없으므로 PRF Count 는 0을 보고합니다.
이 경우 최고 EWI 심각도 는 예제 EWI 의 구문 분석 심각도이므로 “Critical”이 됩니다. 다른 하나는 심각도가 “Low입니다.
입력 코드의
TO_DATE함수를 변환하기 위해 이 사용자 정의 함수가 추가되었으므로 UDFs Used 열은JULIAN_TO_GREGORIAN_DATE_UDF가 됩니다.EWI 열은 출력 코드에 추가된 EWIs 중 하나이므로 “SSC-EWI-0001”을 보고합니다.
FDM 열은 출력 코드에 추가된 FDMs 중 하나이므로 “SSC-FDM-OR0042”를 보고합니다.
출력 코드에 PRF 문제가 없으므로 PRF 열은 “N/A”를 보고합니다.
Conversion Status 는 EWIs 를 사용하지 않고 이 코드 단위의 일부 조각만 마이그레이션할 수 있었기 때문에 “Partial”입니다.
LoC 변환 비율 은 4개 라인 중 2개 라인만 성공적으로 변환되었으므로 50%입니다.
배포 순서¶
배포 순서 열은 각 코드 단위를 Snowflake에 배포하는 올바른 순서를 나타냅니다.
다음 코드는 배포 순서가 계산되는 방법을 심층적으로 보여줍니다.
CREATE TABLE TABLE1 ( -- level 0, no dependencies
COL1 INT
);
CREATE TABLE TABLE2 ( -- level 0, no dependencies
COL1 INT
);
CREATE VIEW VIEW1 -- level 4, depends on level-3 objects
AS SELECT * FROM VIEW2, VIEW3;
CREATE VIEW VIEW2 -- level 3, depends on level-2 objects
AS SELECT * FROM VIEW4, VIEW5, VIEW3;
CREATE VIEW VIEW4 -- level 1, depends on level-0 objects
AS SELECT * FROM TABLE1, TABLE2;
CREATE VIEW VIEW5 -- level 1, depends on level-0 objects
AS SELECT * FROM TABLE1;
CREATE VIEW VIEW3 -- level 2, depends on level-1 objects
AS SELECT * FROM VIEW6;
CREATE VIEW VIEW6 -- level 1, depends on level-0 objects
AS SELECT * FROM TABLE2;
배포 순서는 0으로 시작하므로 종속성이 없는 코드 단위는 이 수준에서 시작합니다. 위의 예에서, TABLE1 및 TABLE2에는 0 수준이 있습니다.
다음 수준에서는 수준 0의 코드 단위에 종속되는 코드 단위에 초점을 맞추겠습니다. VIEW4, VIEW5, VIEW6은 TABLE1 및 TABLE2에 직접 종속되므로 1 수준이 됩니다.
1 수준의 모든 코드 단위를 식별한 후 2 수준의 코드 단위에 초점을 맞추겠습니다. 해당 특정 시나리오에서는 VIEW3만 VIEW6에 종속되므로 VIEW3은 2 수준이 됩니다.
2 수준의 모든 코드 단위를 식별하면 3 수준에 초점을 맞추겠습니다. 위의 예에서, VIEW2는 VIEW4, VIEW5, VIEW3에 종속되지만 가장 높은 종속성 수준은 2이므로 VIEW2는 3 수준이 됩니다.
마지막으로, VIEW2 및 VIEW3에 종속되는 VIEW1을 확인합니다. VIEW2는 상위 수준의 종속성이므로, VIEW1은 4 수준이 됩니다.
모든 계산을 수행한 후의 최상위 코드 단위 보고서는 다음 테이블과 같은 형태입니다.
코드 단위 ID |
배포 순서 |
|---|---|
VIEW1 |
4 |
VIEW2 |
3 |
VIEW3 |
2 |
VIEW4 |
1 |
VIEW5 |
1 |
VIEW6 |
1 |
TABLE1 |
0 |
TABLE2 |
0 |
제한 사항¶
배포 순서가 특정 코드 단위에 대한 올바른 수준을 계산하지 않을 수 있는 몇 가지 시나리오가 있습니다.
종속성이 누락된 코드 단위¶
누락된 오브젝트에 (직간접적으로) 의존하는 코드 단위는 배포할 수 없습니다. SnowConvert AI는 최대한 배포 순서를 계산하지만, 종속성이 누락되면 배포 오류가 발생합니다. 종속성이 누락된 코드 단위의 경우, SnowConvert AI는 별표(*)를 배포 순서와 함께 추가합니다. 예:
CREATE TABLE TABLE1 ( -- level 0, no dependencies
COL1 INT
);
CREATE VIEW VIEW1 -- level 1*, depends on level-0 objects and has a missing dependency
AS SELECT * FROM TABLE1, TABLE2;
CREATE VIEW VIEW2 -- level 2*, depends on level-1* objects
AS SELECT * FROM VIEW1;
위의 예에서는 VIEW1이 누락된 TABLE2를 참조하고, VIEW2가 VIEW1을 참조하며, 이는 간접적으로 참조하는 TABLE2를 참조함을 보여줍니다. VIEW1에는 직접 누락된 참조가 있고 VIEW2에는 간접 누락된 참조가 있습니다. 최상위 코드 단위 보고서는 다음 테이블과 유사합니다.
코드 단위 ID |
배포 순서 |
|---|---|
TABLE1 |
0 |
VIEW1 |
1* |
VIEW2 |
2* |
데이터베이스 링크를 참조하는 코드 단위(Oracle)¶
SnowConvert AI는 데이터베이스 링크에 대한 참조를 식별할 수 있지만, 데이터베이스 링크를 통해 참조되는 오브젝트에 대한 추가 정보를 확인할 수는 없습니다. 이러한 종류의 참조는 배포 중에도 문제를 일으킬 수 있으므로 누락된 오브젝트 참조와 동일한 방식으로 처리됩니다. 예:
CREATE DATABASE LINK DBLINK1
CONNECT TO PUBLIC IDENTIFIED BY VALUES ':1'
USING 'TEST';
CREATE MATERIALIZED VIEW VIEW1 REFRESH WITH ROWID
AS SELECT * FROM TABLE1@DBLINK1;
VIEW1은 데이터베이스 링크 DBLINK1을 통해 TABLE1을 참조합니다. TABLE1의 위치를 모르기 때문에 VIEW1의 배포 순서는 종속성이 누락된 배포 순서처럼 처리됩니다(*).
코드 단위 ID |
배포 순서 |
|---|---|
DBLINK1 |
0 |
VIEW1 |
1* |
저장 프로시저, 익명 블록 등의 내부에 정의된 DDLs를 참조하는 코드 단위¶
일부 시나리오에서는 참조된 요소가 다른 코드 단위 내부에 정의되어 배포 순서가 올바르지 않을 수 있습니다. 예:
CREATE TABLE TABLE1 (
COL1 INT
);
CREATE OR REPLACE PROCEDURE PROC1 (param1 NUMBER)
IS
BEGIN
CREATE VIEW VIEW1
AS
SELECT * FROM TABLE1;
END;
CREATE VIEW VIEW2
AS SELECT * FROM VIEW1;
위의 코드에서 VIEW2는 저장 프로시저 실행 후 생성될 VIEW1을 참조합니다. VIEW1은 TABLE1을 참조하므로 테이블을 생성한 후에 프로시저를 실행해야 합니다. 해당 특정 시나리오에서 VIEW1은 저장 프로시저에 포함되어 있으므로 최상위 코드 단위 보고서에 포함되지 않습니다. 이 경우 VIEW2는 VIEW1의 생성이 PROC1에 종속된다는 것을 알 수 없으므로, 이로 인해 배포 순서가 올바르지 않을 수 있습니다. 다음 테이블은 위 코드의 배포 순서를 보여줍니다.
코드 단위 ID |
배포 순서 |
|---|---|
TABLE1 |
0 |
PROC1 |
1 |
VIEW2 |
1 |
VIEW1 및 PROC1의 배포 순서가 동일함에도, 프로시저가 먼저 실행되지 않으면 VIEW1은 실패합니다.
경고
시퀀스에 대한 배포 순서 지원은 향후 버전에서 제공될 예정입니다. 기본적으로, 시퀀스를 참조하는 코드 단위는 배포 순서를 계산할 때 이를 고려하지 않습니다.