UDFs: Funktionen mit Handler-Code, der Dateien aus einem Stagingbereich liest, werden im Kontext des Eigentümers ausgeführt

Achtung

Diese Verhaltensänderung ist in Bundle 2023_03 enthalten.

Den aktuellen Status des Bundles finden Sie unter Bundle-Verlauf.

UDFs, deren Handler-Code Dateien aus einem Stagingbereich liest, wird im Kontext des Eigentümers ausgeführt. Ein Aufrufer muss den Dateispeicherort als Bereichs-URL übergeben, unabhängig davon, ob sich der Handler-Code in einer UDF oder in einer Prozedur befindet, und unabhängig davon, ob sie mit Aufruferrechten oder mit Eigentümerrechten ausgeführt werden:

Bisher

Wenn Java-Code in einem UDF-Handler eine Datei aus einem Stagingbereich liest, erfolgt dies im Kontexts des Aufrufers.

Ein Aufrufer kann den Speicherort der Datei in einem Format wie z. B. select my_function('@stage-name/filename.txt'). an die Funktion übergeben.

Der Handlercode empfängt die Stagingbereichs-URL und liest die Datei mit SnowflakeFile.newInstance und SnowflakeFile.getInputStream oder empfängt die Datei als java.io.InputStream:

SnowflakeFile sfFile = SnowflakeFile.newInstance(file_url);
InputStream is = sfFile.getInputStream();
Copy

Dateien, die vom Handler-Code gelesen werden, können sich in einem externen Stagingbereich oder in einem Benutzer- oder benannten internen Stagingbereich befinden.

Jetzt

Wenn Java-Code in einem UDF-Handler eine Datei aus einem Stagingbereich liest, erfolgt dies im Kontext des Eigentümers.

Sowohl bei UDFs als auch bei Prozeduren muss ein Aufrufer den Speicherort der Datei in einer Bereichs-URL mithilfe der Funktion BUILD_SCOPED_FILE_URL übergeben, wie in dem folgenden Funktionsbeispiel:

select my_func(build_scoped_file_url(@my_stage, 'filename.txt'));

Der Handler-Code empfängt die Bereichs-URL und liest die Datei wie bisher.

SnowflakeFile sfFile = SnowflakeFile.newInstance(scopedFileUrl);
InputStream is = sfFile.getInputStream();
Copy

Bei Dateien, deren Speicherort im Handler-Code angegeben wird (nicht als Bereichs-URLs, die von einem Aufrufer übergeben werden), können Sie die Stagingdatei auf eine der beiden folgenden Arten lesen: Der Handler-Code kann die newInstance-Methode mit einem booleschen Wert für einen neuen requireScopedUrl-Parameter aufrufen. Oder der Handler-Code muss beim Erstellen eines InputStream für den Dateipfad eine Bereichs-URL verwenden.

Im folgenden Beispiel wird SnowflakeFile.newInstance verwendet:

String filename = “@my_stage/filename.txt”;
SnowflakeFile sfFile = SnowflakeFile.newInstance(filename, require_scoped_url = false).
Copy

Außerdem werden Benutzer-Stagingbereiche nicht mehr als Speicherort für Dateien unterstützt, die von einem Handler gelesen werden. Dateien, die vom Handler-Code gelesen werden, müssen sich in einem externen Stagingbereich oder in einem benannten internen Stagingbereich befinden.

Ref.: 1008