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

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

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

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

Pour d’autres exemples :

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.

  1. 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;
    
    Copy
  2. Vous 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’application my_app :

    ALTER APPLICATION my_app UNSET REFERENCES('table_to_read');
    
    Copy

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