Catégories :

Fonctions contextuelles (Objet de session)

IS_ROLE_IN_SESSION

Vérifie si le rôle du compte 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>' )
Copy

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

IS_ROLE_IN_SESSION( <column_name> )
Copy

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.

  • 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 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.

    • 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_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 myb.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 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