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
undSnowflakeFile.getInputStream
oder empfängt die Datei alsjava.io.InputStream
:SnowflakeFile sfFile = SnowflakeFile.newInstance(file_url); InputStream is = sfFile.getInputStream();
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();
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).
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