Catégories :

Fonctions contextuelles

POLICY_CONTEXT

Simule les résultats d’une requête en fonction de la valeur d’une ou de plusieurs fonctions contextuelles, ce qui vous permet de déterminer la manière dont les politiques affectent les résultats de requête. Les fonctions contextuelles renvoient une valeur basée sur le contexte actuel d’une requête, par exemple sur la personne qui exécute la requête ou le compte à partir duquel la requête est exécutée. Les corps de politique utilisent souvent des fonctions contextuelles pour déterminer la valeur à renvoyer par la politique.

Cette fonction évalue les politiques suivantes pour déterminer les résultats de la requête :

Syntaxe

EXECUTE USING
POLICY_CONTEXT( <arg_1> => '<string_literal>' [ , <arg_2> => '<string_literal>' , ... , <arg_n> => '<string_literal>' ] )
AS
SELECT <query>
Copy

Arguments

arg_1 => 'string_literal'

Spécifie une fonction contextuelle et sa valeur sous forme de chaîne.

Requis. Vous devez spécifier au moins une fonction et sa valeur.

Snowflake prend en charge les fonctions contextuelles suivantes et leurs valeurs comme arguments :

Pour déterminer le format à utiliser comme valeur de chaîne, exécutez une requête à l’aide de la fonction. Par exemple :

SELECT CURRENT_USER();

+----------------+
| CURRENT_USER() |
|----------------|
| JSMITH         |
+----------------+
Copy

La valeur de la chaîne doit être 'JSMITH'.

Notez que si vous spécifiez CURRENT_AVAILABLE_ROLES et plusieurs valeurs de rôle, telles que ROLE1 et ROLE2, vous devez placer la liste des rôles entre crochets comme suit :

['ROLE1', 'ROLE2']

arg_2 => 'string_literal' , ... , arg_n => 'string_literal'

Spécifie une liste séparée par des virgules d’une fonction de contexte et sa valeur sous forme de chaîne.

En option.

query

Spécifie l’expression SQL pour interroger une ou plusieurs tables ou vues.

Requis.

Notes sur l’utilisation

  • Cette fonction requiert les éléments suivants :

    • Au moins un argument qui spécifie une fonction contextuelle prise en charge et sa valeur.

    • Si une table est protégée par une politique, l’utilisateur ou le rôle spécifié doit bénéficier des privilèges suivants :

      • OWNERSHIP sur la table ou la vue, et

      • Le privilège APPLY pour la politique, soit au niveau du compte, soit sur la politique elle-même :

        • APPLY MASKING POLICY sur ACCOUNT ou APPLY sur MASKING POLICY policy_name

        • APPLY ROW ACCESS POLICY sur ACCOUNT ou APPLY sur ROW ACCESS POLICY policy_name

        • APPLY AGGREGATION POLICY sur ACCOUNT ou APPLY sur AGGREGATION POLICY policy_name

        • APPLY PROJECTION POLICY sur ACCOUNT ou APPLY sur PROJECTION POLICY policy_name

  • Snowflake renvoie un message d’erreur si l’une des conditions suivantes est vraie :

    • Utilisation d’une ou plusieurs fonctions non prises en charge comme argument. Snowflake ne prend en charge que les fonctions répertoriées dans la section Arguments.

    • Mauvaise spécification de la valeur d’une chaîne de fonction, notamment en utilisant une chaîne pour une valeur qui n’existe pas (par exemple, aucun compte, utilisateur ou rôle).

    • L’expression SELECT query n’interroge pas correctement une table ou une vue (par exemple, elle ne spécifie pas du tout une table ou une vue).

    • Certains cas d’utilisation de partage des données (voir le point suivant).

  • Partage des données :

    • Un consommateur de partage de données ne peut pas utiliser cette fonction pour simuler des résultats de requêtes sur des tables ou des vues qui ont été mises à disposition par le fournisseur de partage de données.

      En outre, si l’expression de query du consommateur comprend une table ou une vue mise à disposition par Secure Data Sharing et une autre table ou vue du compte du consommateur non associée au compte du fournisseur de partage de données (c’est-à-dire sa propre table ou vue), Snowflake renvoie un message d’erreur.

    • Un compte fournisseur de partage de données peut simuler la façon dont un compte de consommateur de partage de données voit les tables ou les vues mises à disposition par le biais d’un partage.

      Pour ce faire, le fournisseur de partage de données spécifie le nom du compte du consommateur comme argument. Par exemple :

      execute using policy_context(current_account => '<consumer_account_name>') ... ;
      
      Copy
  • Le résultat dépend des éléments suivants :

    • Politique de masquage ou politique de projection qui est définie sur une colonne, le cas échéant.

    • Politique d’accès aux lignes ou politique d’agrégation qui est définie sur la table ou sur la vue, le cas échéant.

    • La ou les définitions de la politique.

    • L’expression de query.

    • Les privilèges accordés aux rôles.

    • Les rôles accordés aux utilisateurs (y compris la hiérarchie des rôles).

    • Les arguments de cette fonction.

    Important

    Si le résultat de cette fonction n’est pas ce que vous attendiez :

    • Consultez votre administrateur de politiques internes pour déterminer quelles tables, vues et colonnes sont protégées par des politiques et pour mieux comprendre les définitions de corps de ces politiques. Cet administrateur peut avoir un rôle personnalisé comme POLICY_ADMIN, MASKING_ADMIN ou RAP_ADMIN.

    • Vérifie les points suivants :

    Mettez à jour l’instruction SQL en utilisant cette fonction, si nécessaire, et réessayez.

Exemples

Simulez l’effet du rôle du système PUBLIC qui interroge la table empl_info :

execute using policy_context(current_role => 'PUBLIC') as select * from empl_info;
Copy