Vue d’ensemble des procédures stockées¶
Vous pouvez écrire des procédures stockées pour étendre le système avec du code procédural. Avec une procédure, vous pouvez utiliser des branchements, des boucles et d’autres constructions programmatiques. Vous pouvez réutiliser une procédure plusieurs fois en l’appelant à partir d’un autre code.
Avec une procédure stockée, vous pouvez :
Automatiser les tâches qui nécessitent l’exécution fréquente de plusieurs opérations sur la base de données.
Créer et exécuter dynamiquement des opérations de base de données.
Exécuter du code avec les privilèges du rôle propriétaire de la procédure plutôt qu’avec les privilèges du rôle qui exécute la procédure.
Cela permet au propriétaire de la procédure stockée de déléguer le pouvoir d’effectuer des opérations spécifiées à des utilisateurs qui, autrement, ne pourraient pas le faire. Cependant, il existe des limitations à ces procédures stockées avec droits du propriétaire.
Par exemple, imaginons que vous souhaitiez « nettoyer » une base de données en supprimant des données antérieures à une date spécifiée. Vous pouvez exécuter l’opération de suppression plusieurs fois dans votre code, en supprimant à chaque fois les données d’une table spécifique. Vous pouvez placer toutes ces instructions dans une seule procédure stockée, puis passer un paramètre qui spécifie la date limite.
Une fois la procédure déployée, vous pouvez l’appeler pour nettoyer la base de données. Au fur et à mesure que votre base de données évolue, vous pouvez mettre à jour la procédure pour nettoyer des tables supplémentaires ; si plusieurs utilisateurs utilisent la nouvelle commande de nettoyage, ils peuvent appeler une seule procédure, plutôt que de se souvenir de chaque nom de table et de nettoyer chaque table individuellement.
Une procédure stockée est comme une UDF, mais les deux diffèrent sur des points importants. Pour plus d’informations, voir Choisir d’écrire une procédure stockée ou une fonction définie par l’utilisateur.
Une procédure n’est qu’un moyen parmi d’autres d’étendre Snowflake. Pour les autres, voir ce qui suit :
Langages et outils pris en charge¶
Vous pouvez créer et gérer des procédures stockées (et d’autres entités Snowflake) à l’aide de plusieurs outils, en fonction de votre méthode de travail.
Langage |
Approche |
Assistance |
---|---|---|
SQL Avec un gestionnaire en Java, JavaScript, Python, Scala, ou SQL Scripting |
Écrivez le code SQL dans Snowflake pour créer et gérer des entités Snowflake. Rédigez la logique de la procédure dans l’un des langages de gestionnaire pris en charge. |
|
Java, Python, ou Scala |
Sur le client, écrivez le code des opérations qui sont transmises à Snowflake pour traitement. |
|
Interface de ligne de commande |
Utilisez la ligne de commande pour créer et gérer des entités Snowflake, en spécifiant des propriétés en tant que propriétés d’objets JSON. |
|
Python |
Sur le client, écrivez du code qui exécute des opérations de gestion sur Snowflake. |
|
REST |
Effectuez des requêtes auprès des points de terminaison RESTful pour créer et gérer des entités Snowflake. |
Vous écrivez la logique d’une procédure (son gestionnaire) dans l’un des langages pris en charge. Une fois que vous avez un gestionnaire, vous pouvez créer une procédure avec une commande CREATE PROCEDURE, puis appeler la procédure avec une instruction CALL.
À partir d’une procédure stockée, vous pouvez renvoyer une valeur unique ou (si le langage du gestionnaire le permet) des données tabulaires. Pour plus d’informations sur les types de retour pris en charge, voir CREATE PROCEDURE.
Lorsque vous choisissez un langage, tenez également compte des emplacements du gestionnaire pris en charge. Tous les langages ne permettent pas de faire référence au gestionnaire sur une zone de préparation (le code du gestionnaire doit être en ligne). Pour plus d’informations, consultez Conserver le code du gestionnaire en ligne ou dans une zone de préparation.
Langage |
Emplacement du gestionnaire |
---|---|
Java |
En ligne ou en zone de préparation |
JavaScript |
En ligne |
Python |
En ligne ou en zone de préparation |
Scala |
En ligne ou en zone de préparation |
Exécution de scripts Snowflake |
En ligne |
Note
Pour créer et appeler une procédure anonyme, utilisez CALL (avec procédure anonyme). La création et l’appel d’une procédure anonyme ne nécessitent pas un rôle avec des privilèges de schéma CREATE PROCEDURE.
Exemple de procédure stockée¶
Le code de l’exemple suivant crée une procédure stockée appelée myproc
avec un gestionnaire Python appelé run
.
CREATE OR REPLACE PROCEDURE myproc(from_table STRING, to_table STRING, count INT)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = '3.9'
PACKAGES = ('snowflake-snowpark-python')
HANDLER = 'run'
as
$$
def run(session, from_table, to_table, count):
session.table(from_table).limit(count).write.save_as_table(to_table)
return "SUCCESS"
$$;
Le code de l’exemple suivant appelle la procédure stockée myproc
.
CALL myproc('table_a', 'table_b', 5);
Lignes directrices et contraintes¶
- Conseils:
Pour des conseils sur l’écriture de procédures stockées, voir Travailler avec des procédures stockées.
- Contraintes liées à Snowflake:
Vous pouvez assurer la stabilité de l’environnement Snowflake en vous développant dans le cadre des contraintes de Snowflake. Pour plus d’informations, consultez Concevoir des gestionnaires qui respectent les contraintes imposées par Snowflake.
- Nommage:
Veillez à nommer les procédures de manière à éviter les collisions avec d’autres procédures. Pour plus d’informations, consultez Nommage et surcharge de procédures et d’UDFs.
- Arguments:
Spécifiez les arguments de votre procédure stockée et indiquez quels arguments sont facultatifs. Pour plus d’informations, consultez Définition des arguments pour UDFs et les procédures stockées.
- Mappages de types de données:
Pour chaque langage de traitement, il existe un ensemble distinct de mappages entre les types de données du langage et les types SQL utilisés pour les arguments et les valeurs de retour. Pour plus d’informations sur les mappages pour chaque langage, voir Mappage des types de données entre SQL et les langages de traitement.
Écriture du gestionnaire¶
- Langues du gestionnaire:
Pour du contenu spécifique à une langue sur l’écriture d’un gestionnaire, consultez Langages et outils pris en charge.
- Accès au réseau externe:
Vous pouvez accéder aux emplacements réseau externes avec un accès au réseau externe. Vous pouvez créer un accès sécurisé à des emplacements réseau spécifiques externes à Snowflake, puis utiliser cet accès à partir du code du gestionnaire.
- Journalisation et traçage:
Vous pouvez enregistrer l’activité du code en capturant les messages du journal et les événements de trace, en stockant les données dans une base de données que vous pouvez interroger ultérieurement.
Sécurité¶
Le fait qu’une procédure stockée soit exécutée avec les droits de l’appelant ou du propriétaire peut avoir une incidence sur les informations auxquelles elle a accès et sur les tâches qu’elle peut être autorisée à effectuer. Pour plus d’informations, consultez Présentation des procédures stockées des droits de l’appelant et des droits du propriétaire.
Les procédures stockées partagent certains problèmes de sécurité avec les fonctions définies par l’utilisateur (UDFs). Pour plus d’informations, voir ci-dessous :
Vous pouvez aider le code du gestionnaire d’une procédure à s’exécuter en toute sécurité en suivant les bonnes pratiques décrites dans la section Pratiques de sécurité pour UDFs et procédures
Veillez à ce que les informations sensibles soient dissimulées aux utilisateurs qui ne devraient pas y avoir accès. Pour plus d’informations, voir Protection des informations sensibles avec les UDFs et les procédures stockées sécurisées
Déploiement du code du gestionnaire¶
Lors de la création d’une procédure, vous pouvez spécifier son gestionnaire (qui met en œuvre la logique de la procédure) en tant que code en ligne avec l’instruction CREATE PROCEDURE ou en tant que code externe à l’instruction, tel que le code compilé et copié dans une zone de préparation.
Pour plus d’informations, voir Conserver le code du gestionnaire en ligne ou dans une zone de préparation.