Catégories :

Fonctions contextuelles (Objet de session)

IS_ROLE_IN_SESSION

Vérifie si le rôle de compte spécifié se trouve dans la hiérarchie des rôles primaires ou secondaires actuellement active.

Cette fonction examine uniquement l’ensemble des rôles actuellement actifs, et non les rôles activés au cours de la session. Les rôles actuellement actifs peuvent différer des rôles de session, par exemple lors de l’exécution d’une procédure de droits du propriétaire ou d’un Streamlit.

Voir aussi :

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

Expression — spécifier une expression de rôle :

IS_ROLE_IN_SESSION( <expr> )
Copy

Colonne — spécifier une colonne :

IS_ROLE_IN_SESSION( <column_name> )
Copy

Arguments

'string_literal'

Nom du rôle.

expr

Une expression qui renvoie le nom du rôle.

column_name

Le nom de la colonne dans une table ou une vue qui contient le nom du rôle.

Renvoie

TRUE:
  • Pour un argument d’expression ou littéral de chaîne, le rôle principal actif ou les rôles secondaires de l’utilisateur actuel 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 principal 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 de colonne, 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 d’expression ou 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 ou des rôles secondaires actuels, 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
  • Cette fonction renvoie NULL lorsqu’elle est utilisée dans un objet partagé, tel qu’une vue sécurisée, en cas d’accès via un compte consommateur de partage de données. Ce comportement empêche d’exposer la hiérarchie des rôles dans un compte de consommateur de partage de données.

Notes sur l’utilisation

  • Utilisez une seule syntaxe.

  • Syntaxe du nom :

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

    • L’argument doit être une chaîne et utiliser la même casse que celle utilisée pour stocker le rôle dans Snowflake. Pour plus de détails, voir Exigences relatives à l’identificateur.

  • Syntaxe de la colonne :

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

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

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

SELECT *
FROM d1.s1.t1
WHERE IS_ROLE_IN_SESSION(t1.role_name);
Copy

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

Spécifiez une expression de rôle dans une condition de politique de masquage :

CREATE OR REPLACE MASKING POLICY allow_tag_role AS (val string)
RETURNS string ->
CASE
  WHEN IS_ROLE_IN_SESSION(SYSTEM$GET_TAG_ON_CURRENT_TABLE('D1.S1.ALLOWED_ROLE')) THEN val
  ELSE '*******'
END;
Copy

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

Ajoutez la politique à un tableau :

ALTER TABLE allowed_roles
  ADD ROW ACCESS POLICY rap_authz_role ON (authz_role);
Copy

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

Ajoutez la politique à un tableau :

ALTER TABLE allowed_roles
  ADD ROW ACCESS POLICY rap_authz_role_map ON (authz_role);
Copy