Catégories :

Fonctions contextuelles (Objet de session)

IS_DATABASE_ROLE_IN_SESSION

Vérifie si le rôle de base de données se trouve dans la hiérarchie des rôles principaux ou secondaires actifs de l’utilisateur pour la session actuelle ou si la colonne spécifiée contient un rôle de base de données qui se trouve dans la hiérarchie des rôles principaux ou secondaires actifs de l’utilisateur pour la session actuelle.

Entrées

Chaîne littérale pour spécifier le nom du rôle de la base de données ou non littérale pour spécifier un nom de colonne.

Renvoie
  • True :

    • Pour un argument littéral (nom de rôle de base de données), le rôle principal actif de l’utilisateur actuel ou les rôles secondaires de la session héritent des privilèges du rôle de base de données spécifié.

    • Pour un argument non littéral (nom de colonne), Snowflake évalue chaque ligne de la table et renvoie une ligne contenant une valeur qui spécifie un rôle de base de données dans la session actuelle de l’utilisateur. Chaque ligne correspond à un nom de rôle de base de données provenant de la base de données utilisée ou de la base de données spécifiée dans une requête.

  • False :

    • Pour un argument littéral, le rôle de base de données spécifié ne figure pas dans la hiérarchie des rôles du rôle principal ou des rôles secondaires de l’utilisateur actuel.

    • Pour un argument non littéral, Snowflake ne renvoie pas de ligne si le rôle de base de données ne figure pas dans la colonne de la table pour la base de données utilisée ou la base de données spécifiée dans une requête.

Syntaxe

Littéral — spécifier un rôle de base de données directement :

IS_DATABASE_ROLE_IN_SESSION( '<string_literal>' )
Copy

Non-littéral — spécifier une colonne :

IS_DATABASE_ROLE_IN_SESSION( <column_name> )
Copy

Arguments

'string_literal'

Nom du rôle de la base de données.

Indiquez le nom complet ou le nom relatif du rôle du rôle de base de données.

column_name

Le nom de la colonne dans une table ou une vue.

Notes sur l’utilisation

Ces remarques ne s’appliquent qu’à la fonction IS_DATABASE_ROLE_IN_SESSION :

  • Un rôle de base de données devient actif dans la hiérarchie des rôles lorsque la base de données contenant le rôle de base de données est en cours d’utilisation ou lors de l’interrogation d’une table dans la même base de données que celle contenant le rôle de base de données.

    Si vous êtes un consommateur de partages de données et que vous utilisez un rôle de base de données pour interroger des données protégées par une politique, chargez la base de données contenant le rôle de base de données avec une commande USE DATABASE database_name avant d’interroger les données protégées par une politique. Cette commande active le rôle de base de données dans la hiérarchie des rôles du rôle actuel de l’utilisateur. Pour plus de détails, voir Partagez des données protégées par une politique.

  • Lorsque la valeur DEFAULT_SECONDARY_ROLES de la propriété de l’utilisateur est ALL , la fonction renvoie True si tout rôle de compte accordé à l’utilisateur hérite des privilèges du rôle de base de données spécifié.

  • Lorsque cette fonction est utilisée dans le cadre d’une politique de masquage ou d’une politique d’accès aux lignes qui protège les données partagées, il convient de s’assurer que la base de données contenant la politique et les données protégées par la politique sont toutes deux partagées avec le compte de consommateur. La politique et les données protégées par la politique peuvent se trouver dans la même base de données ou dans des bases de données différentes. Pour plus de détails, voir Partagez des données protégées par une politique.

Ces remarques s’appliquent aux fonctions IS_DATABASE_ROLE_IN_SESSION et IS_ROLE_IN_SESSION :

  • Utilisez une seule syntaxe.

  • Syntaxe littérale :

    • Un seul nom de rôle de base de données peut être transmis en tant qu’argument.

    • L’argument doit être une constante de chaîne et en majuscule.

    • Le nom d’un rôle de compte n’est pas pris en charge.

  • Syntaxe non littérale :

    • Une seule colonne peut être validée en tant qu’argument.

    • La colonne doit avoir un type de données STRING.

    • Spécifiez la colonne comme l’une des suivantes :

      • column_name

      • table_name.column_name

      • schema_name.table_name.column_name

      • database_name.schema_name.table_name.column_name

  • Colonnes virtuelles :

    Une colonne virtuelle, qui contient le résultat d’une valeur calculée à partir d’une expression plutôt que la valeur calculée stockée dans la table, n’est pas prise en charge.

    SELECT IS_ROLE_IN_SESSION(UPPER(authz_role)) FROM t1;
    
    Copy

    Une colonne virtuelle n’est prise en charge que si l’expression comporte un alias pour le nom de la colonne :

    CREATE VIEW v2 AS
    SELECT
      authz_role,
      UPPER(authz_role) AS upper_authz_role
    FROM t2;
    
    SELECT IS_ROLE_IN_SESSION(upper_authz_role) FROM v2;
    
    Copy
  • Politiques :

    Si vous utilisez ces fonctions avec une politique de masquage ou une politique d’accès aux lignes, vérifiez que votre compte Snowflake est bien en Enterprise Edition ou une version supérieure.

    Snowflake recommande d’utiliser cette fonction lorsque les conditions de la politique doivent évaluer la hiérarchie des rôles et les privilèges hérités.

  • Cache du résultat :

    Si vous utilisez cette fonction dans une politique de masquage ou une politique d’accès aux lignes et que ni la politique ni la table ou la colonne protégée par la politique ne changent par rapport à une requête précédente, vous pouvez utiliser la fonction RESULT_SCAN pour renvoyer les résultats d’une requête sur la table protégée. Le cache de résultat s’applique uniquement lors de l’utilisation de la syntaxe non littérale.

  • Ces fonctions ne peuvent pas être utilisée dans la définition de la vue matérialisée, car les fonctions ne sont pas déterministes et Snowflake ne peut pas déterminer les données à matérialiser.

Exemples

Vérifiez si les privilèges accordés à un rôle spécifique sont hérités par le rôle actuel dans la session :

SELECT IS_DATABASE_ROLE_IN_SESSION('DB1.R1');
Copy
+---------------------------------------+
| IS_DATABASE_ROLE_IN_SESSION('DB1.R1') |
+---------------------------------------+
| True                                  |
+---------------------------------------+

Renvoie les valeurs des rôles de base de données pour la colonne nommée ROLE_NAME :

SELECT *
FROM myb.s1.t1
WHERE IS_DATABASE_ROLE_IN_SESSION(role_name);
Copy

Pour d’autres exemples liés au partage sécurisé de données, consultez Partagez des données protégées par une politique.