Projektionsrichtlinien

In diesem Thema erfahren Sie, wie Sie mithilfe von Projektionsrichtlinien die Spaltenprojektion in der endgültigen Ausgabe eines SQL-Abfrageergebnisses zulassen oder verhindern können.

Überblick

Eine Projektionsrichtlinie ist ein First-Class-Objekt auf Schemaebene, das definiert, ob eine Spalte in die Ausgabe eines SQL-Abfrageergebnisses projiziert werden kann. Eine Spalte, der eine Projektionsrichtlinie zugewiesen wurde, wird als Spalte mit Projektionseinschränkung bezeichnet. Projektionsrichtlinien können verwendet werden, um sensible oder private Informationen (z. B. Namen oder Telefonnummern) bei der gemeinsamen Nutzung von Daten sicher zwischen Partnern einzuschränken.

Beachten Sie jedoch, dass Spalten, die durch Projektionsrichtlinien ausgeblendet werden, dennoch in inneren Abfragen oder in WHERE-Klauseln verwendet werden können, die Informationen über ein bestimmtes Feld offenlegen können. Weitere Informationen dazu finden Sie im Abschnitt Hinweise (unter diesem Thema).

Nach dem Erstellen der Projektionsrichtlinie kann ein Richtlinienadministrator die Projektionsrichtlinie einer Spalte zuweisen. Einer Spalte kann immer nur eine Projektionsrichtlinie zugewiesen sein. Ein Benutzer kann die Spalte nur dann projizieren, wenn seine aktive Rolle einer Projektionsrichtlinienbedingung entspricht, die die Projektion der Spalte erlaubt.

Beachten Sie, dass eine Spalte mit Projektionseinschränkung außerdem durch eine Maskierungsrichtlinie geschützt werden kann und dass die Tabelle, die die Spalte mit Projektionseinschränkung enthält, durch eine Zeilenzugriffsrichtlinie geschützt werden kann. Weitere Details dazu finden Sie unter Richtlinien für Maskierung und Zeilenzugriff (unter diesem Thema).

Spaltennutzung

Snowflake verfolgt die Nutzung von Spalten. Indirekte Referenzen auf eine Spalte, wie z. B. eine Ansichtsdefinition, eine UDF (unter diesem Thema) oder ein allgemeiner Tabellenausdruck, wirken sich auf die Spaltenprojektion aus, wenn eine Projektionsrichtlinie für eine Spalte festgelegt ist.

Wenn eine Projektionsrichtlinie für die Spalte festgelegt ist und die Spalte nicht projiziert werden kann, gilt Folgendes:

  • Die Spalte kann nicht in der Ausgabe eines Abfrageergebnisses enthalten sein.

  • Die Spalte kann nicht in eine andere Tabelle eingefügt werden.

  • Die Spalte kann nicht als Argument für eine externe Funktion oder gespeicherte Prozedur verwendet werden.

Einschränkungen

  • Weitere Informationen zu Einschränkungen bei benutzerdefinierten Funktionen (UDFs) finden Sie unter Benutzerdefinierte Funktionen (UDFs) (unter diesem Thema).

  • Eine Projektionsrichtlinie kann nicht auf Folgendes angewendet werden:

    • Ein einer Tabelle oder Spalte zugewiesenes Tag (d. h. eine Tag-basierte Projektionsrichtlinie).

    • Eine virtuelle Spalte oder die Spalte VALUE in einer externen Tabelle. Als Problemumgehung können Sie eine Ansicht erstellen und jeder Spalte, die nicht projiziert werden soll, eine Projektionsrichtlinie zuweisen.

    • Die Spalte value_column in einem PIVOT-Konstrukt. Weitere Informationen dazu finden Sie unter UNPIVOT (unter diesem Thema):

  • Der body einer Projektionsrichtlinie kann nicht auf eine durch eine Maskierungsrichtlinie geschützte Spalte oder eine durch eine Zeilenzugriffsrichtlinie geschützte Tabelle verweisen. Weitere Informationen dazu finden Sie unter Richtlinien für Maskierung und Zeilenzugriff (unter diesem Thema).

Hinweise

Verwenden Sie Projektionsrichtlinien, wenn im Anwendungsfall die Abfrage einer sensiblen Spalte erforderlich ist, aber der Spaltenwert einem Analysten oder einer ähnlichen Rolle nicht direkt zugänglich sein darf. Der Spaltenwert innerhalb einer Spalte mit Projektionseinschränkung kann mit größerer Flexibilität analysiert werden als ein maskierter oder tokenisierter Wert. Bevor Sie jedoch eine Projektionsrichtlinie für eine Spalte festlegen, müssen Sie Folgendes beachten:

  • Eine Projektionsrichtlinie verhindert nicht, dass eine Person gezielt anvisiert werden kann.

    So kann ein Benutzer beispielsweise Zeilen filtern, in denen die Spalte name einer bestimmten Person entspricht, selbst wenn die Spalte eine Projektionseinschränkung aufweist. Der Benutzer kann jedoch keine SELECT-Anweisung ausführen, um die Namen der Personen in der Tabelle anzuzeigen.

  • Wenn eine Spalte mit Projektionseinschränkung der Verknüpfungsschlüssel für eine Abfrage ist, bei der Daten aus der geschützten Tabelle mit Daten aus einer ungeschützten Tabelle kombiniert werden, hindert nichts den Benutzer daran, Werte aus der Spalte in der ungeschützten Tabelle zu projizieren. Wenn also ein Wert in der ungeschützten Tabelle mit einem Wert in der geschützten Spalte übereinstimmt, kann der Benutzer diesen Wert erhalten, indem er ihn aus der ungeschützten Tabelle projiziert.

    Angenommen, der Spalte email der Tabelle t_protected wurde eine Projektionsrichtlinie zugewiesen. Ein Benutzer kann immer noch Werte in der Spalte t_protected.email ermitteln, indem Folgendes ausgeführt wird:

    SELECT t_unprotected.email
      FROM t_unprotected JOIN t_protected ON t_unprotected.email = t_protected.email;
    
    Copy
  • Eine Projektionseinschränkung garantiert nicht, dass ein böswilliger Akteur nicht absichtliche Abfragen verwenden könnte, um potenziell sensible Daten aus einer projektionseingeschränkten Spalte zu erhalten. Projektionsrichtlinien eignen sich am besten für Partner und Kunden, zu denen Sie bereits ein gewisses Vertrauen aufgebaut 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).

  • Aus all diesen Gründen sollten Sie, wenn Sie die Weitergabe von Informationen über eine bestimmte Spalte oder Entität verhindern müssen, die Spalte vollständig aus Ihren Daten weglassen oder differentielle Privatsphäre verwenden.

Projektionsrichtlinie erstellen

Eine Projektionsrichtlinie enthält einen body, der die interne Funktion PROJECTION_CONSTRAINT aufruft, um zu bestimmen, ob eine Spalte projiziert werden soll.

CREATE OR REPLACE PROJECTION POLICY <name>
  AS () RETURNS PROJECTION_CONSTRAINT -> <body>
Copy

Wobei:

  • name gibt den Namen der Richtlinie an.

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

  • body ist ein SQL-Ausdruck, der bestimmt, ob die Spalte projiziert werden soll. Dies kann CASE und andere gültige SQL-Anweisungen einschließen und kann auch SELECT-Klauseln einschließen, die als TRUE oder FALSE ausgewertet werden. Geben Sie nicht NULL zurück, um die Projektion zu verbieten. Sie müssen die interne Funktion PROJECTION_CONSTRAINT mit einem Parameterwert zurückgeben, der die Projektion einer Spalte erlaubt oder verhindert:

    • PROJECTION_CONSTRAINT(ALLOW => true) erlaubt es, eine Spalte zu projizieren.

    • PROJECTION_CONSTRAINT(ALLOW => false) erlaubt es nicht, eine Spalte zu projizieren.

Beispiele für Richtlinien

Die einfachsten Projektionsrichtlinien rufen die Funktion PROJECTION_CONSTRAINT direkt auf:

Spaltenprojektion zulassen
CREATE OR REPLACE PROJECTION POLICY mypolicy
AS () RETURNS PROJECTION_CONSTRAINT ->
PROJECTION_CONSTRAINT(ALLOW => true)
Copy
Spaltenprojektion verhindern
CREATE OR REPLACE PROJECTION POLICY mypolicy
AS () RETURNS PROJECTION_CONSTRAINT ->
PROJECTION_CONSTRAINT(ALLOW => false)
Copy

Kompliziertere SQL-Ausdrücke können geschrieben werden, um die PROJECTION_CONSTRAINT-Funktion aufzurufen. Der Ausdruck kann Funktionen für bedingte Ausdrücke und Kontextfunktionen verwenden, um eine Logik einzuführen, die es bestimmten Benutzern mit einer bestimmten Rolle erlaubt, eine Spalte zu projizieren, und alle anderen Benutzer daran hindert, eine Spalte zu projizieren.

Tipp

Bei der Verwendung von Kontextfunktionen in einer bedingten Richtlinie können Sie die folgenden Strategien anwenden:

  • Kontextfunktionen geben Zeichenfolgen zurück, sodass bei Vergleichen mit diesen Funktionen die Groß-/Kleinschreibung beachtet wird. Sie können LOWER verwenden, um Zeichenfolgen in Kleinbuchstaben umzuwandeln, wenn Sie einen Vergleich ohne Berücksichtigung der Groß-/Kleinschreibung durchführen möchten.

  • Die Funktion POLICY_CONTEXT hilft Ihnen zu beurteilen, ob ein Richtlinientext den korrekten Wert zurückgibt, wenn eine Kontextfunktion einen bestimmten Wert zurückgibt. Die Funktion POLICY_CONTEXT simuliert Abfrageergebnisse, die auf einem bestimmten Wert einer oder mehrerer Kontextfunktionen basieren.

Das folgende Beispiel enthält einen CASE-Ausdruck und eine CURRENT_ROLE-Kontextfunktion, um eine bedingte Richtlinie zu erstellen, die es nur Benutzern mit der benutzerdefinierten Rolle analyst erlaubt, eine Spalte zu projizieren:

CREATE OR REPLACE PROJECTION POLICY mypolicy
AS () RETURNS PROJECTION_CONSTRAINT ->
CASE
  WHEN CURRENT_ROLE() = 'ANALYST'
    THEN PROJECTION_CONSTRAINT(ALLOW => true)
  ELSE PROJECTION_CONSTRAINT(ALLOW => false)
END;
Copy

Das folgende Beispiel verwendet die Funktion SYSTEM$GET_TAG_ON_CURRENT_COLUMN, sodass ein Tag, das einer Spalte zugewiesen ist, bestimmt, ob die Spalte projiziert werden kann. Wenn in diesem Fall die Richtlinie einer Spalte zugewiesen ist, muss der Wert des tags.accounting_col-Tags auf dieser Spalte public sein, um die Spalte zu projizieren.

CREATE PROJECTION POLICY mypolicy
AS () RETURNS PROJECTION_CONSTRAINT ->
CASE
  WHEN SYSTEM$GET_TAG_ON_CURRENT_COLUMN('tags.accounting_col') = 'public'
    THEN PROJECTION_CONSTRAINT(ALLOW => true)
  ELSE PROJECTION_CONSTRAINT(ALLOW => false)
END;
Copy

Bei Data Sharing-Anwendungsfällen kann der Anbieter eine Projektionsrichtlinie schreiben, um die Spaltenprojektion für alle Verbraucherkonten mit der Kontextfunktion CURRENT_ACCOUNT einzuschränken oder um die Spaltenprojektion in bestimmten Freigaben mit der Kontextfunktion INVOKER_SHARE selektiv einzuschränken. Beispiel:

Alle Verbraucherkonten einschränken

In diesem Beispiel ist provider.account der Kontobezeichner im Kontonamensformat:

CREATE OR REPLACE PROJECTION POLICY restrict_consumer_accounts
AS () RETURNS PROJECTION_CONSTRAINT ->
CASE
  WHEN CURRENT_ACCOUNT() = 'provider.account'
    THEN PROJECTION_CONSTRAINT(ALLOW => true)
  ELSE PROJECTION_CONSTRAINT(ALLOW => false)
END;
Copy
Bestimmte Freigaben einschränken

Angenommen, bei einem Data Sharing-Anbieterkonto ist auf einer Spalte einer sicheren Ansicht eine Projektionsrichtlinie festgelegt. Es gibt zwei verschiedene Freigaben (SHARE1 und SHARE2), die auf die sichere Ansicht zugreifen können, um zwei verschiedene Data Sharing-Verbraucher zu unterstützen.

Wenn ein Benutzer im Data Sharing-Verbraucherkonto versucht, die Spalte über eine der beiden Freigaben zu projizieren, dann kann die Spalte projiziert werden, bei anderen Freigaben kann die Spalte nicht projiziert werden:

CREATE OR REPLACE PROJECTION POLICY projection_share
AS () RETURNS PROJECTION_CONSTRAINT ->
CASE
  WHEN INVOKER_SHARE() IN ('SHARE1', 'SHARE2')
    THEN PROJECTION_CONSTRAINT(ALLOW => true)
  ELSE PROJECTION_CONSTRAINT(ALLOW => false)
END;
Copy
Abfrage einer separaten Tabelle zur Bestimmung der Projektionsrichtlinie

Sie können eine SELECT-Abfrage in Ihrer Richtlinienlogik verwenden, um zu bestimmen, ob die Projektion erlaubt oder blockiert werden soll. Wenn Sie eine Tabelle (eine Zuordnungstabelle) auf diese Weise abfragen, empfehlen wir, die Zuordnungstabelle in derselben Datenbank wie die geschützte Tabelle abzulegen. Dies ist besonders wichtig, wenn der body Abschnitt IS_DATABASE_ROLE_IN_SESSION aufruft.

Hier ein erweitertes Beispiel für die Erstellung und Befüllung einer einfachen Zuordnungstabelle von Rollennamen und Projektionsberechtigung und die anschließende Abfrage dieser Tabelle, um festzustellen, ob eine Spalte auf den aktuellen Benutzer entsprechend seiner Rolle projiziert werden kann.

-- Create mapping table with two columns: role name, whether that role can project the column
CREATE OR REPLACE TABLE roles_with_access(role string, allowed boolean)
AS SELECT * FROM VALUES ('ACCOUNTADMIN', true), ('RANDOM_ROLE', false);

-- Create a policy that queries the mapping table, and allows projection when current
-- user role has an `allowed` value of TRUE.
-- Note that the logic is written to default to FALSE in all other cases, including the
-- current role not being in the queried table.
CREATE OR REPLACE PROJECTION POLICY pp AS () RETURNS projection_constraint ->
  CASE WHEN
    exists(
      SELECT 1 FROM roles_with_access WHERE role = current_role() AND allowed = true
    ) THEN projection_constraint(ALLOW=>true)
  ELSE projection_constraint(ALLOW=>false) END;

-- Create a new table with the policy and query it in one step.
CREATE OR REPLACE TABLE t(user string, address string WITH PROJECTION POLICY pp)
  AS SELECT * FROM VALUES ('Carson', 'CA'), ('Emily', 'NY'), ('John', 'NV');

-- Succeeds
USE ROLE ACCOUNTADMIN;
SELECT * FROM t;

-- Fails with projection policy error on column ADDRESS
USE ROLE any_other_role;
SELECT * FROM t;
Copy

Projektionsrichtlinie zuweisen

Eine Projektionsrichtlinie wird mit einem ALTER TABLE … ALTER COLUMN-Befehl auf eine Tabellenspalte und mit einem ALTER VIEW-Befehl auf eine Ansichtsspalte angewendet. Jede Spalte kann nur genau eine Projektionsrichtlinie unterstützen.

ALTER { TABLE | VIEW } <name>
{ ALTER | MODIFY } COLUMN <col1_name>
SET PROJECTION POLICY <policy_name> [ FORCE ]
[ , <col2_name> SET PROJECTION POLICY <policy_name> [ FORCE ] ... ]
Copy

Wobei:

  • name gibt den Namen der Tabelle oder Ansicht an.

  • col1_name gibt den Namen der Spalte in der Tabelle oder Ansicht an.

  • col2_name gibt den Namen einer zusätzlichen Spalte in der Tabelle oder Ansicht an.

  • policy_name gibt den Namen der Projektionsrichtlinie an, die für die Spalte festgelegt wurde.

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

So setzen Sie beispielsweise eine Projektionsrichtlinie proj_policy_acctnumber auf die Spalte account_number einer Tabelle:

ALTER TABLE finance.accounting.customers
 MODIFY COLUMN account_number
 SET PROJECTION POLICY proj_policy_acctnumber;
Copy

Sie können auch die WITH-Klausel in einem CREATE TABLE und CREATE VIEW-Befehl verwenden, um einer Spalte eine Projektionsrichtlinie zuzuweisen, wenn die Tabelle oder Ansicht erstellt wird. Um beispielsweise der Spalte account_number einer neuen Tabelle die Richtlinie my_proj_policy zuzuweisen, führen Sie Folgendes aus:

CREATE TABLE t1 (account_number NUMBER WITH PROJECTION POLICY my_proj_policy);
Copy

Sie können die WITH-Klausel auch verwenden, wenn Sie eine neue Spalte zu einer bestehenden Tabelle hinzufügen. Um beispielsweise die Richtlinie my_proj_policy der Spalte zipcode zuzuweisen, die wiederum der bestehenden Tabelle customers hinzugefügt wird, führen Sie Folgendes aus:

ALTER TABLE customers ADD COLUMN account_number NUMBER WITH PROJECTION POLICY my_proj_policy;
Copy

Projektionsrichtlinie ersetzen

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

So können Sie beispielsweise einer Spalte, die bereits eine Projektionseinschränkung aufweist, eine neue Projektionsrichtlinie zuweisen:

ALTER TABLE finance.accounting.customers
  MODIFY COLUMN account_number
  SET PROJECTION POLICY proj_policy2 FORCE;
Copy

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

Projektionsrichtlinie trennen

Verwenden Sie die UNSET PROJECTION POLICY-Klausel eines ALTER TABLE- oder ALTER VIEW-Befehls, um eine Projektionsrichtlinie von der Spalte einer Tabelle oder Ansicht zu lösen. Der Name der Projektionsrichtlinie ist nicht erforderlich, da einer Spalte nicht mehr als eine Projektionsrichtlinie zugeordnet werden kann.

ALTER { TABLE | VIEW } <name>
{ ALTER | MODIFY } COLUMN <col1_name>
UNSET PROJECTION POLICY
[ , <col2_name> UNSET PROJECTION POLICY ... ]
Copy

Wobei:

  • name gibt den Namen der Tabelle oder Ansicht an.

  • col1_name gibt den Namen der Spalte in der Tabelle oder Ansicht an.

  • col2_name gibt den Namen einer zusätzlichen Spalte in der Tabelle oder Ansicht an.

So trennen Sie beispielsweise die Projektionsrichtlinie von der Spalte account_number:

ALTER TABLE finance.accounting.customers
 MODIFY COLUMN account_number
 UNSET PROJECTION POLICY;
Copy

Projektionsrichtlinien mit SQL überwachen

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

Projektionsrichtlinien ermitteln

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

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

Referenzen von Projektionsrichtlinien erkennen

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

  1. Rückgabe einer Zeile für jedes Objekt (d. h. Tabelle oder Ansicht), bei dem die angegebene Projektionsrichtlinie auf eine Spalte gesetzt wurde:

    USE DATABASE my_db;
    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.projpolicy'));
    
    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

Erweitertes Beispiel

Das Erstellen einer Projektionsrichtlinie und das Zuweisen der Projektionsrichtlinie zu einer Spalte erfolgt nach demselben allgemeinen Verfahren wie das Erstellen und Zuweisen anderer Richtlinien, wie Maskierungs- und Zeilenzugriffsrichtlinien:

  1. Erstellen Sie bei einem zentralen Verwaltungsansatz eine kundenspezifische Rolle (z. B. proj_policy_admin) zum Verwalten der Richtlinie.

  2. Erteilen Sie dieser Rolle die Berechtigung, eine Projektionsrichtlinie zu erstellen und zuzuweisen.

  3. Erstellen Sie die Projektionsrichtlinie.

  4. Weisen Sie die Projektionsrichtlinie einer Spalte zu.

Führen Sie auf der Grundlage dieser allgemeinen Vorgehensweise die folgenden Schritte aus, um einer Spalte eine Projektionsrichtlinie zuzuweisen:

  1. Erstellen Sie eine kundenspezifische Rolle zum Verwalten der Projektionsrichtlinie.

    USE ROLE useradmin;
    
    CREATE ROLE proj_policy_admin;
    
    Copy
  2. Erteilen Sie der kundenspezifischen Rolle proj_policy_admin die Berechtigungen zum Erstellen einer Projektionsrichtlinie in einem Schema, und weisen Sie die Projektionsrichtlinie einer Tabellen- oder Ansichtsspalte im Snowflake-Konto zu.

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

    GRANT USAGE ON DATABASE privacy TO ROLE proj_policy_admin;
    GRANT USAGE ON SCHEMA privacy.projpolicies TO ROLE proj_policy_admin;
    
    GRANT CREATE PROJECTION POLICY
      ON SCHEMA privacy.projpolicies TO ROLE proj_policy_admin;
    
    GRANT APPLY PROJECTION POLICY ON ACCOUNT TO ROLE proj_policy_admin;
    
    Copy

    Weitere Details dazu finden Sie unter Berechtigungen und Befehle (unter diesem Thema).

  3. Erstellen Sie eine Projektionsrichtlinie, um die Spaltenprojektion zu verhindern:

    USE ROLE proj_policy_admin;
    USE SCHEMA privacy.projpolicies;
    
    CREATE OR REPLACE PROJECTION POLICY proj_policy_false
    AS () RETURNS PROJECTION_CONSTRAINT ->
    PROJECTION_CONSTRAINT(ALLOW => false);
    
    Copy
  4. Weisen Sie die Projektionsrichtlinie einer Tabellenspalte zu:

    ALTER TABLE customers MODIFY COLUMN active
    SET PROJECTION POLICY privacy.projpolicies.proj_policy_false;
    
    Copy

Projektionsrichtlinien mit Snowflake-Features

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

Richtlinien für Maskierung und Zeilenzugriff

In diesem Abschnitt wird beschrieben, wie eine Projektionsrichtlinie mit einer Maskierungsrichtlinie und einer Zeilenzugriffsrichtlinie interagiert.

Mehrere Richtlinien:

Einer Spalte können gleichzeitig eine Maskierungsrichtlinie und eine Projektionsrichtlinie zugewiesen sein, und die Tabelle, die diese Spalte enthält, kann durch eine Zeilenzugriffsrichtlinie geschützt sein. Wenn alle drei Richtlinien vorhanden sind, verarbeitet Snowflake die Tabelle und die Richtlinien wie folgt:

  1. Zeilenfilter werden gemäß der Zeilenzugriffsrichtlinie angewendet.

  2. Es wird ermittelt, ob die Abfrage versucht, Spalten zu projizieren, die durch die Projektionsrichtlinie eingeschränkt sind, und wenn ja, wird die Abfrage zurückgewiesen.

  3. Spaltenmasken werden gemäß der Maskierungsrichtlinie angewendet.

Eine Spalte, die durch eine Maskierungsrichtlinie geschützt ist, kann auch eine Projektionseinschränkung aufweisen. Beispielsweise kann eine Maskierungsrichtlinie, die auf einer Spalte mit Kontonummern festgelegt ist, eine Bedingung enthalten, die es Benutzern mit der benutzerdefinierten Rolle finance_admin erlaubt, die Kontonummern zu sehen, und eine andere Bedingung, die die Kontonummern für alle anderen Rollen durch einen Hash ersetzt.

Eine Projektionsrichtlinie kann die Spalte weiter einschränken, sodass Benutzer mit der kundenspezifischen Rolle analyst die Spalte nicht projizieren können. Beachten Sie, dass Benutzer mit der benutzerdefinierten Rolle analyst die Spalte immer noch analysieren können, indem sie Hashes gruppieren oder eine Verknüpfung (Join) über diese Hashes vornehmen.

Snowflake empfiehlt, dass Richtlinienadministratoren mit internen Compliance- und Regulierungsbeauftragten zusammenarbeiten, um die Spalten zu bestimmen, für die Projektionseinschränkungen gelten sollen.

Evaluation von Richtlinien:

Eine Spalte mit Projektionseinschränkung kann in folgenden Fällen nicht durch eine Maskierungsrichtlinie oder eine Zeilenzugriffsrichtlinie referenziert werden:

  • Hinzufügen einer Zeilenzugriffsrichtlinie zu einer Tabelle

  • Enumerieren einer oder mehrerer Spalten in einer bedingten Maskierungsrichtlinie

  • Ausführen eines Lookups auf einer Zuordnungstabelle

Wie im Abschnitt Einschränkungen (unter diesem Thema) erwähnt, kann im body einer Projektionsrichtlinie nicht auf eine durch eine Maskierungsrichtlinie geschützte Spalte oder eine durch eine Zeilenzugriffsrichtlinie geschützte Tabelle verwiesen werden.

Abhängige Objekte mit anderen Projektionsrichtlinien

Betrachten Sie die folgende Serie von Objekten:

base_table » v1 » v2

Wobei:

  • v1 ist eine aus der Tabelle namens base_table erstellte Ansicht.

  • v2 ist eine aus v1 erstellte Ansicht.

Wenn es eine Abfrage auf einer Spalte einer Ansicht gibt, die eine Projektionseinschränkung aufweist, und diese Spalte von einer base_table-Spalte mit Projektionseinschränkung abhängt, wird die Ansichtsspalte nur projiziert, wenn beide Projektionsrichtlinien die Projektion der Spalte erlauben.

Snowflake prüft die Spaltenherkunftskette bis hinunter zur Basistabelle, um sicherzustellen, dass alle Referenzen auf die Spalte keine Projektionseinschränkung aufweisen. Wenn eine Spalte in der Herkunftskette eine Projektionseinschränkung aufweist und die Spalte nicht projiziert werden darf, blockiert Snowflake die Abfrage.

Ansichten und materialisierte Ansichten

Eine Projektionsrichtlinie auf einer Ansichtsspalte schränkt die Ansichtsspalte ein, aber nicht die zugrunde liegende Basistabellenspalte.

Was die Referenzen betrifft, so wird eine Projektionsrichtlinie, die eine Tabellenspalte einschränkt, auf eine Ansicht übertragen, die auf die eingeschränkte Tabellenspalte verweist.

Streams und Aufgaben

Projektionsrichtlinien auf Spalten einer Tabelle werden auf einen Stream derselben Tabelle übertragen. Beachten Sie, dass eine Projektionsrichtlinie nicht auf einen Stream festgelegt werden kann.

In ähnlicher Weise bleibt eine Spalte mit Projektionsrichtlinie eingeschränkt, wenn eine Aufgabe auf die eingeschränkte Spalte verweist.

UNPIVOT

Das Ergebnis eines UNPIVOT-Konstrukts hängt davon ab, ob eine Spalte ursprünglich durch eine Projektionsrichtlinie eingeschränkt war. Hinweis:

  • Bei eingeschränkten Spalten bleibt die Projektionseinschränkung vor und nach der Ausführung von UNPIVOT erhalten.

  • Die Spalte name_column wird immer im Abfrageergebnis angezeigt.

  • Wenn eine der Spalten in der column_list-Liste eine Projektionseinschränkung aufweist, weist auch die Spalte value_column eine Projektionseinschränkung auf.

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 Projektionsrichtlinienobjekts wird nicht unterstützt.

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

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

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

    • Wenn die Quelltabelle auf eine Projektionsrichtlinie 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

Projektionsrichtlinien 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 Projektionsrichtlinie in einer anderen Datenbank.

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

Benutzerdefinierte Funktionen (UDFs)

Beachten Sie die folgenden Hinweise zu Projektionseinschränkungen und UDFs:

Skalare SQL-UDFs:

Snowflake wertet die UDF aus und wendet dann die Projektionsrichtlinie auf die Spalte mit Projektionseinschränkung an.

Wenn eine Spalte in einer SELECT-Anweisung transitiv von einer UDF abgeleitet ist, die wiederum von einer Spalte mit Projektionseinschränkung abgeleitet ist, blockiert Snowflake die Abfrage. Mit anderen Worten:

pc_column » UDF » column (in SELECT-Anweisung)

Wobei:

  • pc_column bezieht sich auf eine Spalte mit Projektionseinschränkung.

Da die Spalte in der SELECT-Anweisung auf eine Spalte mit Projektionseinschränkung zurückverfolgt werden kann, blockiert Snowflake die Abfrage.

SQL UDTFs:

SQL-UDTF (benutzerdefinierte Tabellenfunktionen) verhalten sich genauso wie SQL-UDFs, mit dem Unterschied, dass aufgrund der Rückgabe von Zeilen in der Funktionsausgabe Snowflake jede Tabellenspalte unabhängig auswertet, um festzustellen, ob die Spalte in der Funktionsausgabe projiziert werden soll.

Andere UDFs:

Das Folgende gilt für Einführung in Java-UDFs, Einführung in JavaScript-UDFs, Einführung in Python-UDFs:

  • Eine Spalte mit Projektionseinschränkung ist in der UDTF-Ausgabe eingeschränkt.

Logging und Ereignistabellen:

Wenn eine UDF, UDTF oder JavaScript-UDF ein Argument mit Projektionseinschränkung hat, erfasst Snowflake keine Protokoll- und Ereignisdetails in der entsprechenden Ereignistabelle. Snowflake lässt jedoch die Ausführung der UDF/UDTF zu und lässt die Anweisung, die die UDF/UDTF aufruft, nicht aus Logging-Gründen fehlschlagen.

Berechtigungen und Befehle

Die folgenden Unterabschnitte enthalten Informationen zum Verwalten von Projektionsrichtlinien.

Berechtigungen von Projektionsrichtlinien

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

USAGE-Berechtigung für die übergeordnete Datenbank und das Schema ist erforderlich, um Operationen an einem beliebigen Objekt in einem Schema durchzuführen.

Berechtigung

Verwendung

APPLY

Ermöglicht Set- und Unset-Operationen für die Projektionsrichtlinie auf einer Spalte.

OWNERSHIP

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

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

Übersicht zu DDL für Projektionsrichtlinien

Snowflake unterstützt die folgenden DDL-Befehle zum Erstellen und Verwalten von Projektionsrichtlinien.

Übersicht der DDL-Befehle, Operationen und Berechtigungen

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

USAGE-Berechtigung für die übergeordnete Datenbank und das Schema ist erforderlich, um Operationen an einem beliebigen Objekt in einem Schema durchzuführen.

Operation

Erforderliche Berechtigung

Sitzungsrichtlinie erstellen

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

Sitzungsrichtlinie ändern

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

Projektionsrichtlinie beschreiben

Eine der folgenden Berechtigungen:

  • Eine Rolle mit der globalen Berechtigung APPLY PROJECTION POLICY oder

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

  • Rolle mit APPLY-Berechtigung für die Projektionsrichtlinie

Projektionsrichtlinie löschen

Rolle mit OWNERSHIP-Berechtigung für die Projektionsrichtlinie

Projektionsrichtlinien anzeigen

Eine der folgenden Berechtigungen:

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

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

Festlegen oder Aufheben einer Projektionsrichtlinie für eine Spalte

Eine der folgenden Berechtigungen:

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

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

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

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

    USE ROLE securityadmin;
    GRANT USAGE ON DATABASE mydb TO ROLE projection_policy_admin;
    GRANT USAGE ON SCHEMA mydb.schema TO ROLE projection_policy_admin;
    
    GRANT CREATE PROJECTION POLICY ON SCHEMA mydb.schema TO ROLE projection_policy_admin;
    GRANT APPLY ON PROJECTION POLICY ON ACCOUNT TO ROLE projection_policy_admin;
    
    Copy
  2. In einem hybriden Verwaltungsansatz verfügt eine einzelne Rolle über die CREATE PROJECTION POLICY-Berechtigung, um die konsistente Benennung der Projektionsrichtlinien sicherzustellen, und einzelne Teams oder Rollen verfügen über die APPLY-Berechtigung für eine bestimmte Projektionsrichtlinie.

    So kann beispielsweise der kundenspezifischen Rolle finance_role die Berechtigung erteilt werden, die Projektionsrichtlinie 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 PROJECTION POLICY ON SCHEMA mydb.schema TO ROLE projection_policy_admin;
    GRANT APPLY ON PROJECTION POLICY cost_center TO ROLE finance_role;
    
    Copy