CREATE EXTERNAL FUNCTION¶

Crée une nouvelle fonction externe.

Cette commande prend en charge les variantes suivantes :

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>';
Copy

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 ...
Copy

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. Si NULL 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 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 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Ă©cifier IMMUTABLE 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'
)
Copy

Ainsi, Snowflake ajoute deux en-tĂȘtes HTTP Ă  chaque demande HTTPS : sf-custom-volume-measure et sf-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)
Copy

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);
Copy

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

select /* */ my_external_function(1);
Copy

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)')
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

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 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';
Copy

Dans cet exemple :

  • local_echo est le nom appelĂ© Ă  partir d’une instruction SQL (par exemple, vous pouvez exĂ©cuter SELECT 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';
Copy