Catégories :

Fonctions contextuelles (Objet de session)

IS_ROLE_IN_SESSION

Vérifie si la valeur de l’argument (c’est-à-dire le rôle) se trouve dans la hiérarchie des rôles principaux ou secondaires actifs de l’utilisateur pour la session ou si la colonne spécifiée contient un rôle qui se trouve dans la hiérarchie des rôles principaux ou secondaires actifs de l’utilisateur pour la session.

Entrées

Chaîne littérale pour spécifier un rôle directement ou non-littérale pour spécifier un nom de colonne.

Renvoie
  • TRUE:

    • Pour un argument littéral de chaîne, 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 spécifié.

      Lorsque la valeur DEFAULT_SECONDARY_ROLES est ALL, tout rôle accordé à l’utilisateur hérite des privilèges du rôle spécifié.

      Le rôle spécifié peut être le rôle primaire ou secondaire actuel (c’est-à-dire les rôles renvoyés par CURRENT_ROLE ou CURRENT_SECONDARY_ROLES, respectivement) ou tout rôle inférieur dans la hiérarchie des rôles.

    • Pour un argument non littéral, Snowflake évalue chaque ligne et renvoie une ligne contenant une valeur qui spécifie un rôle principal ou secondaire actif dans la session actuelle de l’utilisateur. Chaque ligne correspond à un nom de rôle que le rôle principal ou secondaire actif peut voir.

  • FALSE:

    • Pour un argument littéral de chaîne, le rôle spécifié est soit plus élevé dans la hiérarchie des rôles du rôle principal actuel ou des rôles secondaires, soit ne figure pas du tout dans la hiérarchie des rôles.

    • Pour un argument non littéral, Snowflake évalue chaque ligne. Si une ligne contient un nom de rôle qui est soit plus élevé dans la hiérarchie des rôles du rôle principal actuel ou des rôles secondaires, soit ne figure pas du tout dans la hiérarchie des rôles, Snowflake ne retourne pas cette ligne. Dans ce cas, Snowflake ne renvoie que les lignes contenant les noms de rôle que le rôle principal ou secondaire actif peut voir (le cas échéant).

  • NULL:

    • Dans un compte consommateur de partage de données, cette fonction renvoie NULL si elle fait référence à un objet partagé (par exemple, UDF sécurisé ou vue sécurisée), comme dans une condition de politique de masquage. Ce comportement empêche d’exposer la hiérarchie des rôles dans un compte de consommateur de partage de données.

Voir aussi :

IS_OBJECT , Rubriques de sécurité avancées au niveau des colonnes

Syntaxe

Littéral : spécifier un rôle directement :

IS_ROLE_IN_SESSION( '<string_literal>' )

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

IS_ROLE_IN_SESSION( <column_name> )

Arguments

'string_literal'

Nom du rôle.

column_name

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

Notes sur l’utilisation

  • Utilisez une seule syntaxe.

  • Si vous utilisez cette fonction 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.

  • La fonction ne peut pas être utilisée dans la définition de la vue matérialisée car la fonction n’est pas déterministe et Snowflake ne peut pas déterminer les données à matérialiser.

  • Syntaxe littérale :

    • Un seul nom de rôle peut être validé en tant qu’argument.

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

    • Le nom d’un rôle de base de données 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;
    

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

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_role_in_session('ANALYST');

+-------------------------------+
| IS_ROLE_IN_SESSION('ANALYST') |
|-------------------------------|
| True                          |
+-------------------------------+

Renvoie les valeurs de rôle principal ou secondaire actif pour la colonne nommée role_name :

select *
from myb.s1.t1
where is_role_in_session(t1.role_name);

Spécifier un rôle directement dans une condition de politique de masquage :

create or replace masking policy allow_analyst as (val string)
returns string ->
case
  when is_role_in_session('ANALYST') then val
  else '*******'
end;

Spécifiez la colonne nommée AUTHZ_ROLE (c’est-à-dire le rôle autorisé) dans une politique d’accès aux lignes, puis définissez la politique sur la colonne de la table :

Créez la politique :

create or replace row access policy rap_authz_role as (authz_role string)
returns boolean ->
is_role_in_session(authz_role);

Ajoutez la politique à un tableau :

alter table allowed_roles
  add row access policy rap_authz_role on (authz_role);

Spécifiez la colonne nommée AUTHZ_ROLE dans une politique d’accès aux lignes qui utilise une table de mappage pour rechercher le rôle autorisé dans une colonne de table de correspondance appelée ROLE_NAME. Après avoir créé la politique, ajoutez-la à la table contenant la colonne AUTHZ_ROLE :

Créez la politique :

create or replace row access policy rap_authz_role_map as (authz_role string)
returns boolean ->
exists (
  select 1 from mapping_table m
  where authz_role = m.key and is_role_in_session(m.role_name)
);

Ajoutez la politique à un tableau :

alter table allowed_roles
  add row access policy rap_authz_role_map on (authz_role);