Politiques d’agrégation¶
Une politique d’agrégation est un objet au niveau du schéma qui contrôle le type de requête pouvant accéder aux données d’une table ou d’une vue. Lorsqu’une politique d’agrégation est appliquée à une table, les requêtes portant sur cette table doivent agréger les données en groupes de taille minimale afin de renvoyer des résultats, empêchant ainsi une requête de renvoyer des informations d’un enregistrement individuel. Une table ou une vue à laquelle une politique d’agrégation a été affectée est dite soumise à des contraintes d’agrégation.
Vue d’ensemble¶
Une fonctionnalité principale de Snowflake consiste à permettre le partage d’ensembles de données avec d’autres entités. Les politiques d’agrégation permettent à un fournisseur (propriétaire de données) d’exercer un contrôle sur les actions possibles avec ses données, même après qu’elles ont été partagées avec un consommateur. Plus précisément, le fournisseur peut demander à un consommateur d’une table d’agréger les données au lieu de récupérer des enregistrements individuels.
Lors de la création d’une politique d’agrégation, l’administrateur de politiques du fournisseur spécifie une taille de groupe minimale (c’est-à-dire le nombre de lignes qui doivent être agrégées dans un groupe). Plus la taille de groupe minimale est importante, moins il est probable qu’un consommateur puisse utiliser les résultats de la requête pour déduire le contenu d’un seul enregistrement.
Une fois que la politique d’agrégation est appliquée à une table ou à une vue, une requête sur cette table doit remplir deux conditions :
La requête doit agréger les données. Si la requête utilise une fonction d’agrégation, il doit s’agir d’une des fonctions d’agrégation autorisées.
Chaque groupe créé par la requête doit inclure l’agrégat d’au moins X enregistrements, où X est la taille de groupe minimale de la politique d’agrégation.
Si la requête renvoie un groupe qui contient moins d’enregistrements que la taille de groupe minimale de la politique, Snowflake combine ces groupes dans un groupe restant. Snowflake applique la fonction d’agrégation à la colonne appropriée afin de renvoyer une valeur pour le groupe restant. Toutefois, étant donné que cette valeur est calculée à partir de lignes appartenant à plusieurs groupes, la valeur de la colonne clé GROUP BY est NULL. Par exemple, si la requête comprend la clause GROUP BY state
, la valeur de state
dans le groupe restant est NULL.
Une requête qui ne renvoie pas suffisamment de résultats pour constituer un groupe restant continue de fonctionner, mais renvoie une valeur NULL dans chaque champ des résultats.
Limitations¶
Pour cet aperçu :
Si la requête utilise une construction de regroupement explicite, il doit s’agir d’une clause GROUP BY. La requête ne peut pas utiliser de constructions associées telles que GROUP BY ROLLUP, GROUP BY CUBE ou GROUP BY GROUPING SETS.
La plupart des opérateurs d’ensemble ne sont pas autorisés lorsque l’une des requêtes porte sur une table soumise à des contraintes d’agrégation. À titre d’exception, UNION ALL est pris en charge, mais chaque groupe de résultats doit respecter la taille de groupe minimale des tables soumises à des contraintes d’agrégation faisant l’objet de la requête (voir Conditions des requêtes pour des informations détaillées).
Si une colonne d’une table soumise à des contraintes d’agrégation est protégée par une politique de projection, une requête sur cette table ne peut pas utiliser la colonne comme argument de la fonction COUNT.
Les CTEs récursifs ne sont pas autorisés dans les requêtes portant sur une table ou une vue soumise à des contraintes d’agrégation.
Les fonctions de fenêtre ne sont pas autorisées dans les requêtes portant sur une table ou une vue soumise à des contraintes d’agrégation.
Une requête sur une table soumise à des contraintes d’agrégation ne peut pas utiliser de sous-requête corrélée ni de jointure latérale lorsqu’il existe des références à ou provenant de la portion de la requête qui remplit les conditions de la politique d’agrégation. Les exemples suivants illustrent les types de requêtes interdits.
- Exemple 1
En supposant que
protected_table
soit soumise à des contraintes d’agrégation, la requête suivante n’est pas autorisée, car la portion de la requête qui agrège les données fait référence à une autre partie de la requête en dehors de la sous-requête :SELECT c1, c2 FROM open_table WHERE c1 = (SELECT x FROM protected_table WHERE y = open_table.c2);
- Exemple 2
En supposant que
protected_table
soit soumise à des contraintes d’agrégation, la requête suivante n’est pas autorisée, car la sous-requête fait référence à la partie de la requête qui agrège les données, qui se trouve en dehors de la sous-requête :SELECT SUM(SELECT COUNT(*) FROM open_table ot WHERE pt.id = ot.id) FROM protected_table pt;
Considérations¶
Tenez compte des points suivants lorsque vous utilisez des politiques d’agrégation pour protéger des données sensibles :
Les politiques d’agrégation protègent les données d’un enregistrement individuel et non d’une entité. Si un ensemble de données contient plusieurs enregistrements appartenant à la même entité, une politique d’agrégation ne protège que la confidentialité d’un enregistrement spécifique appartenant à cette entité et non de l’ensemble de l’entité.
Si les politiques d’agrégation limitent l’accès aux enregistrements individuels, elles ne garantissent pas qu’un acteur malveillant ne puisse pas utiliser des requêtes délibérées pour obtenir des données potentiellement sensibles provenant d’une table soumise à des contraintes d’agrégation. Avec un nombre suffisant de tentatives de requête, un acteur malveillant pourrait potentiellement contourner les conditions d’agrégation pour déterminer une valeur à partir d’une ligne individuelle. Les politiques d’agrégation conviennent le mieux aux partenaires et aux clients avec lesquels vous avez déjà un certain niveau de confiance. En outre, les fournisseurs doivent être vigilants quant à d’éventuelles utilisations abusives de leurs données (par exemple, en examinant l’historique des accès à leurs annonces).
Création d’une politique d’agrégation¶
La syntaxe pour créer une politique d’agrégation est la suivante :
CREATE [ OR REPLACE ] AGGREGATION POLICY <name> AS () RETURNS AGGREGATION_CONSTRAINT -> <body> [ COMMENT = '<string_literal>' ];
Où :
name
spécifie le nom de la politique.AS () RETURNS AGGREGATION_CONSTRAINT
est la signature et le type de retour de la politique. La signature n’accepte aucun argument et le type de retour est AGGREGATION_CONSTRAINT, qui est un type de données interne. Toutes les politiques d’agrégation ont la même signature et le même type de retour.body
est une expression SQL qui détermine les restrictions d’une politique d’agrégation.
Appel des fonctions internes du corps¶
Le corps d’une politique d’agrégation utilise deux fonctions internes pour définir les contraintes de la politique : NO_AGGREGATION_CONSTRAINT et AGGREGATION_CONSTRAINT. Lorsque les conditions du corps appellent l’une de ces fonctions, la valeur de retour de la fonction détermine la manière dont les requêtes portant sur la table ou la vue soumise à des contraintes d’agrégation doivent être formulées pour renvoyer des résultats.
- NO_AGGREGATION_CONSTRAINT
Lorsque le corps de la politique renvoie une valeur de cette fonction, les requêtes peuvent renvoyer sans restriction les données d’une table ou d’une vue soumise à des contraintes d’agrégation. Par exemple, le corps de la politique peut appeler cette fonction lorsqu’un administrateur a besoin d’obtenir des résultats non agrégés provenant de la table ou de la vue soumise à des contraintes d’agrégation.
Appelez NO_AGGREGATION_CONSTRAINT sans argument.
- AGGREGATION_CONSTRAINT
Lorsque le corps de la politique renvoie une valeur de cette fonction, les requêtes doivent agréger les données afin de renvoyer des résultats. Utilisez l’argument MIN_GROUP_SIZE pour spécifier le nombre d’enregistrements à inclure dans chaque groupe d’agrégation.
La syntaxe de la fonction AGGREGATION_CONSTRAINT est la suivante :
AGGREGATION_CONSTRAINT ( MIN_GROUP_SIZE => <integer_expression> )
Où
integer_expression
correspond à la taille de groupe minimale de la politique.Il existe une différence entre transmettre un
1
et transmettre un0
comme argument à la fonction. Dans les deux cas, les résultats doivent être agrégés.La transmission d’un
1
exige également que chaque groupe d’agrégation contienne au moins un enregistrement de la table soumise à des contraintes d’agrégation. Ainsi, pour les jointures externes, au moins un enregistrement de la table soumise à des contraintes d’agrégation doit correspondre à un enregistrement d’une table non protégée.La transmission d’un
0
permet à la requête de renvoyer des groupes entièrement constitués d’enregistrements provenant d’une autre table. Ainsi, pour les jointures externes entre une table soumise à des contraintes d’agrégation et une table non protégée, un groupe peut être constitué d’enregistrements de la table non protégée qui ne correspondent à aucun enregistrement de la table soumise à des contraintes d’agrégation.
Note
Le corps d’une politique d’agrégation ne peut pas faire référence à une table, vue ou fonction définie par l’utilisateur.
Exemples de politiques¶
- Taille de groupe minimale fixe
La politique d’agrégation la plus simple appelle directement la fonction AGGREGATION_CONSTRAINT et définit une taille de groupe minimale constante appliquée à toutes les requêtes portant sur la table. Par exemple, la commande suivante crée une politique d’agrégation de taille de groupe minimale égale à 5 :
CREATE AGGREGATION POLICY my_agg_policy AS () RETURNS AGGREGATION_CONSTRAINT -> AGGREGATION_CONSTRAINT(MIN_GROUP_SIZE => 5);
- Politique conditionnelle
Les administrateurs de politiques peuvent définir l’expression SQL d’une politique d’agrégation afin que différentes requêtes aient des restrictions différentes en fonction de facteurs tels que le rôle de l’utilisateur qui exécute la requête. Cette stratégie peut permettre à un utilisateur d’interroger une table sans restriction tout en obligeant les autres à agréger les résultats.
Par exemple, la politique d’agrégation suivante donne aux utilisateurs titulaires du rôle
ADMIN
un accès illimité à une table tout en exigeant que toutes les autres requêtes agrègent les données en groupes d’au moins 5 lignes.CREATE AGGREGATION POLICY my_agg_policy AS () RETURNS AGGREGATION_CONSTRAINT -> CASE WHEN CURRENT_ROLE() = 'ADMIN' THEN NO_AGGREGATION_CONSTRAINT() ELSE AGGREGATION_CONSTRAINT(MIN_GROUP_SIZE => 5) END;
Modification d’une politique d’agrégation¶
Vous pouvez utiliser la commande ALTER AGGREGATION POLICY pour modifier l’expression SQL qui détermine la taille de groupe minimale de la politique d’agrégation. Vous pouvez également renommer la politique ou modifier son commentaire.
Avant de modifier une politique d’agrégation, vous pouvez exécuter la commande DESCRIBE AGGREGATION POLICY ou la fonction GET_DDL pour examiner l’expression SQL actuelle de la politique. L’expression SQL qui détermine la taille de groupe minimale apparaît dans la colonne BODY
.
Par exemple, vous pouvez exécuter la commande suivante pour modifier l’expression SQL de la politique d’agrégation my_policy
afin d’exiger une taille de groupe minimale de 2 lignes en toutes circonstances :
ALTER AGGREGATION POLICY my_policy SET BODY -> AGGREGATION_CONSTRAINT(MIN_GROUP_SIZE=>2);
Affectation d’une politique d’agrégation¶
Une fois créée, une politique d’agrégation peut être appliquée à une ou plusieurs tables ou vues afin de les soumettre à des contraintes d’agrégation. Une table ou une vue ne peut être associée qu’à une seule politique d’agrégation.
Utilisez la clause SET AGGREGATION POLICY d’une commande ALTER TABLE ou ALTER VIEW pour affecter une politique d’agrégation à une table ou à une vue existante :
ALTER { TABLE | VIEW } <name> SET AGGREGATION POLICY <policy_name> [ FORCE ]
Où :
name
spécifie le nom de la table ou de la vue.policy_name
spécifie le nom de la politique d’agrégation.FORCE
est un paramètre facultatif qui permet à la commande d’affecter la politique d’agrégation à une table ou à une vue à laquelle une politique d’agrégation a déjà été affectée. La nouvelle politique d’agrégation remplace atomiquement la politique existante.
Par exemple, pour affecter la politique my_agg_policy
à la table t1
, exécutez :
ALTER TABLE t1 SET AGGREGATION POLICY my_agg_policy;
Vous pouvez également utiliser la clause WITH des commandes CREATE TABLE et CREATE VIEW pour affecter une politique d’agrégation à une table ou à une vue au moment de la création. Par exemple, pour affecter la politique my_agg_policy
à une nouvelle table, exécutez :
CREATE TABLE t1 WITH AGGREGATION POLICY my_agg_policy;
Remplacement d’une politique d’agrégation¶
La méthode recommandée pour remplacer une politique d’agrégation consiste à utiliser le paramètre FORCE
pour détacher la politique d’agrégation existante et affecter la nouvelle politique en une seule commande. Cela vous permet de remplacer atomiquement l’ancienne politique, sans laisser de faille de protection.
Par exemple, pour affecter une nouvelle politique d’agrégation à une table déjà soumise à des contraintes d’agrégation :
ALTER TABLE privacy SET AGGREGATION POLICY agg_policy_2 FORCE;
Vous pouvez également détacher la politique d’agrégation d’une table ou d’une vue dans une instruction (… UNSET AGGREGATION POLICY), puis définir une nouvelle politique sur la table ou la vue dans une autre instruction (… SET AGGREGATION POLICY <nom>). Si vous sélectionnez cette méthode, la table n’est pas protégée par une politique d’agrégation entre le détachement d’une politique et l’affectation d’une autre. Pendant ce temps, une requête pourrait potentiellement accéder à des données sensibles.
Détachement d’une politique d’agrégation¶
Utilisez la clause UNSET AGGREGATION POLICY d’une commande ALTER TABLE ou ALTER VIEW pour détacher une politique d’agrégation d’une table ou d’une vue afin de supprimer la nécessité d’agréger les données. Le nom de la politique d’agrégation n’est pas obligatoire, car une table ou une vue ne peut pas avoir plus d’une politique d’agrégation attachée.
ALTER {TABLE | VIEW} <name> UNSET AGGREGATION POLICY
Où :
name
spécifie le nom de la table ou de la vue.
Par exemple, pour détacher une politique d’agrégation de la vue v1
, exécutez :
ALTER VIEW v1 UNSET AGGREGATION POLICY;
Surveillance des politiques d’agrégation¶
Il peut être utile de penser à deux approches générales pour déterminer la manière de surveiller l’utilisation des politiques d’agrégation.
Découverte des politiques d’agrégation¶
Vous pouvez utiliser la vue AGGREGATION_POLICIES dans le schéma Account Usage de la base de données partagée SNOWFLAKE. Cette vue est un catalogue de toutes les politiques d’agrégation de votre compte Snowflake. Par exemple :
SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.AGGREGATION_POLICIES ORDER BY POLICY_NAME;
Identification des références aux politiques d’agrégation¶
La fonction de table Information Schema POLICY_REFERENCES peut identifier les références aux politiques d’agrégation. Il existe deux options syntaxiques différentes :
Renvoie une ligne pour chaque objet (c’est-à-dire une table ou une vue) pour lequel la politique d’agrégation spécifiée est définie :
USE DATABASE my_db; USE SCHEMA information_schema; SELECT policy_name, policy_kind, ref_entity_name, ref_entity_domain, ref_column_name, ref_arg_column_names, policy_status FROM TABLE(information_schema.policy_references(policy_name => 'my_db.my_schema.aggpolicy'));
Renvoie une ligne pour chaque politique affectée à la table nommée
my_table
:USE DATABASE my_db; USE SCHEMA information_schema; SELECT policy_name, policy_kind, ref_entity_name, ref_entity_domain, ref_column_name, ref_arg_column_names, policy_status FROM TABLE(information_schema.policy_references(ref_entity_name => 'my_db.my_schema.my_table', ref_entity_domain => 'table'));
Conditions des requêtes¶
Une fois qu’une politique d’agrégation a été appliquée à une table ou à une vue, les requêtes portant sur cette table ou cette vue doivent remplir certaines conditions. Cette section indique ce qui est autorisé et ce qui ne l’est pas dans une requête portant sur une table ou une vue soumise à des contraintes d’agrégation.
Note
Une fois qu’une partie de la requête agrège correctement les données pour remplir les conditions de la politique d’agrégation, ces restrictions de requête ne s’appliquent pas et une autre partie de la requête peut inclure des éléments qui, sinon, sont interdits.
Par exemple, la requête suivante peut utiliser une instruction SELECT qui n’agrège pas les résultats, car une autre partie de la requête a déjà rempli les conditions d’agrégation de la politique affectée à protected_table
:
SELECT * FROM open_table ot WHERE ot.a > (SELECT SUM(id) FROM protected_table pt)
Pour des restrictions supplémentaires sur ce qui peut être inclus dans une requête, voir Limitations.
- Fonctions d’agrégation
Les fonctions d’agrégation suivantes sont autorisées dans une requête portant sur une table soumise à des contraintes d’agrégation :
Une requête peut contenir plus d’une de ces fonctions d’agrégation autorisées. Une requête échoue si elle tente d’utiliser une fonction d’agrégation qui n’est pas autorisée.
- Instruction de regroupement
Une requête portant sur une table soumise à des contraintes d’agrégation doit agréger les données en groupes de taille minimale. Elle peut utiliser une instruction de regroupement explicite (c’est-à-dire une clause GROUP BY) ou une fonction d’agrégation scalaire qui agrège l’ensemble des données tout entier (par ex.,
COUNT(*)
).- Filters
En général, Snowflake ne limite pas la façon dont une requête utilise les clauses WHERE et ON pour filtrer la table soumise à des contraintes d’agrégation, tant qu’elle agrège les lignes sélectionnées par le filtre.
- Jointures
Une requête peut joindre une table soumise à des contraintes d’agrégation à une autre table, y compris une autre table soumise à des contraintes d’agrégation.
Snowflake vérifie chaque groupe d’agrégation pour s’assurer que le nombre de lignes extraites d’une table soumise à des contraintes d’agrégation est supérieur ou égal à la taille de groupe minimale de cette table. Par exemple, si une table soumise à des contraintes d’agrégation
table_a
de taille de groupe minimale égale à 5 est jointe à une tabletable_b
de taille de groupe minimale égale à 3, chaque groupe renvoyé par la requête doit être créé à l’aide d’au moins 5 lignes detable_a
et 3 lignes detable_b
.Le fait de savoir si une requête avec une jointure remplit les conditions d’une table soumise à des contraintes d’agrégation est déterminé par le nombre de lignes extraites de la table et non par la taille d’un groupe. Par conséquent, la taille d’un groupe créé à partir des données jointes peut être supérieure à la taille de groupe minimale de la table soumise à des contraintes d’agrégation, tout en produisant des données filtrées. Par exemple, supposons ceci :
La table
agg_t
est soumise à des contraintes d’agrégation avec une taille de groupe minimale égale à 2. Cette table contient une seule colonne de nombres entiersc
dont le contenu est le suivant : {1
,2
,2
}.La table
open_t
n’est soumise à aucune contrainte et contient une colonne de nombres entiersc
dont le contenu est le suivant : {1
,1
,1
,2
}.
Un utilisateur exécute la requête suivante qui joint les deux tables :
SELECT c, COUNT(*) FROM agg_t, open_t WHERE agg_t.c = open_t.c GROUP BY agg_t.c;
La requête renvoie le résultat suivant :
+-----------------+ | c | COUNT(*) | |------+----------| | 2 | 2 | |------+----------| | null | 3 | +-----------------+
Même si le deuxième groupe comporte 3 enregistrements, ce qui est supérieur à la taille de groupe minimale, l’ensemble de ces enregistrements correspondent à un seul enregistrement dans la table soumise à des contraintes d’agrégation, de sorte que la valeur est filtrée.
- UNION ALL
Une requête peut utiliser UNION ALL pour combiner les résultats de deux sous-requêtes, même si une ou plusieurs des tables interrogées sont soumises à des contraintes d’agrégation. Comme pour les jointures, chaque groupe figurant dans les résultats doit respecter la taille de groupe minimale de chaque table soumise à des contraintes d’agrégation interrogée. Par exemple, supposons ceci :
La table
protected_table1
a une taille de groupe minimale égale à 2.La table
protected_table2
a une taille de groupe minimale égale à 5.
Si vous exécutez la requête :
SELECT a, COUNT(*) FROM ( SELECT a, b FROM protected_table1 UNION ALL SELECT a, b FROM protected_table2 ) GROUP BY a;
Chaque groupe formé par la clé
a
doit contenir 2 enregistrements deprotected_table1
et 5 enregistrements deprotected_table2
, sinon les enregistrements sont placés dans un groupe restant.- Fonctions externes
Une requête ne peut appeler une fonction externe que si une autre partie de la requête a correctement agrégé les résultats pour remplir les conditions de la table soumise à des contraintes d’agrégation.
- Journalisation et métriques
Une requête ne peut pas consigner une colonne d’une table soumise à des contraintes d’agrégation via la journalisation ou les métriques UDF.
- Conversions de types de données
Une requête qui inclut une fonction de conversion de type de données dans l’instruction SELECT doit utiliser la version TRY de la fonction. Par exemple, la fonction TRY_CAST est autorisée, mais la fonction CAST est interdite. Les fonctions de conversion de type de données suivantes sont autorisées pour les types numériques :
- PIVOT
Une requête ne peut pas utiliser l’opérateur PIVOT sur une colonne d’une table soumise à des contraintes d’agrégation.
Exemple étendu¶
La création d’une politique d’agrégation et son affectation à une table suivent la même procédure générale que la création et l’affectation d’autres politiques telles que les politiques de masquage et de projection :
Si vous utilisez une approche de gestion centralisée, créez un rôle personnalisé (par ex.,
agg_policy_admin
) pour gérer la politique. Vous pouvez aussi utiliser un rôle existant.Accordez à ce rôle les privilèges nécessaires pour créer et affecter une politique d’agrégation.
Créez la politique d’agrégation.
Affectez la politique d’agrégation à une table.
Une fois que la politique d’agrégation est affectée à une table, les requêtes correctement effectuées sur cette table doivent agréger ses données.
L’exemple étendu suivant fournit des informations sur chaque étape de ce processus, de l’administrateur du contrôle d’accès du fournisseur créant un rôle personnalisé à un consommateur de données exécutant une requête pour renvoyer des résultats agrégés.
- Tâches de l’administrateur du contrôle d’accès
Créez un rôle personnalisé pour gérer la politique d’agrégation. Vous pouvez également réutiliser un rôle existant.
USE ROLE USERADMIN; CREATE ROLE AGG_POLICY_ADMIN;
Accordez au rôle personnalisé
agg_policy_admin
les privilèges permettant de créer une politique d’agrégation dans un schéma et d’affecter la politique d’agrégation à une table ou à une vue dans le compte Snowflake.Cette étape suppose que la politique d’agrégation soit stockée dans une base de données et un schéma nommés
privacy.agg_policies
et que cette base de données et ce schéma existent déjà :GRANT USAGE ON DATABASE privacy TO ROLE agg_policy_admin; GRANT USAGE ON SCHEMA privacy.agg_policies TO ROLE agg_policy_admin; GRANT CREATE AGGREGATION POLICY ON SCHEMA privacy.agg_policies TO ROLE agg_policy_admin; GRANT APPLY AGGREGATION POLICY ON ACCOUNT TO ROLE agg_policy_admin;
Le rôle
agg_policy_admin
peut maintenant être affecté à un ou plusieurs utilisateurs.Pour des informations détaillées sur les privilèges nécessaires pour pouvoir utiliser des politiques d’agrégation, voir Privilèges et commandes (dans ce chapitre).
- Tâches de l’administrateur de politiques d’agrégation
Créez une politique d’agrégation exigeant une agrégation et définissez une taille de groupe minimale égale à 3 :
USE ROLE agg_policy_admin; USE SCHEMA privacy.aggpolicies; CREATE AGGREGATION POLICY my_policy AS () RETURNS AGGREGATION_CONSTRAINT -> AGGREGATION_CONSTRAINT(MIN_GROUP_SIZE => 3);
Affectez la politique d’agrégation à une table
t1
:ALTER TABLE t1 SET AGGREGATION POLICY my_policy;
- Requête du consommateur
Une fois que le fournisseur a partagé la table soumise à des contraintes d’agrégation, le consommateur de données peut exécuter des requêtes sur cette table. Pour cet exemple, supposons que la table soumise à des contraintes d’agrégation
t1
contienne les lignes suivantes :peak
state
elevation
washington
NH
6288
cannon
NH
4080
kearsarge
NH
2937
mansfield
VT
4395
killington
VT
4229
wachusett
MA
2006
Supposons maintenant que le consommateur exécute la requête suivante sur
t1
:SELECT state, AVG(elevation) AS avg_elevation FROM t1 GROUP BY state;
Les résultats sont les suivants :
+----------+-----------------+ | STATE | AVG_ELEVATION | |----------+-----------------+ | NH | 4435 | | NULL | 3543 | +----------+-----------------+
Notez que la valeur de
state
dans le deuxième groupe estNULL
, car il s’agit d’un groupe restant qui calcule la moyenne de l’élévation des pics dansVT
etMA
.
Politiques d’agrégation avec des fonctionnalités Snowflake¶
Les sous-sections suivantes résument brièvement la manière dont les politiques d’agrégation interagissent avec différents services et fonctionnalités Snowflake.
Autres politiques¶
Cette section décrit comment une politique d’agrégation interagit avec d’autres politiques, notamment des politiques de masquage, des politiques d’accès aux lignes et des politiques de projection.
Vous pouvez attacher d’autres politiques à une table soumise à des contraintes d’agrégation. Une requête réussie sur la table doit remplir les conditions de toutes les politiques.
Si une politique d’accès aux lignes est affectée à une table soumise à des contraintes d’agrégation, une ligne exclue des résultats de la requête en fonction de la politique d’accès aux lignes n’est pas incluse lors du calcul des résultats agrégés.
Le corps d’une politique de masquage, d’une politique d’accès aux lignes ou d’une politique de projection ne peut pas faire référence à une table soumise à des contraintes d’agrégation ni à ses colonnes. De même, le corps de l’autre politique ne peut pas inclure un UDF faisant référence à la table soumise à des contraintes d’agrégation.
Vues et vues matérialisées¶
Vous pouvez affecter une politique d’agrégation à des vues et à des vues matérialisées. Lorsqu’une politique d’agrégation est appliquée à une vue, la table sous-jacente ne devient pas soumise à des contraintes d’agrégation. Cette table de base peut continuer à être interrogée sans restriction.
Pour éviter la possibilité d’exposer des données sensibles, toutes les vues soumises à des contraintes d’agrégation sont traitées comme s’il s’agissait de vues sécurisées, même si elles n’en sont pas.
La possibilité de créer une vue à partir d’une table soumise à des contraintes d’agrégation dépend du type de vue :
Vous pouvez créer une vue normale à partir d’une ou de plusieurs tables soumises à des contraintes d’agrégation, mais les requêtes portant sur cette vue doivent agréger les données d’une manière qui respecte les restrictions de ces tables de base.
Vous ne pouvez pas créer de vue matérialisée à partir d’une table ou d’une vue soumise à des contraintes d’agrégation ni affecter une politique d’agrégation à une table ou à une vue sur laquelle une vue matérialisée est basée.
Objets clonés¶
L’approche suivante permet de protéger les données des utilisateurs titulaires du privilège SELECT sur une table ou une vue clonée stockée dans la base de données ou le schéma cloné :
Le clonage d’un objet de politique d’agrégation individuel n’est pas pris en charge.
Le clonage d’une base de données entraîne le clonage de toutes les politiques d’agrégation de la base de données.
Le clonage d’un schéma entraîne le clonage de toutes les politiques d’agrégation du schéma.
Une table clonée est mappée vers les mêmes politiques que celles de la table source.
Lorsqu’une table est clonée dans le contexte de son clonage de schéma parent, si la table source a une référence à une politique d’agrégation dans le même schéma parent (c’est-à-dire une référence locale), la table clonée aura une référence à la politique d’agrégation clonée.
Si la table source fait référence à une politique d’agrégation dans un schéma différent (c’est-à-dire une référence étrangère), la table clonée conserve la référence étrangère.
Pour plus d’informations, voir CREATE <objet> … CLONE.
Réplication¶
Les politiques d’agrégation et leurs affectations peuvent être répliquées à l’aide de la réplication de bases de données et de groupes de réplication.
Pour la réplication de base de données, l’opération de réplication échoue si l’une des conditions suivantes est vraie :
La base de données principale se trouve dans un compte Enterprise (ou supérieur) et contient une politique, mais au moins un des comptes approuvés pour la réplication se trouve sur des éditions inférieures.
Une table ou une vue contenue dans la base de données principale a une référence pendante à une politique d’agrégation dans une autre base de données.
Le comportement de la référence pendante pour la réplication des bases de données peut être évité lors de la réplication de plusieurs bases de données dans un groupe de réplication.
Privilèges et commandes¶
Les sous-sections suivantes fournissent des informations permettant de gérer les politiques d’agrégation.
Privilèges des politiques d’agrégation¶
Snowflake prend en charge les privilèges suivants sur l’objet de politique d’agrégation.
Notez que l’exploitation d’un objet dans un schéma requiert également le privilège USAGE sur la base de données et le schéma parents.
Privilège |
Utilisation |
---|---|
APPLY |
Active les opérations de définition et d’annulation d’une politique d’agrégation sur une table. |
OWNERSHIP |
Transfère la propriété de la politique d’agrégation, ce qui donne un contrôle total sur la politique d’agrégation. Nécessaire pour modifier la plupart des propriétés d’une politique d’agrégation. |
Pour plus de détails, voir Résumé des commandes, des opérations et des privilèges DDL (dans ce chapitre).
Référence DDL d’une politique d’agrégation¶
Snowflake prend en charge les DDL suivantes pour créer et gérer les politiques d’agrégation.
Résumé des commandes, des opérations et des privilèges DDL¶
Le tableau suivant résume la relation entre les privilèges des politiques d’agrégation et les opérations DDL.
Notez que l’exploitation d’un objet dans un schéma requiert également le privilège USAGE sur la base de données et le schéma parents.
Fonctionnement |
Privilège requis |
---|---|
Création d’une politique d’agrégation. |
Un rôle avec le privilège CREATE AGGREGATION POLICY dans le même schéma. |
Modification d’une politique d’agrégation. |
Le rôle avec le privilège OWNERSHIP sur la politique d’agrégation. |
Description de la politique de session |
Un des éléments suivants :
|
Suppression d’une politique d’agrégation. |
Un rôle avec le privilège OWNERSHIP sur la politique d’agrégation. |
Affichage des politiques d’agrégation. |
Un des éléments suivants :
|
Définition ou annulation d’une politique d’agrégation sur une table. |
Un des éléments suivants :
|
Snowflake prend en charge différentes autorisations pour créer et définir une politique d’agrégation sur un objet.
Pour une approche de gestion centralisée des politiques d’agrégation dans laquelle le rôle personnalisé
aggregation_policy_admin
crée et définit des politiques d’agrégation sur toutes les tables, les autorisations suivantes sont nécessaires :USE ROLE securityadmin; GRANT USAGE ON DATABASE mydb TO ROLE agg_policy_admin; GRANT USAGE ON SCHEMA mydb.schema TO ROLE proj_policy_admin; GRANT CREATE AGGREGATION POLICY ON SCHEMA mydb.schema TO ROLE aggregation_policy_admin; GRANT APPLY ON AGGREGATION POLICY ON ACCOUNT TO ROLE aggregation_policy_admin;
Dans une approche de gestion hybride, un rôle unique dispose du privilège CREATE AGGREGATIONPOLICY pour garantir que les politiques d’agrégation sont nommées de manière cohérente, et des équipes ou rôles individuels disposent du privilège APPLY pour une politique d’agrégation spécifique.
Par exemple, le rôle personnalisé
finance_role
peut se voir accorder l’autorisation de définir la politique d’agrégationcost_center
sur les tables et les vues que le rôle possède (c’est-à-dire que le rôle détient le privilège OWNERSHIP sur la table ou la vue) :USE ROLE securityadmin; GRANT CREATE AGGREGATION POLICY ON SCHEMA mydb.schema TO ROLE aggregation_policy_admin; GRANT APPLY ON AGGREGATION POLICY cost_center TO ROLE finance_role;