- 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>' )
Non-littéral — spécifier une colonne :
IS_DATABASE_ROLE_IN_SESSION( <column_name> )
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 estALL
, la fonction renvoieTrue
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;
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;
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');
+---------------------------------------+
| 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);
Pour d’autres exemples liés au partage sécurisé de données, consultez Partagez des données protégées par une politique.