SnowConvert AI – Bericht zu Codeeinheiten auf oberster Ebene¶
Was ist eine Codeeinheit der obersten Ebene?¶
Eine Codeeinheit ist, wie der Name schon sagt, das kleinste eigenständige ausführbare Element. In den meisten Fällen handelt es sich dabei um Anweisungen, aber sie umfassen auch Skriptdateien, da diese als einzelnes Element ausgeführt werden.
Einige Codeeinheiten können innerhalb anderer Codeeinheiten verschachtelt werden. Wenn es in einer Hierarchie von Einheiten keine andere Codeeinheit über ihr gibt, nennt man sie Codeeinheit der obersten Ebene.
Was ist eine Codeeinheit außerhalb des gültigen Bereichs?¶
Codeeinheiten auf oberster Ebene außerhalb des gültigen Bereichs sind Codeeinheiten, die außerhalb des Konvertierungsbereichs von SnowConvert AI liegen. Deshalb werden diese Codeeinheiten bei der Berechnung der Konvertierungsrate nicht berücksichtigt. Keine dieser Codeeinheiten hat eine Konvertierungsrate (wird als N/A angezeigt).
Wenn der Eingabecode nur Codeeinheiten enthält, die nicht in den Geltungsbereich fallen, beträgt die Konvertierungsrate der gesamten Migration 0 % der Codezeilen.
Der folgende CREATE TRIGGER gilt als Codeeinheit außerhalb des gültigen Bereichs.
CREATE OR REPLACE TRIGGER my_trigger
AFTER
UPDATE
ON my_table
FOR EACH ROW
BEGIN
NULL;
END;
Beispiele für Codeeinheiten der obersten Ebene¶
Im folgenden Abschnitt sehen wir einige Beispiele für Codeeinheiten der obersten Ebene.
Abfragen¶
Im folgenden Beispiel haben wir hier eine einzelne SELECT-Anweisung. Diese Anweisung ist eine einzelne Codeeinheit der obersten Ebene.
SELECT * FROM table1;
In diesem Beispiel haben wir eine verschachtelte SELECT-Anweisung, die in einer anderen SELECT-Anweisung verschachtelt ist. Die gesamte Abfrage zählt als eine einzelne Codeeinheit der obersten Ebene.
SELECT * FROM (SELECT * FROM table1);
Objekte¶
Objekte, die mit einer DDL erstellt wurden, zählen als einzelne Codeeinheit der obersten Ebene, auch wenn sie andere Codeeinheiten enthalten.
Die folgende Anweisung erstellt eine Ansicht mit einer Abfrage. In diesem Fall zählt die gesamte CREATE VIEW als einzelne Codeeinheit der obersten Ebene.
CREATE VIEW view1 AS SELECT * FROM table1;
Die folgende CREATE PROCEDURE-Anweisung zählt als einzelne Codeeinheit der obersten Ebene, auch wenn sie mehrere Anweisungen enthält.
CREATE PROCEDURE procedure1
AS
BEGIN
DELETE FROM table1;
END;
Befehle¶
Eigenständige Befehle in einer SQL-Datei werden als Codeeinheiten der obersten Ebene betrachtet.
Eine COMMIT-Anweisung zählt als einzelne Codeeinheit der obersten Ebene.
COMMIT;
Paket-Bodys in Oracle¶
Ein Paket kann mehrere Elemente innerhalb seines Bodys definieren. Der Paket-Body wird als Codeeinheit der obersten Ebene betrachtet, da diese Elemente nicht einzeln erstellt werden können, ohne den gesamten Paket-Body zu erstellen. Elemente oder Codeeinheiten innerhalb eines Paket-Bodys zählen nicht als Codeeinheiten der obersten Ebene.
Der folgende Code gilt als einzelne CREATE PACKAGE BODY-Codeeinheit.
CREATE PACKAGE package_body1 IS
FUNCTION function1
RETURN VARCHAR
IS
BEGIN
RETURN 'HELLO'';
END;
END;
Teradata-Skriptdateien¶
Teradata-Skriptdateien wie BTEQ oder TPUMP werden als eigenständige Codeeinheiten ausgeführt. Aus diesem Grund wird die gesamte Datei als einzelne Codeeinheit der obersten Ebene betrachtet. Andere mögliche Codeeinheiten innerhalb dieser Dateien zählen nicht als Codeeinheiten der obersten Ebene.
Die folgende BTEQ-Skriptdatei wird als einzelne BTEQ-Codeeinheit der obersten Ebene betrachtet.
.LOGON e/fml,notebook
.COMPILE FILE = example.spl;
COMMIT;
CALL samplesp1 (8888, pAmount);
.LOGOFF
Transact-SQL-Batches mit GOTO¶
Jede Anweisung von Transact-SQL kann eigenständig ausgeführt werden. In den meisten Fällen wird jede dieser Anweisungen als Codeeinheit der obersten Ebene betrachtet. Wenn es jedoch einen Stapel gibt, der eine GOTO-Anweisung zu einem LABEL innerhalb desselben Batchs enthält, können die Anweisungen des Batchs nicht unabhängig voneinander ausgeführt werden, ohne sicherzustellen, dass sie richtig funktionieren. Aus diesem Grund werden Anweisungen, die sich in einem Batch mit einer GOTO-Anweisung befinden, nicht als Codeeinheiten der obersten Ebene gezählt, sondern nur der Batch.
Das folgende Codebeispiel wird als eine einzelne GOTO/LABEL-Codeeinheit betrachtet:
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
Wie wird die Codeeinheitmethodik in anderen Berichten dargestellt?¶
Die Codeeinheitmethodik ist auch in anderen Berichten vertreten. In diesem Abschnitt wird erklärt, wie diese Werte angezeigt werden oder wie sie mit anderen Berichten zusammenhängen.
Problembericht¶
Jede Zeile des Problemberichts enthält einige Informationen über die Codeeinheit, die von dem Problem betroffen ist. Die Spalten, die sich auf Codeeinheiten beziehen, sind die folgenden:
Code Unit Database: Dies ist die Datenbank der Codeeinheit der obersten Ebene, in der das Problem gefunden wurde. Sie gilt nur für Codeeinheiten, die Objekte sind.
Code Unit Schema: Dies ist das Schema der Codeeinheit der obersten Ebene, in der das Problem gefunden wurde. Sie gilt nur für Codeeinheiten, die Objekte sind.
Code Unit Package: Dies ist das Paket der Codeeinheit der obersten Ebene, in der das Problem gefunden wurde. Sie gilt nur für Codeeinheiten, die Objekte sind.
Code Unit Name: Dies ist der Name der Codeeinheit der obersten Ebene, in der das Problem gefunden wurde. Er gilt nur für benannte Codeeinheiten wie Objekte. Dieser Name ist nicht durch Datenbank, Schema oder Paket qualifiziert.
Code Unit ID: Dies ist die ID der Codeeinheit der obersten Ebene, in der das Problem gefunden wurde. Bei diesem Namen ist der Name qualifiziert, und bei Codeeinheiten mit wiederholten Namen wird eine Nummer hinzugefügt.
Code Unit: Dies ist der Typ der Codeeinheit der obersten Ebene, in der das Problem gefunden wurde.
Code Unit Size: Dies ist die Größe der Codeeinheit der obersten Ebene, in der das Problem gefunden wurde.
Bericht zu Objektreferenzen und Bericht über fehlende Objekte¶
Jede Zeile des Berichts zu Objektreferenzen enthält Informationen über die Codeeinheit der obersten Ebene, die ein anderes Element referenziert hat. Bei diesen referenzierten Elementen handelt es sich möglicherweise nicht um Elemente der obersten Ebene, sodass diese anderen Werte möglicherweise nicht in den Bericht über Codeeinheiten der obersten Ebene aufgenommen werden.
Ähnlich wie der Bericht zu Objektreferenzen enthält der Bericht über fehlende Objekte Informationen über die Codeeinheit der obersten Ebene, die ein Element referenziert hat, das im Code nicht gefunden werden konnte.
Caller Code Unit: Dies ist der Typ der Codeeinheit der obersten Ebene, die ein anderes Element referenziert.
Caller Code Unit Database: Dies ist die Datenbank der Codeeinheit der obersten Ebene, die ein anderes Element referenziert.
Caller Code Unit Schema: Dies ist das Schema der Codeeinheit der obersten Ebene, die ein anderes Element referenziert.
Caller Code Unit Name: Dies ist der Name der Codeeinheit der obersten Ebene, die ein anderes Element referenziert.
Caller Code Unit Full Name: Dies ist der vollständige Name der Codeeinheit der obersten Ebene, die ein anderes Element referenziert.
Informationen im Top-Level Code Units Report¶
Spalte |
Beschreibung |
|---|---|
Partition Key |
Der eindeutige Bezeichner der Konvertierung. |
Dateityp |
Der Typ der Datei, in der sich die Codeeinheit befindet. (SQL, BTEQ usw.) |
Kategorie |
Die umfassendere Klasse oder der umfassendere Typ, zu dem jede Codeeinheit gehört. |
Code Unit |
Der Typ der Codeeinheit, zu der dieses Element gehört. |
Source Database |
Die Datenbank, in der sich die Quellcodeeinheit befindet. |
Quellschema |
Das Schema, in dem sich die Quellcodeeinheit befindet. |
Name der Quelle |
Der ursprüngliche Name der Quellcodeeinheit, wie er im Quellsystem angezeigt wird. |
Code-Einheit-ID |
Der eindeutige Bezeichner der Codeeinheit mit qualifiziertem Namen und Nummerierung für Codeeinheiten mit wiederholten Namen. |
Dateiname |
Der Name der Datei, in der sich das Objekt befindet. Verwendet den relativen Pfad ab dem Eingabeverzeichnis. |
Line Number |
Die Zeilennummer innerhalb der Datei, in der sich die Codeeinheit befindet. |
Lines of Code |
Die Gesamtzahl der Codezeilen, die die Codeeinheit umfasst. |
EWI Count |
Die Anzahl der EWIs, die in der Codeeinheit gefunden wurden. Mehr über EWIs erfahren Sie hier. |
FDM Count |
Die Anzahl der FDMs, die in der Codeeinheit gefunden wurden. Mehr über FDMs erfahren Sie hier. |
PRF Count |
Die Menge der innerhalb der Codeeinheit gefundenen PRFs. Hier erfahren Sie mehr über PRFs. |
Highest EWI Severity |
<p>Der höchste EWI-Schweregrad, der innerhalb der Codeeinheit gefunden wurde.<br>Die Reihenfolge der Schweregrade ist wie folgt:</p><ul><li>N/A (wenn es keine EWIsgibt)</li><li>Low</li><li>Medium</li><li>High</li><li>Critical</li></ul> |
UDFs Used |
Die Namen aller benutzerdefinierten Funktionen, die sich in der Codeeinheit befinden. Die Namen der verwendeten UDFs werden durch einen senkrechten Strich getrennt, wenn es mehr als einen gibt. |
EWI |
Der Code aller EWIs innerhalb der Codeeinheit. Dieser Code wird durch senkrechte Striche getrennt und enthält keinen sich wiederholenden Code. |
FDM |
Der Code aller FDMs innerhalb der Codeeinheit. Dieser Code wird durch senkrechte Striche getrennt und enthält keinen sich wiederholenden Code. |
PRF |
Der Code aller PRFs innerhalb der Codeeinheit. Dieser Code wird durch senkrechte Striche getrennt und enthält keinen sich wiederholenden Code. |
Conversion Status |
<p>Der endgültige Status der Konvertierung der Codeeinheit.</p><p>Die möglichen Konvertierungsstatus sind:</p><ul><li>NotSupported: Wenn die Codeeinheit eine Konvertierungsrate von 0 % hat.</li><li>Partial: Wenn die Konvertierungsrate der Codeeinheit zwischen 0 % und 100 % liegt.</li><li>Success: Wenn die Konvertierungsrate der Codeeinheit 100 % beträgt.</li></ul> |
LoC Conversion Percentage |
Der Prozentsatz der Konvertierungsrate basiert auf Codezeilen. Eine einzelne Codezeile kann unterstützte und nicht unterstützte Fragmente enthalten, je nachdem, wie der Eingabecode formatiert wurde. In diesen Fällen wird die gesamte Zeile als nicht unterstützt betrachtet. |
Reihenfolge der Bereitstellung |
Die Bereitstellungsreihenfolge ist die topologische Ebene jeder Codeeinheit auf der Grundlage ihrer Abhängigkeiten. Sie zeigt die richtige Reihenfolge an, in der die Codeeinheiten bereitgestellt werden sollten, um fehlende Abhängigkeiten während der Bereitstellungsphase zu vermeiden. |
Sprache |
Die Programmiersprache oder der SQL-Dialekt der Quellcodeeinheit. |
Beispiel¶
Nehmen Sie an, dass sich die folgende CREATE TABLE-Anweisung in ORACLE SQL in einer Datei namens „table_example.sql“ befindet.
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"}}'
;
Der Top-Level Code Units Report enthält einen einzigen Eintrag in der zuvor gezeigten Tabelle.
Hier sind alle Werte, die bei der Eingabe dieser CREATE TABLE-Anweisung gemeldet werden würden:
Der Wert von Partition Key hängt von der Migration ab, sodass der Wert hier variiert.
Der File Type ist SQL, da er für eine Datei mit der Erweiterung .sql migriert wurde.
Die Category ist TABLE, da die
CREATE TABLE-Anweisung Teil der Codeeinheitenkategorie TABLE ist.Die Code Unit selbst lautet
CREATE TABLE.Der File Name, der Datei, in der diese Codeeinheit gefunden wurde, lautet „table_example.sql“.
Unter der Annahme, dass die
CREATE TABLE-Anweisung am Anfang der Datei steht, ist die Line Number 1.Die Anzahl der Lines of Code ist 4.
In der Spalte EWI Count wird 1 angezeigt, da der Ausgabecode eine Parsing-EWI-Meldung aufweist.
Die Spalte FDM Count enthält 1, weil der Ausgabecode ein FDM- Problem bezüglich Datentypen aufweist.
Als PRF Count wird 0 angegeben, da keine PRF-Probleme im Ausgabecode vorhanden sind.
Die Highest EWI Severity wäre in diesem Fall „Critical“, da dies der Schweregrad der Parsing-EWI-Meldung im Beispiel ist. Die andere hat den Schweregrad „Low“.
Die Spalte UDFs Used enthält
JULIAN_TO_GREGORIAN_DATE_UDF, da diese benutzerdefinierte Funktion hinzugefügt wurde, um dieTO_DATE-Funktion des Eingabecodes zu konvertieren.In der Spalte EWI wird „SSC-EWI-0001“ angezeigt, da dies eine der EWIs ist, die im Ausgabecode hinzugefügt wurden.
Die Spalte FDM enthält „SSC-FDM-OR0042“, da dies eine der FDMs war, die im Ausgabecode hinzugefügt wurden.
In der Spalte PRF wird „N/A“ angezeigt, da es im Ausgabecode keine PRF-Probleme gibt.
Der Conversion State lautet „Partial“ sein, da nur einige Fragmente dieser Codeeinheit ohne EWIs migriert werden konnten.
Die LoC Conversion Percentage beträgt 50 %, da von 4 Zeilen nur 2 erfolgreich konvertiert wurden.
Reihenfolge der Bereitstellung¶
Die Spalte für die Bereitstellungsreihenfolge gibt die korrekte Reihenfolge für die Bereitstellung der einzelnen Codeeinheiten in Snowflake an.
Der folgende Code veranschaulicht detailliert, wie die Bereitstellungsreihenfolge berechnet wird.
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;
Die Bereitstellungsreihenfolge beginnt mit 0, sodass Codeeinheiten ohne Abhängigkeiten auf dieser Ebene beginnen. Im obigen Beispiel haben TABLE1 und TABLE2 die Ebene 0.
Bezüglich der nächsten Ebene konzentrieren wir uns auf Codeeinheiten, die von Codeeinheiten der Ebene 0 abhängen. VIEW4, VIEW5 und VIEW6 hängen direkt von TABLE1 und TABLE2 ab, sodass ihre Ebene 1 lautet.
Nachdem alle Codeeinheiten der Ebene 1 identifiziert wurden, konzentrieren wir uns auf die Codeeinheiten der Ebene 2. In diesem speziellen Szenario hängt nur VIEW3 von VIEW6 ab, sodass VIEW3 die Ebene 2 hat.
Nachdem wir alle Codeeinheiten der Ebene 2 identifiziert haben, konzentrieren wir uns auf Ebene 3. Im obigen Beispiel hängt VIEW2 von VIEW4, VIEW5 und VIEW3 ab, der höchste Abhängigkeitsgrad ist jedoch 2. Also hat VIEW2 die Ebene 3.
Schließlich haben wir noch VIEW1, die von VIEW2 und VIEW3 abhängt. Da VIEW2 die Abhängigkeit mit der höheren Ebene ist, erhält VIEW1 die Ebene 4.
Nachdem alle Berechnungen durchgeführt wurden, sieht der Bericht zu Codeeinheiten der obersten Ebene etwa wie die folgende Tabelle aus.
Code-Einheit-ID |
Reihenfolge der Bereitstellung |
|---|---|
VIEW1 |
4 |
VIEW2 |
3 |
VIEW3 |
2 |
VIEW4 |
1 |
VIEW5 |
1 |
VIEW6 |
1 |
TABLE1 |
0 |
TABLE2 |
0 |
Einschränkungen¶
Es gibt einige Szenarien, in denen die Bereitstellungsreihenfolge möglicherweise nicht die richtige Ebene für eine bestimmte Codeeinheit berechnet.
Codeeinheiten mit fehlenden Abhängigkeiten¶
Die Bereitstellung von Codeeinheiten, die (direkt oder indirekt) von fehlenden Objekten abhängen, ist nicht möglich. Obwohl SnowConvert AI die Reihenfolge der Bereitstellung so gut wie möglich berechnet, führt eine fehlende Abhängigkeit zu Bereitstellungsfehlern. Bei Codeeinheiten mit fehlenden Abhängigkeiten fügt SnowConvert AI ein Sternchen (*) neben der Bereitstellungsreihenfolge hinzu. Beispiel:
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;
Das obige Beispiel zeigt VIEW1, die auf eine fehlende TABLE2 verweist, und VIEW2, die auf VIEW1 verweist, die wiederum indirekt auf TABLE2 verweist. VIEW1 hat einen direkten fehlenden Verweis und VIEW2 einen indirekt fehlenden Verweist. Der Bericht zu Codeeinheiten der obersten Ebene sieht ungefähr wie in der folgenden Tabelle aus.
Code-Einheit-ID |
Reihenfolge der Bereitstellung |
|---|---|
TABLE1 |
0 |
VIEW1 |
1* |
VIEW2 |
2* |
Codeeinheiten, die auf Datenbank-Links verweisen (Oracle)¶
SnowConvert AI kann zwar Verweise auf Datenbank-Links identifizieren, aber keine weiteren Informationen zu den Objekten erhalten, auf die über den Datenbank-Link verwiesen wird. Diese Art von Verweis kann ebenfalls während der Bereitstellung Probleme verursachen, sodass er genauso behandelt wird wie fehlende Objektreferenzen. Beispiel:
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 verweist auf TABLE1 über den Datenbank-Link DBLINK1. Da wir nicht wissen, wo sich TABLE1 befindet, wird die Bereitstellungsreihenfolge von VIEW1 wie eine Bereitstellungsreihenfolge mit fehlenden Abhängigkeiten behandelt (*).
Code-Einheit-ID |
Reihenfolge der Bereitstellung |
|---|---|
DBLINK1 |
0 |
VIEW1 |
1* |
Codeeinheiten, die auf DDLs verweisen, die in gespeicherten Prozeduren, anonymen Blöcken usw. definiert sind¶
In einigen Szenarien ist die Bereitstellungsreihenfolge möglicherweise nicht korrekt, da das referenzierte Element innerhalb einer anderen Codeeinheit definiert wurde. Beispiel:
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;
Im obigen Code verweist VIEW2 auf VIEW1, die nach der Ausführung der gespeicherten Prozedur erstellt wird. VIEW1 verweist auf TABLE1, sodass die Prozedur nach dem Erstellen der Tabelle ausgeführt werden sollte. In diesem speziellen Szenario wird VIEW1 nicht in den Bericht zu Codeeinheiten der obersten Ebene aufgenommen, da sie in der gespeicherten Prozedur enthalten ist. In diesem Fall ist es für VIEW2 unmöglich zu wissen, dass VIEW1 davon abhängt, dass PROC1 erstellt wird. Deshalb ist die Bereitstellungsreihenfolge möglicherweise nicht korrekt. Die folgende Tabelle zeigt die Bereitstellungsreihenfolge für den obigen Code.
Code-Einheit-ID |
Reihenfolge der Bereitstellung |
|---|---|
TABLE1 |
0 |
PROC1 |
1 |
VIEW2 |
1 |
Obwohl VIEW1 und PROC1 die gleiche Bereitstellungsreihenfolge haben, schlägt VIEW1 fehl, wenn die Prozedur nicht zuerst ausgeführt wurde.
Warnung
Die Unterstützung von Sequenzen bei der Bereitstellungsreihenfolge wird in einer zukünftigen Version ausgeliefert. Standardmäßig berücksichtigen Codeeinheiten, die auf Sequenzen verweisen, diese nicht bei der Berechnung der Bereitstellungsreihenfolge.