Demander des références et des privilèges au niveau de l’objet des consommateurs¶
Cette rubrique décrit comment les fournisseurs peuvent configurer une Snowflake Native App pour demander l’accès à des objets du compte de consommateur qui existent en dehors de l’objet APPLICATION.
À propos des références¶
Dans certains contextes, une Snowflake Native App installée doit accéder à des objets existants dans le compte consommateur qui existent en dehors de l’objet APPLICATION. Par exemple, une application peut avoir besoin d’accéder à des tables existantes dans une base de données de consommateurs.
Dans ce contexte, il ne suffit pas que le consommateur accorde l’accès à un objet à l’objet APPLICATION, car l’application ne peut pas déterminer le nom du schéma et de l’objet dans le compte du consommateur.
Pour permettre à la Snowflake Native App d’accéder à des objets existants en dehors de l’objet APPLICATION, le Snowflake Native App Framework fournit des références qui permettent au client de spécifier le nom et le schéma d’un objet et d’activer l’accès à l’objet.
Workflow pour la définition de références dans le compte consommateur¶
Pour demander un privilège au niveau de la référence et de l’objet, le fournisseur effectue les opérations suivantes lors du développement et de la publication d’une Snowflake Native App :
Déterminez les objets qui nécessitent des références et les privilèges correspondants.
Ajoutez une procédure stockée dans le script d’installation pour gérer le rappel pour chaque référence définie dans le fichier manifeste.
Après avoir installé l”Snowflake Native App, le consommateur effectue les opérations suivantes :
Voir les références requises par l”Snowflake Native App.
Créez la référence en appelant la fonction système SYSTEM$REFERENCE.
Exécutez la procédure stockée de rappel en transmettant l’identifiant de la référence.
Une fois que le consommateur a exécuté la procédure stockée de rappel, l”Snowflake Native App peut accéder à l’objet demandé.
Ce workflow décrit le processus au cours duquel le consommateur crée la référence manuellement. Reportez-vous à Création d’une interface utilisateur pour demander des privilèges et des références pour obtenir des informations sur la création d’une interface utilisateur permettant aux consommateurs de créer des références et d’accorder des privilèges à l’aide de Snowsight.
Types d’objets et privilèges qu’une référence peut contenir¶
Le tableau suivant répertorie les types d’objets qu’une référence peut inclure et les privilèges autorisés pour chaque objet :
Type d’objet |
Privilèges autorisés |
---|---|
TABLE |
SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES |
VIEW |
SELECT, REFERENCES |
EXTERNAL TABLE |
SELECT, REFERENCES |
FUNCTION |
USAGE |
PROCEDURE |
USAGE |
WAREHOUSE |
MODIFY, MONITOR, USAGE, OPERATE |
API INTEGRATION |
USAGE |
EXTERNAL ACCESS INTEGRATION |
USAGE |
SECRET |
USAGE, READ |
Définir une référence dans le fichier manifeste¶
L’exemple suivant montre comment définir une référence dans le fichier manifest.yml
pour une table dans le compte de consommateur qui existe en dehors de l’objet APPLICATION :
references:
- consumer_table:
label: "Consumer table"
description: "A table in the consumer account that exists outside the APPLICATION object."
privileges:
- INSERT
- SELECT
object_type: TABLE
multi_valued: false
register_callback: config.register_single_reference
Cet exemple définit une référence nommée consumer_table
qui requiert les privilèges INSERT et SELECT sur une table du compte de consommateur. La propriété register_callback
spécifie une procédure stockée utilisée pour lier une table de consommateurs à cette définition de référence.
Utilisez multi_valued
pour lier plusieurs objets consommateurs à la même référence. Lorsque cette propriété est spécifiée, les mêmes opérations sont effectuées sur les objets avec une seule référence de valeur. La propriété peut également être utilisée avec des objets avec des références à valeurs multiples. Voir Fonctions de référence prises en charge pour en savoir plus sur les opérations de référence de Snowflake Native App Framework.
Supprimer une définition de référence¶
Note
Snowflake recommande de ne pas supprimer une définition de référence du fichier manifeste dans une nouvelle version d’une application. Si vous devez supprimer une référence définie, mettez à jour tout code qui utilise la référence supprimée dans la même version et informez-en le consommateur dans le fichier README.
Si une application définit une référence puis supprime la définition de la référence dans une version ultérieure de l’application, l’appel d’une fonction ou d’une procédure qui utilise encore la référence supprimée entraîne une erreur pour les consommateurs. Par exemple, le fichier manifeste de la version V1 de l’application my_app
comprend une définition de référence pour REF_TO_TABLE et une procédure stockée CREATE_VIEW_FROM_TABLE qui utilise la référence de table REF_TO_TABLE pour créer une vue VIEW_SELECT_FROM_DEFINED_REF.
Dans la version V2 de my_app
, la définition de référence pour REF_TO_TABLE est supprimée du fichier manifeste. Lorsqu’un consommateur met à niveau son application installée my_app
vers la version V2, l’appel à la procédure CREATE_VIEW_FROM_TABLE entraîne l’erreur suivante :
Reference definition '<REF_DEF_NAME>' cannot be found in the current version of the application '<APP_NAME>'
Créer une procédure stockée de rappel pour une référence¶
Après avoir défini une référence dans le fichier manifest.yml
, un fournisseur doit ajouter une procédure stockée dans le script d’installation pour enregistrer le rappel de la référence.
L’exemple suivant montre une procédure stockée utilisée pour gérer un rappel pour que la référence apparaisse dans Définir une référence dans le fichier manifeste :
CREATE APPLICATION ROLE app_admin;
CREATE OR ALTER VERSIONED SCHEMA config;
GRANT USAGE ON SCHEMA config TO APPLICATION ROLE app_admin;
CREATE PROCEDURE CONFIG.REGISTER_SINGLE_REFERENCE(ref_name STRING, operation STRING, ref_or_alias STRING)
RETURNS STRING
LANGUAGE SQL
AS $$
BEGIN
CASE (operation)
WHEN 'ADD' THEN
SELECT SYSTEM$SET_REFERENCE(:ref_name, :ref_or_alias);
WHEN 'REMOVE' THEN
SELECT SYSTEM$REMOVE_REFERENCE(:ref_name, :ref_or_alias);
WHEN 'CLEAR' THEN
SELECT SYSTEM$REMOVE_ALL_REFERENCES(:ref_name);
ELSE
RETURN 'unknown operation: ' || operation;
END CASE;
RETURN NULL;
END;
$$;
GRANT USAGE ON PROCEDURE CONFIG.REGISTER_SINGLE_REFERENCE(STRING, STRING, STRING)
TO APPLICATION ROLE app_admin;
Cet exemple crée une procédure stockée nommée REGISTER_SINGLE_REFERENCE
qui appelle une fonction système pour effectuer une opération spécifique sur une référence transmise en tant qu’argument à la procédure stockée.
Note
Comme la procédure stockée utilise la fonction système SYSTEM$SET_REFERENCE, elle ne fonctionne que pour une référence comportant une seule valeur dans la description. Pour associer une référence à plusieurs valeurs, utilisez la fonction système SYSTEM$ADD_REFERENCE.
Créer une procédure stockée de rappel pour demander la configuration d’un objet¶
Pour certains types d’objets, un fournisseur doit ajouter une procédure stockée au script d’installation afin de fournir une configuration supplémentaire. Ce rappel est utilisé lorsque les consommateurs autorisent les références à l’aide de Snowsight.
L’exemple suivant montre comment définir une procédure stockée de rappel de configuration pour la référence indiquée dans Définir une référence dans le fichier manifeste :
CREATE OR REPLACE CONFIG.GET_CONFIGURATION_FOR_REFERENCE(ref_name STRING)
RETURNS STRING
LANGUAGE SQL
AS
$$
BEGIN
CASE (ref_name)
WHEN 'CONSUMER_EXTERNAL_ACCESS' THEN
RETURN '{
"type": "CONFIGURATION",
"payload":{
"host_ports":["google.com"],
"allowed_secrets" : "LIST",
"secret_references":["CONSUMER_SECRET"]}}';
WHEN 'CONSUMER_SECRET' THEN
RETURN '{
"type": "CONFIGURATION",
"payload":{
"type" : "OAUTH2",
"security_integration": {
"oauth_scopes": ["https://www.googleapis.com/auth/analytics.readonly"],
"oauth_token_endpoint": "https://oauth2.googleapis.com/token",
"oauth_authorization_endpoint":
"https://accounts.google.com/o/oauth2/auth"}}}';
END CASE;
RETURN '';
END;
$$;
GRANT USAGE ON PROCEDURE CONFIG.GET_CONFIGURATION_FOR_REFERENCE(STRING)
TO APPLICATION ROLE app_admin;
Cet exemple crée une procédure stockée nommée GET_CONFIGURATION_FOR_REFERENCE
qui renvoie une configuration formatée JSON utilisée pour construire une référence de type EXTERNAL ACCESS INTEGRATION ou SECRET. Les entrées de l’instruction de commutation doivent mapper les noms de référence dans le fichier manifest.yml
.
Note
Cette fonction de rappel est requise par les références de type EXTERNAL ACCESS INTEGRATION et SECRET. Elle ne s’applique qu’à ce type de références.
Afficher les références définies dans une application¶
Lorsqu’un fournisseur définit des références dans le fichier manifest.yml
, celles-ci sont incluses dans l”Snowflake Native App installée.
Pour voir les références définies pour une Snowflake Native App, exécutez la commande SHOW REFERENCES comme indiqué dans l’exemple suivant :
SHOW REFERENCES IN APPLICATION hello_snowflake_app;
Lier un objet à l’application¶
Après avoir consulté la définition de la référence pour une Snowflake Native App, le consommateur crée une référence en exécutant la fonction système SYSTEM$REFERENCE, comme le montre l’exemple suivant :
SELECT SYSTEM$REFERENCE('table', 'db1.schema1.table1', 'persistent', 'select', 'insert');
Cette commande renvoie un identificateur pour la référence. Le consommateur peut transmettre l’identificateur à la procédure stockée de rappel pour la référence, comme le montre l’exemple suivant :
CALL app.config.register_single_reference(
'consumer_table' , 'ADD', SYSTEM$REFERENCE('TABLE', 'db1.schema1.table1', 'PERSISTENT', 'SELECT', 'INSERT'));
Dans cet exemple, consumer_table
est le nom de la référence définie dans le fichier manifest.yml
. Une fois que le consommateur a exécuté la procédure stockée qui associe la référence, la Snowflake Native App peut accéder à la table dans le compte consommateur.
La procédure stockée de rappel de la section précédente appelle la fonction système SYSTEM$SET_REFERENCE comme le montre l’exemple suivant :
SELECT SYSTEM$SET_REFERENCE(:ref_name, :ref_or_alias);
Reportez-vous à Fonctions de référence prises en charge pour connaître les autres fonctions système liées aux références.
Points à prendre en considération lors de l’utilisation de références¶
Snowflake vous recommande de ne pas modifier les définitions de référence d’une version à l’autre. Pour mettre à jour une définition de référence vers une nouvelle version, par exemple pour remplacer les privilèges de SELECT, INSERT de SELECT, vous devez définir une nouvelle définition de référence avec un nom différent. L”Snowflake Native App mise à jour peut utiliser cette nouvelle référence dans la nouvelle version de l’application.
Pour intégrer une référence dans un autre objet, par exemple pour affecter une référence à une variable, la référence doit déjà être liée à un objet dans le compte consommateur. Par exemple, vous ne pouvez pas créer une tâche si vous ne liez pas d’abord la référence à l’entrepôt du consommateur.
Exemple d’utilisation de références dans une Snowflake Native App¶
Les sections suivantes fournissent des exemples d’utilisation de références dans différents contextes.
Note
Les fonctions reference()
des exemples suivants ne peuvent être appelées que dans une procédure stockée dans l’objet APPLICATION.
Exécuter des requêtes à l’aide d’une référence¶
Les exemples suivants montrent comment exécuter des requêtes à l’aide de références :
SELECT * FROM reference('consumer_table');
SELECT reference('encrypt_func')(t.c1) FROM consumer_table t;
Appeler une procédure stockée à l’aide d’une référence¶
L’exemple suivant montre comment appeler une procédure stockée à l’aide d’une référence :
CALL reference('consumer_proc')(11, 'hello world');
Exécuter des commandes DML à l’aide d’une référence¶
Les exemples suivants montrent comment modifier des données d’une table à l’aide de références :
INSERT INTO reference('data_export')(C1, C2)
SELECT T.C1, T.C2 FROM reference('other_table')
COPY INTO reference('the_table') ...
Exécuter la commande DESCRIBE à l’aide d’une référence¶
L’exemple suivant montre comment exécuter l’opération DESCRIBE à l’aide d’une référence :
DESCRIBE TABLE reference('the_table')
Utiliser des références dans une tâche¶
CREATE TASK app_task
WAREHOUSE = reference('consumer_warehouse')
...;
ALTER TASK app_task SET WAREHOUSE = reference('consumer_warehouse');
Utiliser des références dans une définition de vue¶
CREATE VIEW app_view
AS SELECT reference('function')(T.C1) FROM reference('table') AS T;
Utiliser des références dans le corps d’une fonction¶
CREATE FUNCTION app.func(x INT)
RETURNS STRING
AS $$ select reference('consumer_func')(x) $$;
Utiliser des références dans une fonction externe¶
CREATE EXTERNAL FUNCTION app.func(x INT)
RETURNS STRING
...
API_INTEGRATION = reference('app_integration');
Utiliser des références dans une fonction ou une procédure¶
CREATE FUNCTION app.func(x INT)
RETURNS STRING
...
EXTERNAL_ACCESS_INTEGRATIONS = (reference('consumer_external_access_integration'), ...);
SECRETS = ('cred1' = reference('consumer_secret'), ...);
Note
Les consommateurs ne peuvent pas appeler directement des fonctions ou des procédures stockées qui contiennent des références à des intégrations ou à des secrets d’accès externes. Les références aux secrets et aux intégrations d’accès externes peuvent être utilisées par tous les autres composants de l’application, par exemple les applis Streamlit, les tâches, les autres fonctions et les procédures stockées.
Pour permettre aux consommateurs d’appeler directement une fonction ou une procédure stockée contenant des références à des intégrations d’accès externes ou à des secrets, les fournisseurs peuvent inclure une fonction contenant ces objets dans une fonction wrapper que le consommateur peut appeler directement.
Utiliser des références dans une politique¶
CREATE ROW ACCESS POLICY app_policy
AS (sales_region varchar) RETURNS BOOLEAN ->
'sales_executive_role' = reference('get_sales_team')
or exists (
select 1 from reference('sales_table')
where sales_manager = reference('get_sales_team')()
and region = sales_region
);
Format JSON de la réponse du rappel de configuration¶
La fonction de rappel de configuration renvoie une réponse au format JSON. Le format JSON renvoyé est différent pour l’intégration de l’accès externe et les références de secrets.
Format JSON pour l’intégration d’accès externe¶
Pour les références EXTERNAL ACCESS INTEGRATION, la structure attendue de la réponse JSON est la suivante :
{
"type": "CONFIGURATION",
"payload": {
"host_ports": ["host_port_1", ...],
"allowed_secrets": "NONE|ALL|LIST",
"secret_references": ["ref_name_1", ...]
}
}
host_ports
Un tableau de chaînes. Chaque valeur doit être un domaine valide.
Elle peut également inclure un port. La plage de ports valide est comprise entre 1 et 65535 compris. Si vous ne spécifiez pas de port, la valeur par défaut est 443. Si un réseau externe prend en charge des ports dynamiques, vous devez spécifier tous les ports possibles.
Pour autoriser l’accès à tous les ports, définissez le port sur 0. Par exemple,
company.com:0
.Ces valeurs sont utilisées pour créer une règle de réseau de sortie pour l’intégration de l’accès externe. Pour plus d’informations, voir CREATE NETWORK RULE.
allowed_secrets
Spécifie les secrets autorisés par la référence EXTERNAL ACCESS INTEGRATION. Les valeurs valides sont :
NONE
: les secrets ne sont pas autorisés.ALL
: autorise tout secret existant.LIST
: autorise un ensemble spécifique de secrets tel que spécifié dans la propriétésecret_references
.
Les valeurs de
allowed_secrets
sont utilisées pour créer l’intégration de l’accès externe. Pour plus d’informations, voir CREATE EXTERNAL ACCESS INTEGRATION.secret_references
:Spécifie une liste de références de secrets autorisées par l’intégration de l’accès externe.
Les valeurs spécifiées ici doivent être les mêmes que les références de secrets définies dans le manifeste.
Cette propriété n’est applicable que si la valeur de
allowed_secrets
est définie surLIST
. Dans ce contexte,secret_references
est nécessaire.
Format JSON des références de secrets¶
Pour les références de secrets, la structure attendue de la réponse JSON est la suivante :
{
"type": "CONFIGURATION",
"payload": {
"type": "OAUTH2",
"security_integration": {
"oauth_scopes": ["scope_1", "scope_2"],
"oauth_token_endpoint" : "token_endpoint",
"oauth_authorization_endpoint" : "auth_endpoint"
}
}
}
payload.type
Le type de secret. La valeur valide est la suivante :
OAUTH2
: spécifie le secret à utiliser avec le flux d’accord OAuth2. Pour plus d’informations, voir CREATE SECRET.
payload.security_integration
Spécifie les valeurs requises pour configurer l’authentificateur l’authentification d’API pour un secret OAuth.
Réponses d’erreurs au format JSON¶
En cas d’erreur ou si la référence n’est pas encore prête pour la configuration, la structure attendue de la réponse d’erreur est la suivante :
{
"type": "ERROR",
"payload":{
"message": "The reference is not available for configuration ..."
}
}
message
: le message d’erreur de l’application qui s’affiche dans Snowsight.
Fonctions de référence prises en charge¶
Le Snowflake Native App Framework prend en charge les fonctions suivantes pour effectuer différentes opérations liées aux références.
Fonction système |
Description |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|