EXECUTE IMMEDIATE FROM¶
EXECUTE IMMEDIATE FROM führt die in einer Datei angegebenen SQL-Anweisungen in einem Stagingbereich aus. Die Datei kann SQL-Anweisungen oder Snowflake Scripting-Blöcke enthalten. Bei den Anweisungen muss es sich um syntaktisch korrekte SQL-Anweisungen handeln.
Sie können den Befehl EXECUTE IMMEDIATE FROM verwenden, um die Anweisungen in einer Datei von einer beliebigen Snowflake-Sitzung aus auszuführen.
Dieses Feature bietet einen Mechanismus zur Steuerung der Bereitstellung und Verwaltung Ihrer Snowflake-Objekte und Ihres Codes. Sie können zum Beispiel ein gespeichertes Skript ausführen, um eine Standard-Snowflake-Umgebung für alle Ihre Konten zu erstellen. Das Konfigurationsskript kann Anweisungen enthalten, die Benutzer, Rollen, Datenbanken und Schemas für jedes neue Konto erstellen.
- Siehe auch:
Syntax¶
EXECUTE IMMEDIATE
FROM { absoluteFilePath | relativeFilePath }
Wobei:
absoluteFilePath ::= @[ <namespace>. ]<stage_name>/<path>/<filename>relativeFilePath ::= '[ { ./ | / | { ../ [ , ../, ... ] } } ]<path>/<filename>'
Absoluter Dateipfad (absoluteFilePath
)¶
namespace
Datenbank und/oder Schema, in dem sich der interne oder externe Stagingbereich befindet, im Format
database_name.schema_name
oderschema_name
. Der Namespace ist optional, wenn in der Benutzersitzung aktuell eine Datenbank und ein Schema verwendet werden. Andernfalls ist er erforderlich.stage_name
Name des internen oder externen Stagingbereichs.
path
Pfad zu der Datei im Stagingbereich mit Unterscheidung von Groß-/Kleinschreibung.
filename
Name der auszuführenden Datei. Er muss syntaktisch korrekte und gültige SQL-Anweisungen enthalten. Jede Anweisung muss durch ein Semikolon getrennt werden.
Relativer Dateipfad (relativeFilePath
)¶
path
Pfad zur relativen Datei im Stagingbereich mit Unterscheidung von Groß-/Kleinschreibung. Relative Pfade unterstützen etablierte Konventionen wie ein führendes
/
, um die Wurzel des Dateisystems eines Stagingbereichs anzugeben,./
, um auf das aktuelle Verzeichnis zu verweisen (das Verzeichnis, in dem sich die übergeordnete Datei befindet) und../
, um auf das übergeordnete Verzeichnis zu verweisen. Weitere Informationen dazu finden Sie unter Nutzungshinweise.filename
Name der auszuführenden Datei. Er muss syntaktisch korrekte und gültige SQL-Anweisungen enthalten. Jede Anweisung muss durch ein Semikolon getrennt werden.
Rückgabewerte¶
EXECUTE IMMEDIATE FROM Rückgabewerte:
Das Ergebnis der letzten Anweisung in der Datei, wenn alle Anweisungen erfolgreich ausgeführt wurden.
Die Fehlermeldung, wenn eine Anweisung in der Datei fehlgeschlagen ist.
Wenn in einer Anweisung in der Datei ein Fehler auftritt, schlägt der Befehl EXECUTE IMMEDIATE FROM fehl und gibt die Fehlermeldung der fehlgeschlagenen Anweisung zurück.
Bemerkung
Wenn der Befehl EXECUTE IMMEDIATE FROM fehlschlägt und eine Fehlermeldung zurückgibt, sind alle Anweisungen in der Datei vor der fehlgeschlagenen Anweisung erfolgreich abgeschlossen worden.
Anforderungen an die Zugriffssteuerung¶
Die Rolle, die zur Ausführung des Befehls EXECUTE IMMEDIATE FROM verwendet wird, muss über die Berechtigung USAGE (externer Stagingbereich) oder READ (interner Stagingbereich) für den Stagingbereich verfügen, in dem sich die Datei befindet.
Die Rolle, mit der die Datei ausgeführt wird, kann nur die Anweisungen in der Datei ausführen, für die sie Berechtigungen hat. Wenn beispielsweise eine CREATE TABLE-Anweisung in der Datei enthalten ist, muss die Rolle über die notwendigen Berechtigungen verfügen, um eine Tabelle im Konto zu erstellen, sonst schlägt die Anweisung fehl.
Beachten Sie, dass für die Bearbeitung eines Objekts in einem Schema auch die Berechtigung USAGE für die übergeordnete Datenbank und das Schema erforderlich ist.
Eine Anleitung zum Erstellen einer kundenspezifischen Rolle mit einer bestimmten Gruppe von Berechtigungen finden Sie unter Erstellen von kundenspezifischen Rollen.
Allgemeine Informationen zu Rollen und Berechtigungen zur Durchführung von SQL-Aktionen auf sicherungsfähigen Objekten finden Sie unter Übersicht zur Zugriffssteuerung.
Nutzungshinweise¶
Die SQL-Anweisungen in einer auszuführenden Datei können EXECUTE IMMEDIATE FROM-Anweisungen enthalten:
Verschachtelte EXECUTE IMMEDIATE FROM-Anweisungen können relative Dateipfade verwenden.
Relative Pfade werden in Bezug auf den Stagingbereich und den Dateipfad der übergeordneten Datei ausgewertet. Wenn der relative Dateipfad mit
/
beginnt, beginnt der Pfad im Stammverzeichnis des Stagingbereichs, der die übergeordnete Datei enthält.Ein Beispiel dazu finden Sie unter Beispiele.
Relative Dateipfade müssen in einfache Anführungszeichen (
'
) oder$$
gesetzt wird.Die maximale Ausführungstiefe für verschachtelte Dateien ist 5.
Absolute Dateipfade können optional in einfache Anführungszeichen (
'
) oder$$
gesetzt werden.Die auszuführende Datei darf nicht größer als 10MB sein.
Die auszuführende Datei muss in UTF-8 kodiert sein.
Die auszuführende Datei muss unkomprimiert sein. Wenn Sie den Befehl PUT verwenden, um eine Datei in einen internen Stagingbereich hochzuladen, müssen Sie den Parameter AUTO_COMPRESS explizit auf FALSE setzen.
Laden Sie zum Beispiel
my_file.sql
nachmy_stage
hoch:PUT file://~/sql/scripts/my_file.sql @my_stage/scripts/ AUTO_COMPRESS=FALSE;
Das Ausführen aller Dateien in einem Verzeichnis wird nicht unterstützt. Zum Beispiel führt
EXECUTE IMMEDIATE FROM @stage_name/scripts/
zu einem Fehler.
Problembehandlung von EXECUTE IMMEDIATE FROM-Fehler¶
Dieser Abschnitt enthält einige häufige Fehler, die sich aus einer EXECUTE IMMEDIATE FROM-Anweisung ergeben, und wie Sie diese beheben können.
Dateifehler¶
Fehler |
001501 (02000): File '<directory_name>' not found in stage '<stage_name>'.
|
---|---|
Ursache |
Es gibt mehrere Ursachen für diesen Fehler:
|
Lösung |
Überprüfen Sie den Namen der Datei, und stellen Sie sicher, dass die Datei vorhanden ist. Das Ausführen aller Dateien in einem Verzeichnis wird nicht unterstützt. |
Fehler |
001503 (42601): Relative file references like '<filename.sql>' cannot be used in top-level EXECUTE IMMEDIATE calls.
|
---|---|
Ursache |
Die Anweisung wurde mit einem relativen Dateipfad außerhalb einer Dateiausführung ausgeführt. |
Lösung |
Ein relativer Dateipfad kann nur in EXECUTE IMMEDIATE FROM-Anweisungen in einer Datei verwendet werden. Verwenden Sie den absoluten Dateipfad für die Datei. Weitere Informationen dazu finden Sie unter Nutzungshinweise. |
Fehler |
001003 (42000): SQL compilation error: syntax error line <n> at position <m> unexpected '<string>'.
|
---|---|
Ursache |
Die Datei enthält SQL-Syntaxfehler. |
Lösung |
Korrigieren Sie die Syntaxfehler in der Datei, und laden Sie die Datei erneut in den Stagingbereich hoch. |
Stagingbereichsfehler¶
Fehler |
002003 (02000): SQL compilation error: Stage '<stage_name>' does not exist or not authorized.
|
---|---|
Ursache |
Der Stagingbereich ist nicht vorhanden, oder Sie haben keinen Zugriff auf den Stagingbereich. |
Lösung |
|
Zugriffssteuerungsfehler¶
Fehler |
003001 (42501): Uncaught exception of type 'STATEMENT_ERROR' in file <file_name> on line <n> at position <m>:
SQL access control error: Insufficient privileges to operate on schema '<schema_name>'
|
---|---|
Ursache |
Die zur Ausführung der Anweisung verwendete Rolle verfügt nicht über die erforderlichen Berechtigungen, um einige oder alle Anweisungen in der Datei auszuführen. |
Lösung |
Verwenden Sie eine Rolle, die über die entsprechenden Berechtigungen verfügt, um die Anweisungen in der Datei auszuführen. Weitere Informationen dazu finden Sie unter Anforderungen an die Zugriffssteuerung. |
Siehe auch Stagingbereichsfehler.
Beispiele¶
In diesem Beispiel wird die Datei create-inventory.sql
ausgeführt, die sich im Stagingbereich my_stage
befindet.
Erstellen Sie eine Datei namens
create-inventory.sql
mit den folgenden Anweisungen:CREATE OR REPLACE TABLE my_inventory( sku VARCHAR, price NUMBER ); EXECUTE IMMEDIATE FROM './insert-inventory.sql'; SELECT sku, price FROM my_inventory ORDER BY price DESC;
Erstellen Sie eine Datei namens
insert-inventory.sql
mit den folgenden Anweisungen:INSERT INTO my_inventory VALUES ('XYZ12345', 10.00), ('XYZ81974', 50.00), ('XYZ34985', 30.00), ('XYZ15324', 15.00);
Erstellen Sie einen internen Stagingbereich
my_stage
:CREATE STAGE my_stage;
Laden Sie beide lokalen Dateien mit dem Befehl PUT in den Stagingbereich hoch:
PUT file://~/sql/scripts/create-inventory.sql @my_stage/scripts/ AUTO_COMPRESS=FALSE; PUT file://~/sql/scripts/insert-inventory.sql @my_stage/scripts/ AUTO_COMPRESS=FALSE;
Führen Sie das Skript
create-inventory.sql
aus, das sich inmy_stage
befindet:EXECUTE IMMEDIATE FROM @my_stage/scripts/create-inventory.sql;
Rückgabewerte:
+----------+-------+ | SKU | PRICE | |----------+-------| | XYZ81974 | 50 | | XYZ34985 | 30 | | XYZ15324 | 15 | | XYZ12345 | 10 | +----------+-------+