Présentation des UDFs SQL

Vous pouvez écrire le gestionnaire d’une fonction définie par l’utilisateur (UDF) en SQL. Les rubriques de cette section décrivent comment concevoir et écrire un gestionnaire SQL. Vous trouverez également des exemples.

Pour une introduction aux UDFs, y compris une liste de langages dans lesquels vous pouvez écrire un gestionnaire d’UDF, reportez-vous à Vue d’ensemble des fonctions définies par l’utilisateur.

Une fois que vous avez un gestionnaire, vous créez l’UDF avec SQL. Pour plus d’informations sur l’utilisation de SQL pour créer ou appeler une UDF, reportez-vous à Création d’une UDF ou Appel d’une UDF.

Note

Pour les limitations liées aux gestionnaires d’UDF SQL, reportez-vous à Limites liées aux UDF SQL.

Dans ce chapitre :

Comment fonctionne un gestionnaire SQL

Lorsqu’un utilisateur appelle une UDF, il transmet le nom et les arguments de l’UDF à Snowflake. Snowflake appelle le code du gestionnaire associé (avec des arguments, le cas échéant) pour exécuter la logique de l’UDF. La méthode de gestion renvoie ensuite la sortie à Snowflake, qui la renvoie au client.

La définition de la fonction peut être une expression SQL qui retourne soit une valeur scalaire (c’est-à-dire unique), soit, si elle est définie comme fonction de table, un ensemble de lignes.

Exemple

Le code de l’exemple suivant crée une UDF appelée area_of_circle contenant un code de gestionnaire qui calcule la surface d’un cercle à partir de la valeur du rayon reçue par l’UDF en tant qu’argument.

CREATE FUNCTION area_of_circle(radius FLOAT)
  RETURNS FLOAT
  AS
  $$
    pi() * radius * radius
  $$
  ;
Copy

Utilisation générale

Un UDF SQL évalue une expression arbitraire SQL et retourne les résultats de l’expression.

La définition de la fonction peut être une expression SQL qui retourne soit une valeur scalaire (c’est-à-dire unique), soit, si elle est définie comme fonction de table, un ensemble de lignes.

Exigences en matière de sécurité et de privilège pour les UDFs SQL

Si une définition de fonction fait référence à une table non qualifiée, cette table est résolue dans le schéma contenant la fonction. Une référence à un autre objet de schéma (par exemple, une table, une vue ou une autre fonction) nécessite que le propriétaire de la fonction ait les privilèges nécessaires pour accéder à cet objet de schéma. L’appelant de la fonction n’a pas besoin d’avoir accès aux objets référencés dans la définition de la fonction, mais seulement d’avoir le privilège d’utiliser la fonction.

Par exemple, un administrateur possède une table nommée users, qui contient des données sensibles qui ne sont pas généralement accessibles, mais l’administrateur peut afficher le nombre total d’utilisateurs grâce à une fonction sur laquelle les autres utilisateurs ont des privilèges d’accès :

use role dataadmin;

desc table users;

+-----------+--------------+--------+-------+---------+-------------+------------+--------+------------+---------+
| name      | type         | kind   | null? | default | primary key | unique key | check  | expression | comment |
|-----------+--------------+--------+-------+---------+-------------+------------+--------+------------+---------|
| USER_ID   | NUMBER(38,0) | COLUMN | Y     | [NULL]  | N           | N          | [NULL] | [NULL]     | [NULL]  |
| USER_NAME | VARCHAR(100) | COLUMN | Y     | [NULL]  | N           | N          | [NULL] | [NULL]     | [NULL]  |
  ...
  ...
  ...
+-----------+--------------+--------+-------+---------+-------------+------------+--------+------------+---------+

create function total_user_count() returns number as 'select count(*) from users';

grant usage on function total_user_count() to role analyst;

use role analyst;

-- This will fail because the role named "analyst" does not have the
-- privileges required in order to access the table named "users".
select * from users;

FAILURE: SQL compilation error:
Object 'USERS' does not exist.

-- However, this will succeed.
select total_user_count();

+--------------------+
| TOTAL_USER_COUNT() |
|--------------------+
| 123                |
+--------------------+
Copy

Pour plus d’informations sur les rôles et les privilèges de gestion du contrôle d’accès, voir Aperçu du contrôle d’accès.