CREATE FUNCTION (Snowpark Container Services)¶
Créez une fonction de service.
Cette commande prend en charge les variantes suivantes :
CREATE OR ALTER FUNCTION (Snowpark Container Services) : crĂ©e une fonction de service si elle nâexiste pas ou modifie une fonction de service existante.
- 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>'
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 ...
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 synonymeSTRICT
) 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Ă©cifierIMMUTABLE
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)
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);
La valeur envoyée dans
sf-context-current-statement
est :select /* */ my_service_function(1);
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)')
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
Dans lâexemple ci-dessus, le nom de lâen-tĂȘte serait le suivant :
sf-context-current-statement-base64
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';
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. Dansecho_service.py
(voir code de service), le décorateur@app.post
associe ce chemin Ă la fonctionecho
.
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';