CREATE EXTERNAL FUNCTION¶
Crée une nouvelle fonction externe.
Cette commande prend en charge les variantes suivantes :
CREATE OR ALTER EXTERNAL FUNCTION : crĂ©e une fonction externe si elle nâexiste pas ou modifie une fonction externe existante.
- Voir aussi :
ALTER FUNCTION , SHOW EXTERNAL FUNCTIONS , DROP FUNCTION , DESCRIBE FUNCTION , CREATE API INTEGRATION, CREATE OR ALTER <objet>
Syntaxe¶
CREATE [ OR REPLACE ] [ SECURE ] EXTERNAL 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 } ]
[ COMMENT = '<string_literal>' ]
API_INTEGRATION = <api_integration_name>
[ HEADERS = ( '<header_1>' = '<value_1>' [ , '<header_2>' = '<value_2>' ... ] ) ]
[ CONTEXT_HEADERS = ( <context_function_1> [ , <context_function_2> ...] ) ]
[ MAX_BATCH_ROWS = <integer> ]
[ COMPRESSION = <compression_type> ]
[ REQUEST_TRANSLATOR = <request_translator_udf_name> ]
[ RESPONSE_TRANSLATOR = <response_translator_udf_name> ]
AS '<url_of_proxy_and_resource>';
Syntaxe des variantes¶
CREATE OR ALTER EXTERNAL FUNCTION¶
CrĂ©e une nouvelle fonction externe si elle nâexiste pas encore, ou modifie une fonction externe existante en fonction dĂ©finie dans lâinstruction. Une instruction CREATE OR ALTER EXTERNAL FUNCTION suit les rĂšgles syntaxiques dâune instruction CREATE EXTERNAL FUNCTION et prĂ©sente les mĂȘmes limitations quâune instruction ALTER FUNCTION.
Les modifications de fonctions prises en charge comprennent les changements apportés à ce qui suit :
API_INTEGRATION
COMMENTS
COMPRESSION
CONTEXT_HEADERS
HEADERS
MAX_BATCH_ROWS
RESPONSE_TRANSLATOR
REQUEST_TRANSLATOR
SECURE
Pour plus dâinformations, voir Notes sur lâutilisation de CREATE OR ALTER EXTERNALFUNCTION.
CREATE [ OR ALTER ] EXTERNAL FUNCTION ...
ParamÚtres requis¶
name
:SpĂ©cifie lâidentificateur pour la fonction.
Lâidentifiant peut contenir le nom du schĂ©ma et le nom de la base de donnĂ©es, ainsi que le nom de 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 leurs noms et types dâarguments. Cependant, la signature (nom et types de donnĂ©es dâargument) doit ĂȘtre unique dans le schĂ©ma.
Le
name
doit suivre les rĂšgles des identificateurs Snowflake. Pour plus de dĂ©tails, voir Exigences relatives Ă lâidentificateur.Le fait de donner le mĂȘme
name
que celui du service distant peut rendre la relation plus claire. Cependant, ce nâest pas requis.( [ arg_name arg_data_type ] [ , ... ] )
Spécifie les arguments/entrées pour la fonction externe. Ceux-ci doivent correspondre aux arguments attendus par le service distant.
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 renvoyé par la fonction.
API_INTEGRATION = api_integration_name
Il sâagit du nom de lâobjet dâintĂ©gration API qui doit ĂȘtre utilisĂ© pour authentifier lâappel au service proxy.
AS 'url_of_proxy_and_resource'
Il sâagit de lâURL dâappel du service proxy (par exemple, API Gateway ou service API Management) et de la ressource via laquelle Snowflake appelle le service distant.
ParamÚtres facultatifs¶
SECURE
PrĂ©cise que la fonction est sĂ©curisĂ©e. Si une fonction est sĂ©curisĂ©e, lâURL, les en-tĂȘtes HTTP et les en-tĂȘtes de contexte sont masquĂ©s Ă tous les utilisateurs qui ne sont pas propriĂ©taires de la fonction.
[ [ NOT ] NULL ]
La clause indique si la fonction peut renvoyer des valeurs NULL ou doit uniquement renvoyer des valeurs NON-NULL. Si
NOT NULL
est spécifié, la fonction doit renvoyer uniquement des valeurs non-NULL. SiNULL
est spĂ©cifiĂ©, la fonction peut renvoyer des valeurs NULL.Par dĂ©faut : la valeur est NULL (câest-Ă -dire que la fonction peut renvoyer des valeurs 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 nulle, les fonctions externes 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 renvoie toujours le mĂȘme rĂ©sultat lorsquâelle est appelĂ©e avec la mĂȘme entrĂ©e. Snowflake ne vĂ©rifie ni ne garantit cela ; le service distant doit ĂȘtre conçu pour se comporter de cette façon. SpĂ©cifierIMMUTABLE
pour une fonction qui retourne effectivement des valeurs diffĂ©rentes pour la mĂȘme entrĂ©e se traduira par un comportement indĂ©fini.
Par défaut :
VOLATILE
Snowflake vous recommande de dĂ©finir ce paramĂštre explicitement plutĂŽt que dâaccepter la valeur par dĂ©faut. La dĂ©finition de ce paramĂštre rĂ©duit explicitement le risque dâerreur et indique aux utilisateurs comment la fonction se comporte. (La commande SHOW EXTERNAL FUNCTIONS indique si une fonction est volatile ou immuable.)
Pour des informations complémentaires importantes sur les fonctions externes VOLATILE ou IMMUTABLE, voir Classer votre fonction comme volatile ou immuable.
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 EXTERNAL FUNCTIONS.
Par défaut :
user-defined function
HEADERS = ( 'header_1' = 'value_1' [ , 'header_2' = 'value_2' ... ] )
Cette clause permet aux utilisateurs de spĂ©cifier des mĂ©tadonnĂ©es de valeur clĂ© envoyĂ©es avec chaque demande. Le crĂ©ateur de la fonction externe dĂ©cide de ce qui va dans les en-tĂȘtes, et lâappelant nâa aucun contrĂŽle dessus. Snowflake ajoute tous les noms dâen-tĂȘte spĂ©cifiĂ©s avec le prĂ©fixe « sf-custom- » et les envoie en tant quâen-tĂȘtes HTTP.
La valeur doit ĂȘtre une chaĂźne constante, pas une expression.
Voici un exemple :
HEADERS = ( 'volume-measure' = 'liters', 'distance-measure' = 'kilometers' )
Ainsi, Snowflake ajoute deux en-tĂȘtes HTTP Ă chaque demande HTTPS :
sf-custom-volume-measure
etsf-custom-distance-measure
, avec leurs valeurs correspondantes.Les rĂšgles pour les noms dâen-tĂȘte sont diffĂ©rentes des rĂšgles pour les identificateurs de base de donnĂ©es Snowflake. Les noms dâen-tĂȘte peuvent ĂȘtre composĂ©s des caractĂšres ASCII standard les plus visibles (dĂ©cimaux 32-126), Ă lâexception des suivants :
caractĂšre dâespacement
(
)
,
/
:
;
<
>
=
"
?
@
[
]
\
{
}
_
Notez spĂ©cifiquement que le caractĂšre de soulignement nâest pas autorisĂ© dans les noms dâen-tĂȘte.
Le nom et la valeur de lâen-tĂȘte sont dĂ©limitĂ©s par des guillemets simples, de sorte que tout guillemet simple Ă lâintĂ©rieur du nom ou de la valeur de lâen-tĂȘte doit ĂȘtre Ă©chappĂ© avec la barre oblique inverse.
Si la barre oblique inverse est utilisĂ©e comme un caractĂšre littĂ©ral dans une valeur dâen-tĂȘte, elle doit ĂȘtre Ă©chappĂ©e.
Dans les valeurs dâen-tĂȘte, les espaces et les tabulations sont autorisĂ©s, mais les valeurs dâen-tĂȘte ne doivent pas contenir plus dâun caractĂšre dâespacement par ligne. Cette restriction sâapplique aux combinaisons de caractĂšres dâespacement (par exemple, un espace suivi dâun onglet), ainsi quâaux caractĂšres dâespacement individuels (par exemple deux espaces consĂ©cutifs).
Si lâauteur de la fonction marque la fonction comme sĂ©curisĂ©e (avec
CREATE SECURE EXTERNAL FUNCTION...
), alors les en-tĂȘtes, les en-tĂȘtes de contexte, les en-tĂȘtes de contexte binaires et les URL ne sont pas visibles pour les utilisateurs de la fonction.La somme des tailles des noms dâen-tĂȘte et des valeurs dâen-tĂȘte pour une fonction externe doit ĂȘtre infĂ©rieure ou Ă©gale Ă 8 KB.
CONTEXT_HEADERS = ( context_function_1 [ , context_function_2 ...] )
Ceci est similaire Ă HEADERS, mais au lieu dâutiliser des chaĂźnes constantes, 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 ce ne soit Ă©crit 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 caractĂšres autorisĂ©s dans les noms et valeurs dâen-tĂȘtes de contexte sont les mĂȘmes que ceux autorisĂ©s dans les noms et valeurs dâen-tĂȘtes personnalisĂ©s.
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_external_function(1);
La valeur envoyée dans
sf-context-current-statement
est :select /* */ my_external_function(1);
Pour garantir que les services distants puissent 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 base64 est le rĂ©sultat de lâappel :
base64_encode('select\n/ĂĂĂ돱©Ÿ/\nmy_external_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
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 externe 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.
MAX_BATCH_ROWS = integer
Cela spécifie le nombre maximal de lignes de chaque lot envoyées au service proxy.
Le but de ce paramĂštre est de limiter la taille des lots pour les services distants qui ont des contraintes de mĂ©moire ou dâautres limitations. Ce paramĂštre nâest pas un paramĂštre de rĂ©glage des performances. Ce paramĂštre indique une taille maximale, et non une taille recommandĂ©e.
Si vous ne spĂ©cifiez pas MAX_BATCH_ROWS, Snowflake estime la taille de lot optimale et lâutilise.
Snowflake recommande de ne pas régler ce paramÚtre, sauf si le service distant exige une limite.
COMPRESSION = compression_type
Si cette clause est spĂ©cifiĂ©e, la charge utile JSON est compressĂ©e lorsquâelle est envoyĂ©e de Snowflake au service proxy et lorsquâelle est renvoyĂ©e du service proxy Ă Snowflake.
Les valeurs valides sont :
NONE
.GZIP
.DEFLATE
.AUTO
.Sur AWS,
AUTO
est Ă©quivalent ĂGZIP
.Sur Azure,
AUTO
est Ă©quivalent ĂNONE
.Sur GCP,
AUTO
est Ă©quivalent ĂNONE
.
Amazon API Gateway compresse/dĂ©compresse automatiquement les demandes. Pour plus dâinformations sur la compression et la dĂ©compression dâAmazon API Gateway, voir : https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-gzip-compression-decompression.html
Pour plus dâinformations sur la compression et la dĂ©compression pour dâautres services proxy de plate-forme Cloud, consultez la documentation de ces plates-formes Cloud.
Par défaut : la valeur par défaut est
AUTO
.REQUEST_TRANSLATOR = request_translator_udf_name
SpĂ©cifie le nom de la fonction de traducteur de requĂȘtes. Pour plus dâinformations, voir Utilisation de traducteurs de requĂȘtes et de rĂ©ponses avec des donnĂ©es pour un service distant.
RESPONSE_TRANSLATOR = response_translator_udf_name
SpĂ©cifie le nom de la fonction de traducteur de rĂ©ponses. Pour plus dâinformations, voir Utilisation de traducteurs de requĂȘtes et de rĂ©ponses avec des donnĂ©es pour un service distant.
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 |
Operating on functions also requires the USAGE privilege on the parent database and schema. |
Soit OWNERSHIP soit USAGE |
intégration API |
Requis pour créer des fonctions externes qui font référence à une intégration API. |
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¶
Lorsque la compression est utilisĂ©e, Snowflake dĂ©finit les en-tĂȘtes HTTP « Content-Encoding » et « Accept-Encoding ».
Les types dâarguments et le type de retour ne peuvent pas ĂȘtre GEOGRAPHY.
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.
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.
Notes sur lâutilisation de CREATE OR ALTER EXTERNALFUNCTION¶
Les modifications de la définition de la fonction et de son type de retour ne sont pas prises en charge.
Exemples¶
Créer une fonction externe via un service proxy Amazon API Gateway¶
Lâexemple suivant montre une instruction CREATE EXTERNAL FUNCTION qui est appelĂ©e via un service proxy Amazon API Gateway :
CREATE OR REPLACE EXTERNAL FUNCTION local_echo(string_col VARCHAR)
RETURNS VARIANT
API_INTEGRATION = demonstration_external_api_integration_01
AS 'https://xyz.execute-api.us-west-2.amazonaws.com/prod/remote_echo';
Dans cet exemple :
local_echo
est le nom appelĂ© Ă partir dâune instruction SQL (par exemple, vous pouvez exĂ©cuterSELECT local_echo(varchar_column) ...;
).string_col VARCHAR
contient le nom et le type de donnĂ©es des paramĂštres dâentrĂ©e. Une fonction externe peut possĂ©der de zĂ©ro Ă plusieurs paramĂštres dâentrĂ©e.variant
est le type de données de la valeur renvoyée par la fonction externe.Le nom
demonstration_external_api_integration_01
est le nom de lâintĂ©gration API créée prĂ©cĂ©demment dans lâinstruction CREATE API INTEGRATION.LâURL
https://xyz.execute-api.us-west-2.amazonaws.com/prod/remote_echo
est la chaßne qui identifie le service proxy et la ressource. Une commande HTTP POST est envoyée à cette URL.
Modifier une fonction externe Ă lâaide de la commande CREATE OR ALTER EXTERNAL FUNCTION¶
Modifier la fonction externe local_echo
créée ci-dessus pour dĂ©finir le nombre maximal de lignes du lot Ă 100, la compression Ă GZIP, et ajouter des en-tĂȘtes et un en-tĂȘte contextuel :
CREATE OR ALTER SECURE EXTERNAL FUNCTION local_echo(string_col VARCHAR)
RETURNS VARIANT
API_INTEGRATION = demonstration_external_api_integration_01
HEADERS = ('header_variable1'='header_value', 'header_variable2'='header_value2')
CONTEXT_HEADERS = (current_account)
MAX_BATCH_ROWS = 100
COMPRESSION = "GZIP"
AS 'https://xyz.execute-api.us-west-2.amazonaws.com/prod/remote_echo';