Aggregationsrichtlinien

Eine Aggregationsrichtlinie ist ein Objekt auf Schemaebene, das steuert, welcher Typ von Abfrage auf Daten aus einer Tabelle oder Ansicht zugreifen kann. Wenn eine Aggregationsrichtlinie auf eine Tabelle angewendet wird, müssen Abfragen auf dieser Tabelle die Daten in Gruppen mit einer Mindestgröße aggregieren, um Ergebnisse zu zurückgeben zu können, wodurch verhindert wird, dass eine Abfrage Informationen aus einem einzelnen Datensatz zurückgibt. Eine Tabelle oder Ansicht, der eine Aggregationsrichtlinie zugewiesen ist, weist eine Aggregationseinschränkung auf.

Übersicht

Ein wesentliches Feature von Snowflake ist die Möglichkeit, Datensets für andere Entitäten freizugeben. Aggregationsrichtlinien ermöglichen es einem Anbieter (Dateneigentümer), die Kontrolle darüber auszuüben, wie seine Daten verarbeitet werden können, auch nachdem sie für einen Verbraucher freigegeben wurden. Insbesondere kann der Anbieter anfordern, dass der Verbraucher einer Tabelle die Daten aggregiert, anstatt einzelne Datensätze abzurufen.

Beim Erstellen einer Aggregationsrichtlinie legt der Richtlinienadministrator des Anbieters eine Mindestgruppengröße fest (d. h. die Anzahl der Zeilen, die in einer Gruppe aggregiert werden müssen). Je größer die Mindestgruppengröße ist, desto unwahrscheinlicher ist es, dass ein Verbraucher aus den Abfrageergebnissen auf den Inhalt eines einzelnen Datensatzes schließen kann.

Sobald die Aggregationsrichtlinie auf eine Tabelle oder Ansicht angewendet wird, muss eine Abfrage zwei Anforderungen erfüllen:

  • Die Abfrage muss die Daten aggregieren. Wenn die Abfrage eine Aggregationsfunktion verwendet, muss es sich um eine der zulässigen Aggregationsfunktionen handeln.

  • Jede durch die Abfrage erstellte Gruppe muss das Aggregat von mindestens X Datensätzen enthalten, wobei X die Mindestgruppengröße der Aggregationsrichtlinie ist.

Wenn die Abfrage eine Gruppe ergibt, die weniger Datensätze enthält als die Mindestgruppengröße der Richtlinie vorgibt, fasst Snowflake diese Gruppen zu einer Restgruppe zusammen. Snowflake wendet die Aggregationsfunktion auf die entsprechende Spalte an, um einen Wert für die Restgruppe zu erhalten. Da dieser Wert jedoch aus Zeilen berechnet wird, die zu mehr als einer Gruppe gehören, erhält die GROUP BY-Schlüsselspalte den Wert NULL. Wenn die Abfrage zum Beispiel die Klausel GROUP BY state enthält, dann ist der Wert von state in der Restgruppe NULL.

Eine Abfrage, die nicht genügend Ergebnisse zurückgibt, um eine Restgruppe zu füllen, funktioniert trotzdem, gibt aber in jedem Feld der Ergebnisse den Wert NULL zurück.

Einschränkungen

Bei dieser Vorschau müssen Sie Folgendes beachten:

  • Wenn die Abfrage ein explizites Gruppierungskonstrukt verwendet, muss es sich um eine GROUP BY-Klausel handeln. Die Abfrage kann keine verwandten Konstrukte wie GROUP BY ROLLUP, GROUP BY CUBE oder GROUP BY GROUPING SETS verwenden.

  • Die meisten Mengenoperatoren sind nicht zulässig, wenn eine der Abfragen auf einer Tabelle mit Aggregationseinschränkung ausgeführt wird. Als Ausnahme wird UNION ALL unterstützt, aber jede Ergebnisgruppe muss die minimale Gruppengröße der abgefragten Tabellen mit Aggregationseinschränkung erfüllen (siehe Abfrageanforderungen).

  • Wenn eine Spalte einer Tabelle mit Aggregationseinschränkung durch eine Projektionsrichtlinie geschützt ist, kann eine Abfrage auf dieser Tabelle die Spalte nicht als Argument der COUNT-Funktion verwenden.

  • Rekursive CTEs sind in Abfragen auf Tabellen oder Ansichten mit Aggregationseinschränkung nicht zulässig.

  • Fensterfunktionen sind in Abfragen auf Tabellen oder Ansichten mit Aggregationseinschränkung nicht zulässig.

  • Eine Abfrage auf einer Tabelle mit Aggregationseinschränkung kann keine korrelierte Unterabfrage und keinen laterale Joins verwenden, wenn es Verweise auf oder von dem Teil der Abfrage gibt, der die Anforderungen der Aggregationsrichtlinie erfüllt. In den folgenden Beispielen werden die Typen von Abfragen beschrieben, die nicht zulässig sind.

    Beispiel 1

    Angenommen, protected_table ist eine Tabelle mit Aggregationseinschränkung, dann ist die folgende Abfrage nicht zulässig, weil der Teil der Abfrage, der Daten aggregiert, auf einen anderen Teil der Abfrage außerhalb der Unterabfrage verweist:

    SELECT c1, c2
    FROM open_table
    WHERE c1 = (SELECT x FROM protected_table WHERE y = open_table.c2);
    
    Copy
    Beispiel 2

    Angenommen, protected_table ist eine Tabelle mit Aggregationseinschränkung, dann ist die folgende Abfrage nicht zulässig, weil die Unterabfrage auf den Teil der Abfrage verweist, der Daten aggregiert, der sich außerhalb der Unterabfrage befindet:

    SELECT
      SUM(SELECT COUNT(*) FROM open_table ot WHERE pt.id = ot.id)
    FROM protected_table pt;
    
    Copy

Hinweise

Beachten Sie die folgenden Punkte, wenn Sie Aggregationsrichtlinien zum Schutz sensibler Daten verwenden:

  • Aggregationsrichtlinien schützen die Daten eines einzelnen Datensatzes, nicht die einer Entität. Wenn ein Datenset mehrere Datensätze enthält, die zur selben Entität gehören, schützt eine Aggregationsrichtlinie nur die Daten in einem bestimmten Datensatz, der zu dieser Entität gehört, nicht die gesamte Entität.

  • Aggregationsrichtlinien schränken zwar den Zugriff auf einzelne Datensätze ein, garantieren aber nicht, dass ein böswilliger Akteur nicht absichtliche Abfragen verwenden könnte, um potenziell sensible Daten aus einer Tabelle mit Aggregationseinschränkung zu erhalten. Bei genügend Abfrageversuchen könnte ein böswilliger Akteur möglicherweise die Aggregationsanforderungen umgehen, um einen Wert aus einer einzelnen Zeile zu ermitteln. Aggregationsrichtlinien eignen sich am besten für Partner und Kunden, zu denen Sie bereits ein gewisses Maß an Vertrauen haben. Darüber hinaus sollten Anbieter auf einen möglichen Missbrauch ihrer Daten achten (z. B. indem sie den Zugriffsverlauf auf ihre Freigabeangebote überprüfen).

Aggregationsrichtlinie erstellen

Die Syntax für das Erstellen einer Aggregationsrichtlinie ist wie folgt:

CREATE [ OR REPLACE ] AGGREGATION POLICY <name>
  AS () RETURNS AGGREGATION_CONSTRAINT -> <body>
  [ COMMENT = '<string_literal>' ];
Copy

Wobei:

  • name gibt den Namen der Richtlinie an.

  • AS () RETURNS AGGREGATION_CONSTRAINT ist die Signatur und der Rückgabetyp der Richtlinie. Die Signatur akzeptiert keine Argumente, und der Rückgabetyp ist der interne Datentyp AGGREGATION_CONSTRAINT. Alle Aggregationsrichtlinien haben die gleiche Signatur und den gleichen Rückgabetyp.

  • body ist ein SQL-Ausdruck, der die Einschränkungen einer Aggregationsrichtlinie bestimmt.

Aufrufen interner Funktionen über den Richtlinientext (body)

Im Richtlinientext (body) einer Aggregationsrichtlinie werden zwei interne Funktionen verwendet, um die Einschränkungen der Richtlinie zu definieren: NO_AGGREGATION_CONSTRAINT und AGGREGATION_CONSTRAINT. Wenn eine dieser Funktionen von den Bedingungen im Richtlinientext aufgerufen werden, bestimmt der Rückgabewert der Funktion, wie Abfragen an die Tabelle oder Ansicht mit Aggregationseinschränkung formuliert werden müssen, um Ergebnisse zurückzugeben.

NO_AGGREGATION_CONSTRAINT

Wenn der Richtlinientext einen Wert für diese Funktion zurückgibt, können Abfragen Daten aus Tabellen oder Ansichten, die eine Aggregationseinschränkung aufweisen, ohne Einschränkung zurückgeben. Der Richtlinientext könnte diese Funktion beispielsweise aufrufen, wenn ein Administrator aus der Tabelle oder Ansicht mit Aggregationseinschränkung Ergebnisse benötigt, die nicht aggregiert sind.

Rufen Sie NO_AGGREGATION_CONSTRAINT ohne Argument auf.

AGGREGATION_CONSTRAINT

Wenn der Richtlinientext einen Wert aus dieser Funktion zurückgibt, müssen die Abfragen Daten aggregieren, um Ergebnisse zurückgeben zu können. Verwenden Sie das Argument MIN_GROUP_SIZE, um anzugeben, wie viele Datensätze in jeder Aggregationsgruppe enthalten sein müssen.

Die Syntax der AGGREGATION_CONSTRAINT-Funktion lautet:

AGGREGATION_CONSTRAINT ( MIN_GROUP_SIZE => <integer_expression> )
Copy

Wobei integer_expression die minimale Gruppengröße der Richtlinie darstellt.

Es gibt einen Unterschied zwischen der Übergabe von 1 und 0 als Argument an die Funktion. In beiden Fällen müssen die Ergebnisse aggregiert werden.

  • Die Übergabe von 1 erfordert auch, dass jede Aggregationsgruppe mindestens einen Datensatz aus der Tabelle mit Aggregationseinschränkung enthält. Bei äußeren Verknüpfungen (Outer Join) muss also mindestens ein Datensatz aus der Tabelle mit Aggregationseinschränkung mit einem Datensatz aus einer ungeschützten Tabelle übereinstimmen.

  • Durch die Übergabe von 0 kann die Abfrage Gruppen zurückgeben, die vollständig aus Datensätzen aus einer anderen Tabelle bestehen. Das bedeutet, dass bei äußeren Joins zwischen einer Tabelle mit Aggregationseinschränkung und einer ungeschützten Tabelle eine Gruppe aus Datensätzen aus der ungeschützten Tabelle bestehen kann, die mit keinem Datensatz in der Tabelle mit Aggregationseinschränkung übereinstimmen.

Bemerkung

Der Richtlinientext einer Aggregationsrichtlinie kann nicht auf eine benutzerdefinierte Funktion, Tabelle oder Ansicht verweisen.

Beispiele für Richtlinien

Feste Mindestgruppengröße

Die einfachste Aggregationsrichtlinie ruft die Funktion AGGREGATION_CONSTRAINT direkt auf und definiert eine konstante Mindestgruppengröße, die auf alle Abfragen der Tabelle angewendet wird. Der folgende Befehl erstellt zum Beispiel eine Aggregationsrichtlinie mit einer Mindestgruppengröße von 5:

CREATE AGGREGATION POLICY my_agg_policy
  AS () RETURNS AGGREGATION_CONSTRAINT -> AGGREGATION_CONSTRAINT(MIN_GROUP_SIZE => 5);
Copy
Bedingte Richtlinie

Richtlinienadministratoren können den SQL-Ausdruck einer Aggregationsrichtlinie so definieren, dass für verschiedene Abfragen unterschiedliche Einschränkungen gelten, die auf Faktoren wie der Rolle des Benutzers, der die Abfrage ausführt, basieren. Diese Strategie kann es einem Benutzer ermöglichen, eine Tabelle ohne Einschränkungen abzufragen, während bei anderen die Ergebnisse aggregiert werden müssen.

Die folgende Aggregationsrichtlinie gewährt beispielsweise Benutzern mit der Rolle ADMIN uneingeschränkten Zugriff auf eine Tabelle, während bei Abfragen in allen anderen Fällen die Daten in Gruppen von mindestens 5 Zeilen aggregiert werden müssen.

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

Aggregationsrichtlinie ändern

Mit dem Befehl ALTER AGGREGATION POLICY können Sie den SQL-Ausdruck ändern, der die Mindestgruppengröße der Aggregationsrichtlinie bestimmt. Sie können die Richtlinie auch umbenennen oder deren Kommentar ändern.

Bevor Sie eine Aggregationsrichtlinie ändern, können Sie den Befehl DESCRIBE AGGREGATION POLICY oder die Funktion GET_DDL ausführen, um den aktuellen SQL-Ausdruck der Richtlinie anzuzeigen. Der SQL-Ausdruck, der die Mindestgruppengröße bestimmt, wird in der Spalte BODY angezeigt.

Sie können zum Beispiel den folgenden Befehl ausführen, um den SQL-Ausdruck der Aggregationsrichtlinie my_policy so zu ändern, dass unter allen Umständen eine Mindestgruppengröße von 2 Zeilen erforderlich ist:

ALTER AGGREGATION POLICY my_policy SET BODY -> AGGREGATION_CONSTRAINT(MIN_GROUP_SIZE=>2);
Copy

Aggregationsrichtlinie zuweisen

Nach dem Erstellen kann eine Aggregationsrichtlinie auf eine oder mehrere Tabellen oder Ansichten angewendet werden, damit sie eine Aggregationseinschränkung aufweisen. Einer Tabelle oder Ansicht kann immer nur eine Aggregationsrichtlinie zugeordnet sein.

Verwenden Sie die SET AGGREGATION POLICY-Klausel eines ALTER TABLE- oder ALTER VIEW-Befehls, um einer vorhandenen Tabelle oder Ansicht eine Aggregationsrichtlinie zuzuweisen:

ALTER { TABLE | VIEW } <name> SET AGGREGATION POLICY <policy_name> [ FORCE ]
Copy

Wobei:

  • name gibt den Namen der Tabelle oder Ansicht an.

  • policy_name gibt den Namen der Aggregationsrichtlinie an.

  • FORCE ist ein optionaler Parameter, der es dem Befehl ermöglicht, die Aggregationsrichtlinie einer Tabelle oder Ansicht zuzuweisen, der bereits eine Aggregationsrichtlinie zugewiesen ist. Die neue Aggregationsrichtlinie ersetzt atomar die bestehende.

Um beispielsweise der Tabelle t1 die Richtlinie my_agg_policy zuzuweisen, führen Sie Folgendes aus:

ALTER TABLE t1 SET AGGREGATION POLICY my_agg_policy;
Copy

Sie können auch die WITH-Klausel in einem CREATE TABLE- und CREATE VIEW-Befehl verwenden, um einer Tabelle oder Ansicht zum Zeitpunkt der Erstellung eine Aggregationsrichtlinie zuzuweisen. Um beispielsweise einer neuen Tabelle die Richtlinie my_agg_policy zuzuweisen, führen Sie Folgendes aus:

CREATE TABLE t1 WITH AGGREGATION POLICY my_agg_policy;
Copy

Aggregationsrichtlinie ersetzen

Die empfohlene Methode zum Ersetzen einer Aggregationsrichtlinie ist die Verwendung des Parameters FORCE, um mit einem Befehl die bestehende Aggregationsrichtlinie abzutrennen und die neue Aggregationsrichtlinie zuzuweisen. So können Sie die alte Richtlinie atomar ersetzen, ohne dass eine Sicherheitslücke entsteht.

So können Sie beispielsweise einer Tabelle, die bereits eine Aggregationseinschränkung aufweist, eine neue Aggregationsrichtlinie zuweisen:

ALTER TABLE privacy SET AGGREGATION POLICY agg_policy_2 FORCE;
Copy

Sie können die Aggregationsrichtlinie auch mit einer Anweisung (… UNSET AGGREGATION POLICY) von einer Tabelle oder Ansicht trennen und dann mit einer anderen Anweisung eine neue Richtlinie für die Tabelle oder Ansicht festlegen (… SET AGGREGATION POLICY <name>). Wenn Sie sich für diese Methode entscheiden, ist die Tabelle zwischen dem Trennen der einen Richtlinie und dem Zuweisen der anderen Richtlinie nicht durch eine Aggregationsrichtlinie geschützt. Wird in dieser Zeit eine Abfrage ausgeführt, könnte sie möglicherweise auf sensible Daten zugreifen.

Aggregationsrichtlinie trennen

Verwenden Sie die UNSET AGGREGATION POLICY-Klausel in einem ALTER TABLE- oder ALTER VIEW-Befehl, um eine Aggregationsrichtlinie von einer Tabelle oder Ansicht zu trennen und so die Notwendigkeit der Aggregation der Daten zu entfernen. Der Name der Aggregationsrichtlinie ist nicht erforderlich, da einer Tabelle oder Ansicht nicht mehr als eine Aggregationsrichtlinie zugeordnet werden kann.

ALTER {TABLE | VIEW} <name> UNSET AGGREGATION POLICY
Copy

Wobei:

  • name gibt den Namen der Tabelle oder Ansicht an.

Um beispielsweise eine Aggregationsrichtlinie von Ansicht v1 zu trennen, führen Sie Folgendes aus:

ALTER VIEW v1 UNSET AGGREGATION POLICY;
Copy

Aggregationsrichtlinien überwachen

Es kann hilfreich sein, sich zwei allgemeine Ansätze vorzustellen, um zu bestimmen, wie die Nutzung von Aggregationsrichtlinien überwacht werden soll:

Aggregationsrichtlinien ermitteln

Sie können die Ansicht AGGREGATION_POLICIES im Account Usage-Schema der freigegebenen SNOWFLAKE-Datenbank verwenden. Diese Ansicht ist ein Katalog aller Aggregationsrichtlinien in Ihrem Snowflake-Konto. Beispiel:

SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.AGGREGATION_POLICIES
ORDER BY POLICY_NAME;
Copy

Referenzen von Aggregationsrichtlinien erkennen

Die Information Schema-Tabellenfunktion POLICY_REFERENCES kann Referenzen auf Aggregationsrichtlinien identifizieren. Es gibt zwei verschiedene Syntaxoptionen:

  1. Rückgabe einer Zeile für jedes Objekt (d. h. Tabelle oder Ansicht), auf das die angegebene Aggregationsrichtlinie festgelegt wurde:

    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'));
    
    Copy
  2. Rückgabe einer Zeile für jede Richtlinie, die der Tabelle my_table zugewiesene ist:

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

Abfrageanforderungen

Nachdem eine Aggregationsrichtlinie auf eine Tabelle oder Ansicht angewandt wurde, müssen Abfragen auf dieser Tabelle oder Ansicht bestimmten Anforderungen entsprechen. In diesem Abschnitt wird erörtert, was in einer Abfrage auf einer Tabelle oder Ansicht mit Aggregationseinschränkung zulässig ist und was nicht.

Bemerkung

Sobald ein Teil der Abfrage Daten ordnungsgemäß aggregiert, um die Anforderungen der Aggregationsrichtlinie zu erfüllen, gelten diese Abfragebeschränkungen nicht mehr, und ein anderer Teil der Abfrage kann Dinge enthalten, die sonst nicht zulässig sind.

Die folgende Abfrage kann beispielsweise eine SELECT-Anweisung verwenden, die die Ergebnisse nicht aggregiert, weil ein anderer Teil der Abfrage bereits die Aggregationsanforderungen der Richtlinie erfüllt, die protected_table zugewiesen ist:

SELECT * FROM open_table ot WHERE ot.a > (SELECT SUM(id) FROM protected_table pt)
Copy

Weitere Informationen zu Einschränkungen, die in einer Abfrage enthalten sein können, finden Sie unter Einschränkungen.

Aggregationsfunktionen

Die folgenden Aggregationsfunktionen sind in einer Abfrage für eine Tabelle mit Aggregationseinschränkung zulässig:

Eine Abfrage kann mehr als eine dieser zulässigen Aggregationsfunktionen enthalten. Eine Abfrage schlägt fehl, wenn sie versucht, eine Aggregationsfunktion zu verwenden, die nicht zulässig ist.

Gruppierungsanweisung

Eine Abfrage auf einer Tabelle mit Aggregationseinschränkung muss Daten zu Gruppen einer bestimmten Mindestgröße aggregieren. Die Abfrage kann eine explizite Gruppierungsanweisung (d. h. GROUP BY-Klausel) oder eine skalare Aggregationsfunktion verwenden, die das gesamte Datenset aggregiert (z. B. COUNT(*)).

Filter

Im Allgemeinen schränkt Snowflake nicht ein, wie eine Abfrage WHERE- und ON-Klauseln verwendet, um eine Tabelle mit Aggregationseinschränkung zu filtern, solange sie die vom Filter ausgewählten Zeilen aggregiert.

Joins

Eine Abfrage kann eine Tabelle mit Aggregationseinschränkung mit einer anderen Tabelle, einschließlich einer anderen Tabelle mit Aggregationseinschränkung, verknüpfen.

Snowflake prüft jede Aggregationsgruppe, um sicherzustellen, dass die Anzahl der aus einer Tabelle mit Aggregationseinschränkung entnommenen Zeilen die Mindestgruppengröße dieser Tabelle erreicht oder überschreitet. Wenn beispielsweise eine Tabelle table_a mit Aggregationseinschränkung mit einer minimalen Gruppengröße von 5 verknüpft wird mit einer Tabelle table_b mit Aggregationseinschränkung mit einer minimalen Gruppengröße von 3, muss jede von der Abfrage zurückgegebene Gruppe mit mindestens 5 Zeilen aus table_a und 3 Zeilen aus table_b enthalten.

Ob eine Abfrage mit einem Join die Anforderungen einer Tabelle mit Aggregationseinschränkung erfüllt, wird durch die Anzahl der aus der Tabelle entnommenen Zeilen bestimmt, nicht durch die Größe einer Gruppe. Infolgedessen kann die Größe einer aus den verknüpften Daten erstellten Gruppe größer sein als die Mindestgruppengröße der Tabelle mit Aggregationseinschränkung, aber dennoch zu gefilterten Daten führen. Angenommen, es gilt Folgendes:

  • agg_t weist eine Aggregationseinschränkung mit einer Mindestgruppengröße von 2 auf. Diese Tabelle enthält eine einzelne Integer-Spalte c mit folgendem Inhalt: { 1, 2, 2 }.

  • open_t weist keine Einschränkung auf und enthält eine Integer-Spalte c mit folgendem Inhalt: { 1, 1, 1, 2 }.

Ein Benutzer führt die folgende Abfrage aus, die die beiden Tabellen miteinander verknüpft:

SELECT c, COUNT(*)
FROM agg_t, open_t
WHERE agg_t.c = open_t.c
GROUP BY agg_t.c;
Copy

Die Abfrage gibt Folgendes zurück:

+-----------------+
|  c   | COUNT(*) |
|------+----------|
|  2   |  2       |
|------+----------|
| null |  3       |
+-----------------+

Obwohl die zweite Gruppe 3 Datensätze enthält, was größer ist als die Mindestgruppengröße, beziehen sich alle diese Datensätze auf nur einen einzigen Datensatz aus der Tabelle mit Aggregationseinschränkung, sodass der Wert herausgefiltert wird.

UNION ALL

Eine Abfrage kann UNION ALL verwenden, um die Ergebnisse von zwei Unterabfragen zu kombinieren, auch wenn eine oder mehrere der abgefragten Tabellen eine Aggregationseinschränkung aufweisen. Ähnlich wie bei Joins muss jede Gruppe in den Ergebnissen die Mindestgruppengröße jeder abgefragten Tabelle erfüllen, die eine Aggregationseinschränkung aufweist. Angenommen, es gilt Folgendes:

  • Tabelle protected_table1 hat eine Mindestgruppengröße von 2.

  • Tabelle protected_table2 hat eine Mindestgruppengröße von 5.

Nun wird die folgende Abfrage ausgeführt:

SELECT a, COUNT(*)
FROM (
    SELECT a, b FROM protected_table1
    UNION ALL
    SELECT a, b FROM protected_table2
)
GROUP BY a;
Copy

Jede Gruppe, die durch Schlüssel a gebildet wird, muss 2 Datensätze aus protected_table1 und 5 Datensätze aus protected_table2 enthalten, andernfalls werden die Datensätze einer Restgruppe zugeordnet.

Externe Funktionen

Eine Abfrage kann eine externe Funktion nur dann aufrufen, wenn ein anderer Teil der Abfrage die Ergebnisse ordnungsgemäß aggregiert hat, um die Anforderungen der Tabelle mit Aggregationseinschränkung zu erfüllen.

Logging und Kennzahlen

Eine Abfrage kann eine Spalte einer Tabelle mit Aggregationseinschränkung nicht über UDF-Logging oder Kennzahlen protokollieren.

Datentypkonvertierung

Eine Abfrage, die eine Datentypkonvertierungsfunktion in der SELECT-Anweisung enthält, muss die TRY-Version der Funktion verwenden. Beispielsweise ist die Funktion TRY_CAST zulässig, aber die Funktion CAST ist nicht zulässig. Die folgenden Datentypkonvertierungsfunktionen sind für numerische Typen zulässig:

PIVOT

Eine Abfrage kann den Operator PIVOT nicht auf einer Spalte verwenden, die aus einer Tabelle mit Aggregationseinschränkung stammt.

Erweitertes Beispiel

Das Erstellen einer Aggregationsrichtlinie und das Zuweisen der Aggregationsrichtlinie zu einer Tabelle erfolgt nach demselben allgemeinen Verfahren wie das Erstellen und Zuweisen anderer Richtlinien, wie z. B. Maskierungs- und Projektionsrichtlinien:

  1. Wenn Sie einen zentralen Verwaltungsansatz nutzen, erstellen Sie eine kundenspezifische Rolle (z. B. agg_policy_admin) zum Verwalten der Richtlinie. Alternativ können Sie auch eine externe Rolle verwenden.

  2. Erteilen Sie dieser Rolle die Berechtigung zum Erstellen und Zuweisen von Aggregationsrichtlinien.

  3. Erstellen Sie die Aggregationsrichtlinie.

  4. Weisen Sie die Aggregationsrichtlinie einer Tabelle zu.

Sobald die Aggregationsrichtlinie einer Tabelle zugewiesen ist, müssen erfolgreiche Abfragen der Tabelle deren Daten aggregieren.

Das folgende erweiterte Beispiel gibt einen Einblick in jeden Schritt dieses Prozesses – vom Administrator der Zugriffssteuerung des Anbieters, der eine kundenspezifische Rolle erstellt, bis hin zu einem Datenverbraucher, der eine Abfrage ausführt, um aggregierte Ergebnisse zurückzuerhalten.

Aufgaben des Administrators für die Zugriffssteuerung
  1. Erstellen Sie eine kundenspezifische Rolle zum Verwalten der Aggregationsrichtlinie. Sie können auch eine bestehende Rolle wiederverwenden.

    USE ROLE USERADMIN;
    
    CREATE ROLE AGG_POLICY_ADMIN;
    
    Copy
  2. Erteilen Sie der kundenspezifischen Rolle agg_policy_admin die Berechtigungen zum Erstellen einer Aggregationsrichtlinie in einem Schema, und weisen Sie die Aggregationsrichtlinie einer Tabelle oder Ansicht im Snowflake-Konto zu.

    In diesem Schritt wird davon ausgegangen, dass die Aggregationsrichtlinie in einer Datenbank und einem Schema namens privacy.agg_policies gespeichert wird und dass diese Datenbank und dieses Schema bereits existieren:

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

    Die Rolle agg_policy_admin kann nun einem oder mehreren Benutzern zugewiesen werden.

    Weitere Informationen zu den Berechtigungen, die für die Verwendung von Aggregationsrichtlinien erforderlich sind, finden Sie unter Berechtigungen und Befehle (unter diesem Thema).

Aufgaben des Administrators für Aggregationsrichtlinien
  1. Erstellen Sie eine Aggregationsrichtlinie, die eine Aggregation erfordert, und definieren Sie eine Mindestgruppengröße von 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);
    
    Copy
  2. Weisen Sie die Aggregationsrichtlinie einer Tabelle t1 zu:

    ALTER TABLE t1 SET AGGREGATION POLICY my_policy;
    
    Copy
Abfragen von Verbrauchern

Sobald der Anbieter die Tabelle mit Aggregationseinschränkung freigegeben hat, kann der Datenverbraucher Abfragen darauf ausführen. In diesem Beispiel wird angenommen, dass die Tabelle t1 mit Aggregationseinschränkung die folgenden Zeilen enthält:

peak

state

elevation

washington

NH

6288

cannon

NH

4080

kearsarge

NH

2937

mansfield

VT

4395

killington

VT

4229

wachusett

MA

2006

Angenommen, der Verbraucher führt die folgende Abfrage auf t1 aus:

SELECT state, AVG(elevation) AS avg_elevation
FROM t1
GROUP BY state;
Copy

Dann ist das Ergebnis wie folgt:

+----------+-----------------+
|  STATE   |  AVG_ELEVATION  |
|----------+-----------------+
|  NH      |  4435           |
|  NULL    |  3543           |
+----------+-----------------+

Beachten sie, dass der Wert von state in der zweiten Gruppe NULL ist, da es sich um eine Restgruppe handelt, die den Durchschnitt der Höhe (elevation) der Gipfel (peak) in VT und MA bildet.

Aggregationsrichtlinien mit Snowflake-Features

In den folgenden Unterabschnitten wird kurz zusammengefasst, wie Aggregationsrichtlinien mit verschiedenen Snowflake-Features und -Diensten interagieren.

Andere Richtlinien

Dieser Abschnitt beschreibt, wie eine Aggregationsrichtlinie mit anderen Richtlinien interagiert, einschließlich Maskierungsrichtlinien, Zeilenzugriffsrichtlinien und Projektionsrichtlinien.

Sie können einer Tabelle mit Aggregationseinschränkung weitere Richtlinien zuweisen. Damit eine Abfrage der Tabelle erfolgreich ist, müssen die Anforderungen aller Richtlinien erfüllt werden.

Wenn einer Tabelle mit Aggregationseinschränkung eine Zeilenzugriffsrichtlinie zugewiesen ist, wird eine Zeile, die aufgrund der Zeilenzugriffsrichtlinie aus den Abfrageergebnissen ausgeschlossen wurde, bei der Berechnung der aggregierten Ergebnisse nicht berücksichtigt.

Der Richtlinientext einer Maskierungsrichtlinie, einer Zeilenzugriffsrichtlinie oder einer Projektionsrichtlinie kann nicht auf eine Tabelle mit Aggregationseinschränkung, einschließlich ihrer Spalten, verweisen. Ebenso darf der Richtlinientext der anderen Richtlinie keine UDF enthalten, die eine Referenz auf die Tabelle mit Aggregationseinschränkung enthält.

Ansichten und materialisierte Ansichten

Eine Aggregationsrichtlinie kann sowohl Ansichten als auch materialisierten Ansichten zugewiesen werden. Wenn eine Aggregationsrichtlinie auf eine Ansicht angewendet wird, bedeutet dies nicht, dass dadurch auch die zugrunde liegende Tabelle eine Aggregationseinschränkung aufweist. Diese Basistabelle kann weiterhin ohne Einschränkung abgefragt werden.

Um die Möglichkeit der Offenlegung sensibler Daten zu vermeiden, werden alle Ansichten mit Aggregationseinschränkung so behandelt, als seien sie sichere Ansichten, auch wenn sie es nicht sind.

Ob Sie eine Ansicht aus einer Tabelle mit Aggregationseinschränkung erstellen können, hängt vom Typ der Ansicht ab:

  • Sie können eine Standardansicht aus einer oder mehreren Tabellen mit Aggregationseinschränkung erstellen, jedoch müssen Abfragen auf dieser Ansicht die Daten so aggregieren, dass die Einschränkungen der Basistabellen eingehalten werden.

  • Sie können keine materialisierte Ansicht erstellen, die auf einer Tabelle oder Ansicht mit Aggregationseinschränkung basiert, und Sie können einer Tabelle oder Ansicht, auf denen eine materialisierte Ansicht basiert, keine Aggregationsrichtlinie zuweisen.

Geklonte Objekte

Der folgende Ansatz unterstützt Sie dabei, Daten vor Benutzern mit SELECT-Berechtigung für eine geklonte Tabelle oder Ansicht schützen, die in der geklonten Datenbank oder dem geklonten Schema gespeichert ist:

  • Das Klonen eines einzelnen Aggregationsrichtlinienobjekts wird nicht unterstützt.

  • Das Klonen einer Datenbank führt zum Klonen aller Aggregationsrichtlinien innerhalb der Datenbank.

  • Das Klonen eines Schemas führt zum Klonen aller Aggregationsrichtlinien innerhalb des Schemas.

  • Einer geklonten Tabelle sind dieselben Aggregationsrichtlinien zugeordnet wie der Quelltabelle.

    • Wenn eine Tabelle im Kontext des Klonens ihres übergeordneten Schemas geklont wird und die Quelltabelle einen Verweis auf eine Richtlinie in demselben übergeordneten Schema enthält (d. h. eine lokale Referenz), dann enthält auch die geklonte Tabelle eine Referenz auf die geklonte Aggregationsrichtlinie.

    • Wenn die Quelltabelle auf eine Aggregationsrichtlinie in einem anderen Schema verweist (d. h. eine Fremdreferenz), dann behält die geklonte Tabelle die Fremdreferenz bei.

Weitere Informationen dazu finden Sie unter CREATE <Objekt> … CLONE.

Replikation

Aggregationsrichtlinien und deren Zuweisungen können mithilfe von Datenbankreplikation und Replikationsgruppen repliziert werden.

Bei der Datenbankreplikation kann die Replikationsoperation fehlschlagen, wenn eine der folgenden Bedingungen erfüllt ist:

  • Die Primärdatenbank befindet sich in einem Enterprise-Konto (oder höher) und enthält eine Richtlinie, aber mindestens eines der zur Replikation genehmigten Konten befindet sich in einer niedrigeren Edition.

  • Eine in der Primärdatenbank enthaltene Tabelle oder Ansicht hat eine verwaiste Referenz auf eine Aggregationsrichtlinie in einer anderen Datenbank.

Das Verhalten von verwaisten Referenzen bei der Datenbankreplikation kann umgangen werden, wenn mehrere Datenbanken in einer Replikationsgruppe repliziert werden.

Berechtigungen und Befehle

Die folgenden Unterabschnitte enthalten Informationen zum Verwalten von Aggregationsrichtlinien.

Berechtigungen von Aggregationsrichtlinien

Snowflake unterstützt die folgenden Berechtigungen für das Aggregationsrichtlinienobjekt.

Beachten Sie, dass für die Bearbeitung eines Objekts in einem Schema auch die Berechtigung USAGE für die übergeordnete Datenbank und das Schema erforderlich ist.

Berechtigung

Verwendung

APPLY

Ermöglicht Set- und Unset-Operationen für die Aggregationsrichtlinie auf einer Tabelle.

OWNERSHIP

Überträgt die Eigentümerschaft an der Aggregationsrichtlinie, wodurch die volle Kontrolle über die Aggregationsrichtlinie gewährt wird. Erforderlich, um die meisten Eigenschaften einer Aggregationsrichtlinie zu ändern.

Weitere Details dazu finden Sie unter Übersicht der DDL-Befehle, Operationen und Berechtigungen (unter diesem Thema).

Übersicht zu DDL für Aggregationsrichtlinien

Snowflake unterstützt die folgenden DDL-Befehle zum Erstellen und Verwalten von Aggregationsrichtlinien:

Übersicht der DDL-Befehle, Operationen und Berechtigungen

Die folgende Tabelle fasst die Beziehung zwischen den Aggregationsrichtlinien-Berechtigungen und DDL-Operationen zusammen.

Beachten Sie, dass für die Bearbeitung eines Objekts in einem Schema auch die Berechtigung USAGE für die übergeordnete Datenbank und das Schema erforderlich ist.

Operation

Erforderliche Berechtigung

Aggregationsrichtlinie erstellen

Eine Rolle mit CREATE AGGREGATION POLICY-Berechtigung in demselben Schema.

Aggregationsrichtlinie ändern

Die Rolle mit OWNERSHIP-Berechtigung für die Aggregationsrichtlinie.

Aggregationsrichtlinie beschreiben

Eine der folgenden Optionen:

  • Eine Rolle mit der globalen Berechtigung APPLY AGGREGATION POLICY oder

  • Eine Rolle mit OWNERSHIP-Berechtigung für die Aggregationsrichtlinie oder

  • Eine Rolle mit APPLY-Berechtigung für die Aggregationsrichtlinie.

Aggregationspolitik löschen

Eine Rolle mit OWNERSHIP-Berechtigung für die Aggregationsrichtlinie.

Aggregationsrichtlinien anzeigen

Eine der folgenden Optionen:

  • Eine Rolle mit USAGE-Berechtigung für das Schema, in dem die Aggregationsrichtlinie existiert, oder

  • Eine Rolle mit der Berechtigung APPLY AGGREGATION POLICY für das Konto.

Aggregationsrichtlinie für eine Tabelle festlegen/aufheben

Eine der folgenden Optionen:

  • Eine Rolle mit APPLY AGGREGATION POLICY-Berechtigung für das Konto oder

  • Eine Rolle mit APPLY-Berechtigung für die Aggregationsrichtlinie und OWNERSHIP-Berechtigung für die Tabelle oder Ansicht.

Snowflake unterstützt verschiedene Berechtigungen zum Erstellen und Festlegen einer Aggregationsrichtlinie für ein Objekt.

  1. Bei einem zentralen Ansatz für die Verwaltung von Aggregationsrichtlinien, bei dem die kundenspezifische Rolle aggregation_policy_admin Aggregationsrichtlinien für alle Objekte erstellt und festlegt, sind die folgenden Berechtigungen erforderlich:

    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;
    
    Copy
  2. In einem hybriden Verwaltungsansatz verfügt eine einzelne Rolle über die CREATE AGGREGATION POLICY-Berechtigung, um die konsistente Benennung der Aggregationsrichtlinien sicherzustellen, und einzelne Teams oder Rollen verfügen über die APPLY-Berechtigung für eine bestimmte Aggregationsrichtlinie.

    So kann beispielsweise der kundenspezifischen Rolle finance_role die Berechtigung erteilt werden, die Aggregationsrichtlinie cost_center für Tabellen und Ansichten festzulegen, deren Eigentümer die Rolle ist (d. h. die Rolle hat die OWNERSHIP-Berechtigung für die Tabelle oder Ansicht):

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