CREATE FUNCTION (Snowpark Container Services)¶

Créez une fonction de service.

Cette commande prend en charge les variantes suivantes :

Voir aussi :

Fonctions de service, CREATE EXTERNAL FUNCTION, DESC FUNCTION, DROP FUNCTION, ALTER FUNCTION, CREATE OR ALTER <objet>

Syntaxe¶

CREATE [ OR REPLACE ] FUNCTION <name> ( [ <arg_name> <arg_data_type> ] [ , ... ] )
  RETURNS <result_data_type>
  [ [ NOT ] NULL ]
  [ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
  [ { VOLATILE | IMMUTABLE } ]
  SERVICE = <service_name>
  ENDPOINT = <endpoint_name>
  [ COMMENT = '<string_literal>' ]
  [ CONTEXT_HEADERS = ( <context_function_1> [ , <context_function_2> ...] ) ]
  [ MAX_BATCH_ROWS = <integer> ]
  [ MAX_BATCH_RETRIES = <integer> ]
  [ ON_BATCH_FAILURE = { ABORT | RETURN_NULL } ]
  [ BATCH_TIMEOUT_SECS = <integer> ]
  AS '<http_path_to_request_handler>'
Copy

Syntaxe des variantes¶

CREATE OR ALTER FUNCTION (Snowpark Container Services)¶

CrĂ©e une nouvelle fonction de service si elle n’existe pas encore ou modifie une fonction de service existante en fonction de service dĂ©finie dans l’instruction. Une instruction CREATE OR ALTER FUNCTION (Snowpark Container Services) suit les rĂšgles syntaxiques d’une instruction CREATE FUNCTION (Snowpark Container Services) et a les mĂȘmes limites qu’une instruction ALTER FUNCTION (Snowpark Container Services).

Les modifications de fonctions prises en charge comprennent les changements apportĂ©s Ă  ce qui suit :

  • CONTEXT_HEADERS

  • SERVICE

  • ENDPOINT

  • MAX_BATCH_ROWS

  • MAX_BATCH_RETRIES

  • ON_BATCH_FAILURE

  • BATCH_TIMEOUT_SECS

Pour plus d’informations, voir Notes sur l’utilisation de CREATE OR ALTER FUNCTION (Snowpark Container Services).

CREATE [ OR ALTER ] FUNCTION ...
Copy

ParamÚtres requis¶

name

SpĂ©cifie l’identificateur (name) et tout argument d’entrĂ©e pour la fonction.

  • L’identificateur n’a pas besoin d’ĂȘtre unique pour le schĂ©ma dans lequel la fonction est créée parce que les fonctions sont identifiĂ©es et rĂ©solues par leur combinaison de noms et types d’arguments.

  • L’identificateur doit commencer par un caractĂšre alphabĂ©tique et ne peut pas contenir d’espaces ou de caractĂšres spĂ©ciaux Ă  moins que toute la chaĂźne d’identificateur soit dĂ©limitĂ©e par des guillemets doubles (p. ex., « Mon objet Â»). Les identificateurs entre guillemets doubles sont Ă©galement sensibles Ă  la casse. Voir Exigences relatives Ă  l’identificateur.

( [ arg_name arg_data_type ] [ , ... ] )

Spécifie les arguments/entrées de la fonction de service. Ceux-ci doivent correspondre aux arguments attendus par le service.

S’il n’y a pas d’arguments, incluez les parenthĂšses sans nom d’argument et type de donnĂ©es.

RETURNS result_data_type

Spécifie le type de données du résultat renvoyé par la fonction.

SERVICE = service_name

Spécifie le nom du service Snowpark Container Services.

ENDPOINT = endpoint_name

Spécifie le nom du point de terminaison tel que défini dans la spécification de service.

AS http_path_to_request_handler

Spécifie le chemin HTTP vers le code de service qui est exécuté lorsque la fonction est appelée.

ParamÚtres facultatifs¶

[ [ NOT ] NULL ]

Indique si la fonction peut renvoyer des valeurs NULL ou doit uniquement renvoyer des valeurs NON-NULL. La valeur par dĂ©faut est NULL (c’est-Ă -dire que la fonction peut renvoyer NULL).

CALLED ON NULL INPUT ou . { RETURNS NULL ON NULL INPUT | STRICT }

SpĂ©cifie le comportement de la fonction lorsqu’elle est appelĂ©e avec des entrĂ©es « null Â». Contrairement aux fonctions dĂ©finies par le systĂšme, qui retournent toujours la valeur null lorsqu’une entrĂ©e est null, les fonctions peuvent gĂ©rer les entrĂ©es null, retournant des valeurs non nulles mĂȘme lorsqu’une entrĂ©e est null :

  • CALLED ON NULL INPUT appellera toujours la fonction avec des entrĂ©es null. Il appartient Ă  la fonction de traiter ces valeurs de maniĂšre appropriĂ©e.

  • RETURNS NULL ON NULL INPUT (ou son synonyme STRICT) n’appellera pas la fonction si une entrĂ©e est null. En revanche, une valeur null sera toujours retournĂ©e pour cette ligne. Notez que la fonction peut toujours retourner une valeur null pour les entrĂ©es non null.

Par dĂ©faut : CALLED ON NULL INPUT

{ VOLATILE | IMMUTABLE }

SpĂ©cifie le comportement de la fonction lors de l’affichage de rĂ©sultats :

  • VOLATILE : la fonction peut afficher des valeurs diffĂ©rentes pour diffĂ©rentes lignes, mĂȘme pour la mĂȘme entrĂ©e (par exemple en raison du non-dĂ©terminisme et du statut).

  • IMMUTABLE : la fonction suppose que la fonction, lorsqu’elle est appelĂ©e avec les mĂȘmes entrĂ©es, renvoie toujours le mĂȘme rĂ©sultat. Cette garantie n’est pas vĂ©rifiĂ©e. SpĂ©cifier IMMUTABLE pour une fonction qui retourne des valeurs diffĂ©rentes pour la mĂȘme entrĂ©e se traduira par un comportement indĂ©fini.

Par dĂ©faut : VOLATILE

MAX_BATCH_ROWS = integer

SpĂ©cifie la taille du lot lors de l’envoi de donnĂ©es Ă  un service pour augmenter la concurrence

MAX_BATCH_RETRIES = integer

Spécifie le nombre de tentatives que Snowflake doit effectuer pour rélancer un lot qui a échoué.

Par dĂ©faut : 3

ON_BATCH_FAILURE = { ABORT | RETURN_NULL }

Spécifie le comportement de la fonction aprÚs que Snowflake a atteint le nombre maximum de tentatives de traitement du lot.

  • ABORT : la fonction de service interrompt son exĂ©cution. Les lots de lignes restants ne sont pas traitĂ©s.

  • RETURN_NULL : la fonction de service renvoie une adresse NULL pour chaque ligne du lot qui a Ă©chouĂ© et poursuit le traitement des lots restants. Si vous choisissez cette option, notez les mises en garde suivantes :

    • Si ces lots dĂ©pendent les uns des autres et que l’un d’entre eux est dĂ©faillant, cela peut entraĂźner des rĂ©sultats inattendus.

    • Si votre service peut renvoyer une rĂ©ponse valide de type NULL, il n’est pas possible de faire la diffĂ©rence entre NULL renvoyĂ© par Snowflake en raison d’un Ă©chec de lot et NULL renvoyĂ© par votre service.

Par dĂ©faut : ABORT

BATCH_TIMEOUT_SECS = integer

SpĂ©cifie la durĂ©e maximale de traitement d’un seul lot de lignes, y compris les tentatives (et l’interrogation pour les requĂȘtes de fonctions asynchrones), aprĂšs laquelle Snowflake doit mettre fin Ă  la requĂȘte de lot.

Valeurs acceptables : supĂ©rieures Ă  0 et infĂ©rieures ou Ă©gales Ă  604 800 secondes (7 jours).

Valeur par dĂ©faut : 604 800 secondes (7 jours)

COMMENT = 'string_literal'

Spécifie un commentaire pour la fonction, qui est affiché dans la colonne DESCRIPTION de la sortie SHOW FUNCTIONS et de la sortie SHOW USER FUNCTIONS.

Par dĂ©faut : user-defined function

CONTEXT_HEADERS = ( context_function_1 [ , context_function_2 ...] )

Cela lie les rĂ©sultats de la fonction de contexte Snowflake aux en-tĂȘtes HTTP. (Pour plus d’informations sur les fonctions contextuelles de Snowflake, voir : Fonctions contextuelles).

Toutes les fonctions contextuelles ne sont pas prises en charge dans les en-tĂȘtes de contexte. Les Ă©lĂ©ments suivants sont pris en charge :

  • CURRENT_ACCOUNT()

  • CURRENT_CLIENT()

  • CURRENT_DATABASE()

  • CURRENT_DATE()

  • CURRENT_IP_ADDRESS()

  • CURRENT_REGION()

  • CURRENT_ROLE()

  • CURRENT_SCHEMA()

  • CURRENT_SCHEMAS()

  • CURRENT_SESSION()

  • CURRENT_STATEMENT()

  • CURRENT_TIME()

  • CURRENT_TIMESTAMP()

  • CURRENT_TRANSACTION()

  • CURRENT_USER()

  • CURRENT_VERSION()

  • CURRENT_WAREHOUSE()

  • LAST_QUERY_ID()

  • LAST_TRANSACTION()

  • LOCALTIME()

  • LOCALTIMESTAMP()

Lorsque les noms de fonction sont Ă©numĂ©rĂ©s dans la clause CONTEXT_HEADERS ils ne doivent pas ĂȘtre placĂ©s entre guillemets.

Snowflake ajoute sf-context Ă  l’en-tĂȘte avant que cette valeur ne soit Ă©crite dans la requĂȘte HTTP.

Exemple :

CONTEXT_HEADERS = (current_timestamp)
Copy

Dans cet exemple, Snowflake Ă©crit l’en-tĂȘte sf-context-current-timestamp dans la demande HTTP.

Les fonctions de contexte peuvent gĂ©nĂ©rer des caractĂšres non autorisĂ©s dans les valeurs d’en-tĂȘte HTTP, notamment (mais sans s’y limiter) :

  • nouvelle ligne

  • Ä

  • Î

  • ß

  • Ă«

  • ÂŹ

  • ±

  • ©

  • Âź

Snowflake remplace chaque sĂ©quence d’un ou plusieurs caractĂšres non autorisĂ©s par un espace. (Le remplacement se fait par sĂ©quence, pas par caractĂšre.)

Par exemple, supposons que la fonction de contexte CURRENT_STATEMENT() renvoie :

select
  /*Ă„ĂŽĂŸĂ«ÂŹÂ±Â©Âź*/
  my_service_function(1);
Copy

La valeur envoyĂ©e dans sf-context-current-statement est :

select /* */ my_service_function(1);
Copy

Pour garantir que le code de service puisse accĂ©der au rĂ©sultat d’origine (avec des caractĂšres non autorisĂ©s) Ă  partir de la fonction de contexte mĂȘme si les caractĂšres non autorisĂ©s ont Ă©tĂ© remplacĂ©s, Snowflake envoie Ă©galement un en-tĂȘte de contexte binaire qui contient le rĂ©sultat de la fonction de contexte codĂ© en base64.

Dans l’exemple ci-dessus, la valeur envoyĂ©e dans l’en-tĂȘte codĂ© en base64 est le rĂ©sultat de l’appel suivant :

base64_encode('select\n/Ă„ĂŽĂŸĂ«ÂŹÂ±Â©Âź/\nmy_service_function(1)')
Copy

Le service distant est chargé de décoder la valeur base64 si nécessaire.

Chacun de ces en-tĂȘtes base64 est nommĂ© selon la convention suivante :

sf-context-<context-function>-base64
Copy

Dans l’exemple ci-dessus, le nom de l’en-tĂȘte serait le suivant :

sf-context-current-statement-base64
Copy

Si aucun en-tĂȘte de contexte n’est envoyĂ©, aucun en-tĂȘte de contexte base64 n’est envoyĂ©.

Si les lignes envoyĂ©es Ă  une fonction de service sont rĂ©parties sur plusieurs lots, tous les lots contiennent les mĂȘmes en-tĂȘtes de contexte et les mĂȘmes en-tĂȘtes de contexte binaires.

Exigences en matiĂšre de contrĂŽle d’accĂšs¶

Un rĂŽle utilisĂ© pour exĂ©cuter cette opĂ©ration doit au minimum disposer des privilĂšges suivants :

PrivilĂšge

Objet

Remarques

CREATE FUNCTION

Schéma

USAGE

Point de terminaison de service

L’utilisation sur un point de terminaison de service est accordĂ©e aux rĂŽles de service dĂ©finis dans la spĂ©cification de service. Vous accordez ensuite le rĂŽle de service au rĂŽle crĂ©ant la fonction de service.

Le privilĂšge USAGE relatif Ă  la base de donnĂ©es et au schĂ©ma parents est exigĂ© pour effectuer des opĂ©rations sur tout objet d’un schĂ©ma.

Pour obtenir des instructions sur la crĂ©ation d’un rĂŽle personnalisĂ© avec un ensemble spĂ©cifique de privilĂšges, voir CrĂ©ation de rĂŽles personnalisĂ©s.

Pour des informations gĂ©nĂ©rales sur les rĂŽles et les privilĂšges accordĂ©s pour effectuer des actions SQL sur des objets sĂ©curisables, voir Aperçu du contrĂŽle d’accĂšs.

Notes gĂ©nĂ©rales sur l’utilisation¶

  • Les instructions CREATE OR REPLACE <objet> sont atomiques. En d’autres termes, lorsqu’un objet est remplacĂ©, l’ancien objet est supprimĂ© et le nouvel objet est créé dans une seule transaction.

  • Concernant les mĂ©tadonnĂ©es :

    Attention

    Les clients doivent s’assurer qu’aucune donnĂ©e personnelle (autre que pour un objet utilisateur), donnĂ©e sensible, donnĂ©e Ă  exportation contrĂŽlĂ©e ou autre donnĂ©e rĂ©glementĂ©e n’est saisie comme mĂ©tadonnĂ©e lors de l’utilisation du service Snowflake. Pour plus d’informations, voir Champs de mĂ©tadonnĂ©es dans Snowflake.

Notes sur l’utilisation de CREATE OR ALTER FUNCTION (Snowpark Container Services)¶

Les modifications suivantes ne sont pas prises en charge :

  • RETURNS

  • VolatilitĂ© (VOLATILE/IMMUTABLE)

  • Traitement des nuls (CALLED ON NULL INPUT / RETURNS NULL ON NULL)

Exemples¶

Créer une fonction de service simple¶

Dans Tutoriel-1, vous crĂ©ez la fonction de service suivante :

CREATE FUNCTION my_echo_udf (InputText VARCHAR)
  RETURNS VARCHAR
  SERVICE=echo_service
  ENDPOINT=echoendpoint
  AS '/echo';
Copy

Cette fonction se connecte Ă  l’élĂ©ment ENDPOINT spĂ©cifique de l’élĂ©ment SERVICE spĂ©cifiĂ©. Lorsque vous appelez cette fonction, Snowflake envoie une requĂȘte au chemin /echo dans le conteneur de service.

Remarques :

  • La fonction my_echo_udf prend une chaĂźne en entrĂ©e et renvoie une chaĂźne.

  • La propriĂ©tĂ© SERVICE identifie le service (echo_service) et la propriĂ©tĂ© ENDPOINT identifie le nom convivial du point de terminaison (echoendpoint).

  • AS '/echo' spĂ©cifie le chemin d’accĂšs au service. Dans echo_service.py (voir code de service), le dĂ©corateur @app.post associe ce chemin Ă  la fonction echo.

Modifier une fonction de service Ă  l’aide de la commande CREATE OR ALTER FUNCTION (Snowpark Container Services)¶

Modifier une fonction my_echo_udf pour dĂ©finir le nombre maximal de lignes du lot Ă  100, et ajouter un en-tĂȘte de contexte et un point de terminaison :

CREATE OR ALTER FUNCTION my_echo_udf (InputText VARCHAR)
  RETURNS VARCHAR
  SERVICE = echo_service
  ENDPOINT = reverse_echoendpoint
  CONTEXT_HEADERS = (current_account)
  MAX_BATCH_ROWS = 100
  AS '/echo';
Copy