Utilisation de références pour autoriser l’accès aux objets¶
Une référence peut être utilisée pour autoriser l’accès à des objets à une procédure stockée, une application ou une instance de classe qui n’a pas accès à ces objets par défaut.
Dans ce chapitre :
Introduction¶
Une référence est une chaîne qui peut être utilisée comme identificateur. L’identificateur renvoie à l’objet référencé.
Une référence encapsule les éléments suivants :
Le nom de l’objet.
Le rôle actif utilisé pour créer la référence de l’objet et tout rôle secondaire actif, le cas échéant.
Le(s) privilège(s) sur l’objet spécifié(s) lors de la création de la référence.
Voici quelques exemples de situations dans lesquelles une référence peut être nécessaire :
Une procédure stockée des droits du propriétaire nécessite un accès pour insérer des données dans une table appartenant à un rôle différent.
Une application effectue des analyses de données et nécessite un accès en lecture aux données contenues dans les tables.
Une instance de la classe SNOWFLAKE.ML.ANOMALY_DETECTION a besoin d’un accès en lecture à une vue pour entraîner le modèle de ML de détection d’anomalies.
Objets identifiés par leur nom¶
Une référence identifie un objet par son nom. Cela signifie que si un objet est renommé après la création d’une référence, celle-ci n’est pas valide. Toutefois, si un nouvel objet portant le même nom est créé, la référence peut être valide. Par exemple, un rôle my_role
crée une référence my_ref1
pour la table my_table1
avec le privilège SELECT. Une fois la référence créée, la table my_table1
est supprimée et une nouvelle table nommée my_table1
est créée. La référence my_ref1
identifie une table portant le nom my_table1
. Dans ce cas, elle identifie la nouvelle table my_table1
.
Si le rôle utilisé pour créer la référence et le(s) privilège(s) accordé(s) sur my_table1
sont toujours valides, l’accès à la nouvelle my_table1
est autorisé lors de l’utilisation de la référence.
Si le rôle et les privilèges contenus dans la référence ne sont plus valables, l’accès à la table my_table1
ne peut être autorisé et une nouvelle référence doit être créée pour la nouvelle table.
Privilèges vérifiés au moment de l’exécution¶
Les privilèges accordés au rôle qui a créé la référence sont vérifiés au moment de l’utilisation de la référence. Par exemple, un rôle my_role
crée une référence à une table t1
avec le privilège SELECT. Si my_role
est supprimé ou si le privilège SELECT sur la table t1
est révoqué à partir de my_role
, les privilèges encapsulés dans la référence ne sont plus valides. Lorsque la référence est transmise à une procédure stockée qui requiert le privilège SELECT sur la table, la procédure stockée échoue avec une erreur de permission.
Types de références et durée de vie des références¶
La durée de vie d’une référence peut être spécifiée au moment de la création.
Une référence transitoire a une durée de vie limitée, soit pour la durée de l’appel dans lequel la référence est transmise, soit pour la durée de la session.
Une référence persistante a une durée de vie illimitée. La référence reste valide jusqu’à ce que l’objet qu’elle référence soit supprimé, que la référence soit désactivée ou qu’elle devienne non valide.
Pour des exemples de références non paramétrées, voir Annuler une référence persistante pour une application.
Une référence peut devenir non valide pour l’une des raisons suivantes :
L’objet auquel il fait référence est renommé.
Le rôle qui a créé la référence est supprimé.
Le rôle qui a créé la référence n’a plus de privilèges sur l’objet.
Pour plus d’informations, voir Objets identifiés par leur nom et Privilèges vérifiés au moment de l’exécution.
Références pour les procédures stockées de droits du propriétaire¶
Une procédure stockée des droits du propriétaire s’exécute avec les privilèges du propriétaire plutôt qu’avec les privilèges de l”appelant qui exécute la procédure stockée. Pour effectuer des actions sur une table, une vue ou une fonction à laquelle l’appelant a des privilèges d’accès, l’appelant doit transmettre une référence à la table, à la vue ou à la fonction. La référence permet à la procédure stockée d’effectuer des actions sur l’objet que la référence identifie avec les privilèges du créateur de la référence (dans ce cas, l’appelant).
Références pour les applications et les classes¶
Par nature, les applications et les classes n’ont pas accès aux objets du compte dans lequel l’application est installée ou une instance d’une classe est créée. Les utilisateurs peuvent autoriser l’accès à des objets à une application ou à une instance de classe en créant une référence.
Fournisseurs et consommateurs d’applications et de classes¶
Un fournisseur crée une application et un consommateur installe et utilise une application sur le compte du consommateur. Dans le cas de Classes Snowflake, Snowflake est le fournisseur, et un utilisateur possédant un compte Snowflake qui crée une instance d’une classe est le consommateur.
Les fournisseurs peuvent créer des applications et des classes qui demandent et utilisent des références dans leur code. Pour plus d’informations, consultez Références pour les fournisseurs.
Les consommateurs peuvent créer et transmettre des références à des applications qu’ils installent dans leur compte ou à des instances de classes Snowflake. Pour plus d’informations, consultez Références pour les consommateurs.
Cibles prises en charge pour les références¶
Les cibles d’une référence peuvent être un objet ou une requête. Si la cible de la référence est un objet, le(s) privilège(s) sur l’objet est (sont) nécessaire(s) pour la référence.
Types d’objets pris en charge et privilèges pour les références¶
Le tableau suivant répertorie les types d’objets qu’une référence peut inclure, le type de référence qui peut être créé et les privilèges autorisés pour chaque objet :
Type d’objet |
Transitoire |
Persistant |
Privilèges autorisés |
Privilège par défaut |
---|---|---|---|---|
DATABASE |
✔ |
APPLYBUDGET |
||
SCHEMA |
✔ |
APPLYBUDGET |
||
TABLE |
✔ |
APPLYBUDGET |
||
✔ |
✔ |
SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES |
SELECT |
|
VIEW |
✔ |
✔ |
SELECT, REFERENCES |
SELECT |
MATERIALIZED VIEW |
✔ |
APPLYBUDGET |
||
EXTERNAL TABLE |
✔ |
SELECT, REFERENCES |
SELECT |
|
PIPE |
✔ |
APPLYBUDGET |
APPLYBUDGET |
|
TASK |
✔ |
APPLYBUDGET |
APPLYBUDGET |
|
FUNCTION |
✔ |
✔ |
USAGE |
USAGE |
PROCEDURE |
✔ |
USAGE |
USAGE |
|
WAREHOUSE |
✔ |
APPLYBUDGET |
||
✔ |
MODIFY, MONITOR, OPERATE, USAGE |
USAGE |
||
API INTEGRATION |
✔ |
USAGE |
USAGE |
Références de la requête¶
Une référence de requête est un type de référence transitoire. Elle fait référence à une instruction SELECT qui peut être utilisée dans la clause FROM d’une autre instruction SQL dans une procédure stockée. Vous pouvez créer une référence de requête en utilisant la fonction SYSTEM$QUERY_REFERENCE.
Pour plus d’informations, consultez Utilisation des références de requête.
Références pour les fournisseurs¶
Vous pouvez créer des applications en tant que fournisseur en utilisant le Snowflake Native App Framework. Pour des informations détaillées sur la demande de références auprès d’un consommateur de votre application, voir Demander des références et des privilèges au niveau de l’objet des consommateurs.
Références pour les consommateurs¶
Vous pouvez créer une référence en utilisant la fonction SYSTEM$REFERENCE. Vous pouvez transmettre l’identificateur de chaîne que la fonction renvoie à une procédure stockée, à une application ou à une instance de classe. Vous pouvez également transmettre l’instruction qui crée la référence à la place de l’identificateur de la chaîne.
Exemples¶
Créez une référence transitoire avec une portée de session vers la table t1
avec le privilège SELECT :
SELECT SYSTEM$REFERENCE('TABLE', 't1', 'SESSION', 'SELECT');
Pour créer une référence à la même table pendant toute la durée de vie de la portée dans laquelle elle est référencée (par exemple, si vous la transmettez à une procédure stockée, sa durée de vie sera celle du bloc le plus externe de la procédure stockée), exécutez l’instruction suivante :
SELECT SYSTEM$REFERENCE('TABLE', 't1', 'CALL', 'SELECT');
Créer une référence persistante à une table t1
avec le privilège INSERT à transmettre à une application :
SELECT SYSTEM$REFERENCE('TABLE', 't1', 'PERSISTENT', 'INSERT');
Créer une référence de requête à transmettre à une procédure stockée. La durée de vie de cette référence transitoire est celle du bloc le plus éloigné de la procédure stockée à laquelle vous transmettez la référence :
SELECT SYSTEM$QUERY_REFERENCE('SELECT id FROM my_table', FALSE);
Pour d’autres exemples :
Exemple de procédure stockée, voir Un exemple simple.
Exemple d’application Native App Framework, voir Associer la référence à l’application.
Exemple d’instance de classe, voir Entraînement d’un modèle de détection d’anomalies avec des données balisées.
Annuler une référence persistante pour une application¶
Une application ou une classe qui nécessite une référence persistante fournira également une méthode pour désactiver la référence. Les noms des méthodes peuvent varier selon l’implémentation.
Vous pouvez également désactiver les références en utilisant une instruction ALTER APPLICATION … UNSET REFERENCES.
Vous pouvez utiliser la commande SHOW REFERENCES pour afficher toutes les références, y compris celles qui ont été définies pour une application.
Par exemple, pour afficher les références de l’application
my_app
:SHOW REFERENCES IN APPLICATION my_app;
CopyVous pouvez annuler toutes les références qui ont été définies pour l’application en utilisant la commande ALTER APPLICATION.
Par exemple, pour annuler la référence nommée
table_to_read
dans l’applicationmy_app
:ALTER APPLICATION my_app UNSET REFERENCES('table_to_read');
CopyPar exemple, pour annuler toutes les références de l’application
my_app
:ALTER APPLICATION my_app UNSET REFERENCES;
Copy
Points à prendre en considération lors de l’utilisation de références¶
Si un objet associé à une référence est renommé (ou reparamétré), la référence n’est plus valide.
Si un nouvel objet est créé avec le même nom et si les rôles encodés dans l’association de référence ont les privilèges appropriés sur le nouvel objet, la référence reste valide. Dans le cas contraire, il y a une erreur d’autorisations.
Si un objet est échangé et que les rôles encodés dans l’association de référence ont les privilèges appropriés sur le nouvel objet qui porte désormais le nom échangé, la référence reste valide. Dans le cas contraire, il y a une erreur d’autorisations.
Suppression et annulation de suppression d’objets :
Si un objet associé à une référence est supprimé, l’association de référence devient non valide.
Si l’objet supprimé est rétabli, l’association de référence redevient valide.
Clonage
Vous pouvez cloner une instance de classe, ou sa base de données ou son schéma parent, qui utilise des références à des objets de votre compte.
Si l’objet de référence est référencé avec un nom pleinement qualifié, le clone d’instance fait référence à l’objet original.
Si l’objet référencé est référencé avec un nom partiellement qualifié ou non qualifié, le clone d’instance peut faire référence à l’objet cloné, à l’objet original ou à aucun objet réel, en fonction des limites du clonage.
La réplication est prise en charge pour une application ou une base de données contenant une instance de classe qui utilise une référence à des objets dans le compte du consommateur.
Les références fonctionnent correctement dans le compte cible si les objets suivants sont répliqués :
Instance d’application ou de classe.
Objet référencé.
Rôle qui a créé la référence.
Ces objets peuvent être répliqués dans différents groupes de réplication ou de basculement. Une fois que tous les objets sont répliqués, la référence est utilisable.
Pour les fournisseurs d’applications Snowflake Native App Framework, voir aussi Points à prendre en considération lors de l’utilisation de références.
Contrôle de l’utilisation des références¶
Vous pouvez visualiser les références demandées par une application en utilisant la commande SHOW REFERENCES. Si vous avez défini des références pour une application, la sortie comprendra des informations sur l’objet, la base de données, le schéma et l’identificateur de chaque référence.
Par exemple, pour afficher les références dans l’application my_app
:
SHOW REFERENCES IN APPLICATION my_app;