UDFs : les fonctions avec un code de gestionnaire qui lit des fichiers dans une zone de préparation s’exécutent dans le contexte du propriétaire

Attention

Ce changement de comportement figure dans le bundle 2023_03.

Pour connaître le statut actuel du bundle, reportez-vous à Historique du bundle.

Les UDFs dont le code du gestionnaire lit les fichiers d’une zone de préparation s’exécutera dans le contexte du propriétaire. L’appelant doit transmettre l’emplacement du fichier en tant qu’URL, que le code de gestionnaire se trouve dans une UDF ou dans une procédure et qu’il soit exécuté avec les droits de l’appelant ou du propriétaire :

Précédemment

Lorsque le code Java d’un gestionnaire d’UDF lit un fichier à partir d’une zone de préparation, il le fait en utilisant le contexte de l’appelant.

L’appelant peut transmettre l’emplacement du fichier à la fonction sous une forme telle que select my_function('@stage-name/filename.txt').

Le code du gestionnaire reçoit l’URL de la zone de préparation et lit le fichier avec SnowflakeFile.newInstance et SnowflakeFile.getInputStream ou reçoit le fichier en tant que java.io.InputStream :

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

Les fichiers lus par le code de gestionnaire peuvent se trouver sur une zone de préparation externe ou sur une zone de préparation interne utilisateur ou nommée.

Actuellement

Lorsque le code Java d’un gestionnaire d’UDF lit un fichier dans une zone de préparation, il le fait en utilisant le contexte du propriétaire.

Pour les UDFs et les procédures, l’appelant doit transmettre l’emplacement du fichier dans une URL scopée en utilisant la fonction BUILD_SCOPED_FILE_URL , comme dans l’exemple de fonction suivant :

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

Le code du gestionnaire reçoit l’URL scopée et lit le fichier comme auparavant.

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

Pour les fichiers dont l’emplacement est spécifié dans le code du gestionnaire (et non en tant qu’URLs transmise par un appelant), vous pouvez lire le fichier en zone de préparation de deux manières : le code du gestionnaire peut appeler la méthode newInstance avec une valeur booléenne pour un nouveau paramètre requireScopedUrl ; ou le code du gestionnaire doit utiliser une URL scopée lors de la création d’un InputStream à partir du chemin d’accès au fichier.

L’exemple suivant utilise SnowflakeFile.newInstance :

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

En outre, les zones de préparation utilisateur ne sont plus prises en charge en tant qu’emplacements pour les fichiers lus par un gestionnaire. Les fichiers lus par le code du gestionnaire doivent se trouver sur une zone de préparation externe ou sur une zone de préparation interne nommée.

Réf : 1008