SnowConvert AI - トップレベルコードユニットレポート¶
トップレベルコードユニットとは¶
コードユニットとは、その名のとおり、最もアトミックで独立した実行要素です。ほとんどの場合、これらはステートメントですが、スクリプトファイルも1つの要素として実行されるため、スクリプトファイルも含まれます。
一部のコードユニットは、他のコードユニットの中にネストすることができます。ユニットの階層において、その上に他のコードユニットがない場合、それはトップレベルコードユニットと呼ばれます。
スコープ外のコードユニットとは¶
スコープ外のトップレベルコードユニットとは、 SnowConvert AI の変換スコープ外のコードユニットです。このため、変換率を計算する際には、これらのコードユニットは考慮されません。これらの各コードユニットには、変換率はありません( N/A と表示されます)。
入力コードにスコープ外のコードユニットのみが含まれている場合、移行全体のコード行数変換率は0%になります。
以下の CREATE TRIGGER は、スコープ外のコードユニットとみなされます。
トップレベルコードユニットの例¶
次のセクションでは、トップレベルコードユニットの例をいくつか紹介します。
クエリ¶
次の例では、 SELECT ステートメントを1つ使用しています。このステートメントは1つのトップレベルコードユニットです。
この例では、 SELECT ステートメントが別の SELECT ステートメントの中にネストされています。クエリ全体が1つのトップレベルコードユニットとしてカウントされます。
オブジェクト¶
DDL で作成されたオブジェクトは、その中に他のコードユニットが含まれていても、1つのトップレベルコードユニットとしてカウントされます。
次のステートメントは、クエリを含むビューを作成します。この場合は、 CREATE VIEW 全体が1つのトップレベルコードユニットとしてカウントされます。
次の CREATE PROCEDURE ステートメントは、その中に複数のステートメントが含まれていても、1つのトップレベルコードユニットとしてカウントされます。
コマンド¶
SQL ファイル内の独立したコマンドは、トップレベルコードユニットとみなされます。
COMMIT ステートメントは、1つのトップレベルコードユニットとしてカウントされます。
Oracleのパッケージ本文¶
パッケージはその本文の中に複数の要素を定義することができます。パッケージ本文はトップレベルコードユニットとみなされます。なぜなら、パッケージ本文全体を作成しなければ、これらの要素を個別に作成できないからです。パッケージ本文内の要素やコードユニットは、トップレベルコードユニットとしてカウントされません。
以下のコードは、 CREATE PACKAGE BODY コードユニットとして報告されます。
Teradataスクリプトファイル¶
BTEQ や TPUMP のようなTeradataスクリプトファイルは、スタンドアロンのコードユニットとして実行されます。このため、ファイル全体が1つのトップレベルコードユニットとみなされます。これらのファイルの中にある他の可能性のあるコードユニットは、トップレベルコードユニットとしてカウントされません。
次の BTEQ スクリプトファイルは、単一の BTEQ トップレベルコードユニットとして報告されます。
GOTO のあるTransact SQL バッチ¶
Transact-SQL の各ステートメントは独立して実行できます。ほとんどの場合、これらのステートメントのそれぞれがトップレベルコードユニットとみなされます。しかし、同じバッチ内にラベルへの GOTO ステートメントを含むバッチがある場合、そのバッチのステートメントが正しく動作することを確認しないと、そのバッチを単独で実行することはできません。このため、 GOTO ステートメントを含むバッチ内のステートメントは、トップレベルコードユニットとしてカウントされず、バッチとしてのみカウントされます。
以下のコード例は、単一の GOTO/LABEL コードユニットとして報告されます。
他のレポートでコードユニットが扱われる手法¶
コードユニットの手法は、他のレポートでも紹介されています。このセクションでは、これらの値がどのように表示されるか、または他のレポートとどのように関連するかについて説明します。
問題に関するレポート¶
問題レポートの各行には、問題の影響を受けているコードユニットに関する情報が記載されています。コードユニットに関連する列は以下のとおりです。
コードユニットデータベース: 問題が見つかったトップレベルのコードユニットのデータベースです。オブジェクトであるコードユニットにのみ適用されます。
コードユニットスキーマ: 問題が見つかったトップレベルコードユニットのスキーマです。オブジェクトであるコードユニットにのみ適用されます。
コードユニットパッケージ: 問題が見つかったトップレベルのコードユニットのパッケージです。オブジェクトであるコードユニットにのみ適用されます。
コードユニット名: 問題が見つかったトップレベルのコードユニット名です。オブジェクトのように名前のついたコードユニットにのみ適用されます。この名前はデータベース、スキーマ、パッケージによって修飾されません。
コードユニット ID: これは、問題が見つかったトップレベルのコードユニットの ID です。この名前は名前を修飾し、名前が繰り返されるコードユニットには番号を追加します。
コードユニット: 問題が見つかったトップレベルのコードユニットのタイプです。
コードユニットサイズ: 問題が見つかったトップレベルのコードユニットのサイズです。
オブジェクト参照レポートと欠落オブジェクトレポート¶
オブジェクト参照レポートの各行には、別の要素を参照していたトップレベルコードユニットに関する情報があります。これらの参照エレメントはトップレベルではないため、他の値はトップレベルコードユニットレポートに含まれない場合があります。
オブジェクト参照レポートと同様に、見つからないオブジェクトレポートには、コード内で見つからない要素を参照していたトップレベルコードユニットに関する情報があります。
呼び出し元コードユニット: 他のエレメントを参照するトップレベルコードユニットのタイプです。
呼び出し元コードユニットデータベース: 他のエレメントを参照しているトップレベルコードユニットのデータベースです。
呼び出し元コードユニットスキーマ: 他の要素を参照するトップレベルコードユニットのスキーマです。
呼び出し元コードユニット名: 別の要素を参照するトップレベルコードユニットの名前です。
呼び出し元コードユニット完全名): 別の要素を参照するトップレベルコードユニットの完全名です。
トップレベルコードユニットレポートの情報¶
列 |
説明 |
|---|---|
パーティションキー |
変換の一意識別子。 |
ファイルタイプ |
コードユニットがあるファイルのタイプ。(SQL、 BTEQ など) |
カテゴリ |
各コードユニットが属する、広範なクラスまたはタイプ。 |
コードユニット |
この要素が属するコードユニットのタイプ。 |
ソースデータベース |
ソースコードユニットが置かれているデータベース。 |
ソーススキーマ |
ソースコードユニットが置かれているスキーマ。 |
ソース名 |
ソースシステムで表示されるソースコードユニットの元の名前。 |
コードユニットID |
修飾名と、繰り返し名を持つコードユニットのための番号を含む、コードユニットの固有識別子。 |
ファイル名 |
オブジェクトが置かれているファイル名。入力ディレクトリからの相対パスを使用します。 |
行番号 |
コードユニットがあるファイル内の行番号。 |
コード行数 |
コードユニットが持つコードの合計行数。 |
EWI カウント |
コードユニット内で見つかった EWIs の数。EWIs については、 こちら をご参照ください。 |
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 の名前は、複数ある場合はパイプで区切られます。 |
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 変換パーセント |
変換率はコード行数に基づいています。1行のコードには、入力コードの形式によって、サポートされるフラグメントとサポートされないフラグメントがあります。このような場合、その行全体がサポートされていないと見なされます。 |
デプロイ順序 |
デプロイ順序は、依存関係に基づく各コードユニットのトポロジーレベルです。これは、デプロイ段階で依存関係が欠落しないように、コードユニットをデプロイする正しい順序を示します。 |
言語 |
ソースコードユニットのプログラミング言語または SQL 方言。 |
例¶
ORACLE SQL 内の次の CREATE TABLE がtable_example.sqlというファイルにあるとします。
トップレベルコードユニットレポートには、先に示したテーブルが1つだけ表示されます。
以下は、この CREATE TABLE ステートメントのエントリで報告されるすべての値です。
パーティションキー の値は移行によって異なります。
ファイルタイプ は、.sql拡張子を持つファイルで移行されたため、 SQL となります。
CREATE TABLEステートメントは TABLE コードユニットカテゴリの一部であるため、 カテゴリ は TABLE になります。コードユニット 自体は
CREATE TABLEになります。このコードユニットが見つかった ファイル名 はtable_example.sqlです。
CREATE TABLEステートメントがファイルの先頭にあると仮定すると、 行番号 は1になります。コード行 の数字は4になります。
EWI カウント 列は、出力コードに1つの解析 EWI があるため、1と表示されます。
FDM カウント 列に1と表示されるのは、出力コードにデータ型に関連する FDM 問題があるためです。
出力コードに PRF の問題が存在しないため、 PRF カウント は0を報告します。
この場合の 最大 EWI 重大度 は、例の解析 EWI の重大度であるため、「Critica」になります。もう1つの重大度は「Low」です。
このカスタムユーザー定義関数は、入力コードの
TO_DATE関数を変換するために追加されたため、 使用された UDFs 列はJULIAN_TO_GREGORIAN_DATE_UDFになります。EWI 列は「SSC-EWI-0001」と表示されます。これは出力コードで追加された EWIs のうちの1つだからです。
FDM 列は「SSC-FDM-OR0042」と表示されます。これは出力コードで追加された FDMs のうちの一つだからです。
出力コードには PRF の問題が存在しないため、 PRF 列は「N/A」と表示されます。
変換ステータス は「Partial」になります。これは、このコードユニットの一部のフラグメントのみが、 EWIs なしで移行できたためです。
LoC 変換パーセント は50%です。4行中、変換に成功したのは2行のみだからです。
デプロイ順序¶
デプロイ順序の列は、各コードユニットをSnowflakeにデプロイする正しい順序を表しています。
次のコードは、デプロイ順序がどのように計算されるかを詳しく例示しています。
デプロイ順序は 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 がデプロイ順序の横にアスタリスク( * )を追加します。例:
上記の例では、 VIEW1 が欠落している TABLE2 を参照し、VIEW2 は VIEW1 を参照していて TABLE2 を間接的に参照しています。 VIEW1 は直接的に欠落している参照があり、 VIEW2 は間接的に欠落している参照があります。トップレベルコードユニットレポートは以下の表のようになります。
コードユニットID |
デプロイ順序 |
|---|---|
TABLE1 |
0 |
VIEW1 |
1* |
VIEW2 |
2* |
データベースリンクを参照するコードユニット(Oracle)¶
SnowConvert AI はデータベースリンクへの参照を特定できますが、データベースリンクを通じて参照されているオブジェクトに関する詳細情報を取得することはできません。この種の参照はデプロイ時にも問題を引き起こす可能性があるため、オブジェクト参照が欠落している場合と同じように処理されます。例:
VIEW1 はデータベースリンク DBLINK1 を介して TABLE1 を参照しています。TABLE1 がどこにあるかわからないので、 VIEW1 のデプロイ順序は、依存関係が欠落しているデプロイ順序( * )と同じように扱われます。
コードユニットID |
デプロイ順序 |
|---|---|
DBLINK1 |
0 |
VIEW1 |
1* |
ストアドプロシージャや匿名ブロックなどの内部で定義された DDLs を参照するコードユニット¶
シナリオによっては、参照される要素が別のコードユニットの内部で定義されているため、デプロイ順序が正しくないことがあります。例:
上記のコードでは、 VIEW2 はストアドプロシージャを実行した後に作成される VIEW1 を参照しています。 VIEW1 は TABLE1 を参照しているので、プロシージャはテーブルを作成した後に実行する必要があります。その特定のシナリオでは、 VIEW1 はストアドプロシージャに含まれているため、トップレベルコードユニットレポートには含まれません。その場合、 VIEW2 は VIEW1 が作成される PROC1 に依存していることを知ることができず、そのためにデプロイ順序が正しくないことがあります。次の表は、上記のコードのデプロイ順序を示しています。
コードユニットID |
デプロイ順序 |
|---|---|
TABLE1 |
0 |
PROC1 |
1 |
VIEW2 |
1 |
VIEW1 と PROC1 のデプロイ順序は同じであるにもかかわらず、 VIEW1 は、プロシージャが最初に実行されなかった場合、失敗します。
警告
シーケエンスのデプロイ順序は、今後のバージョンでサポートされる予定です。デフォルトでは、シーケンスを参照するコードユニットは、デプロイ順序を計算するためにそれらを考慮しません。