Verknüpfungsrichtlinien

Eine Verknüpfungsrichtlinie ist ein Objekt auf Schemaebene, das die Anforderung steuert, eine Tabelle zu verknüpfen, wenn sie abgefragt wird. Wenn eine Verknüpfungsrichtlinie auf eine Tabelle angewendet wird, erfordern Abfragen aus dieser Tabelle entweder eine Verknüpfung oder nicht. Wenn Verknüpfungen erforderlich sind, können sie auf bestimmte Verknüpfungsspalten beschränkt werden.

Sie können diese Art von Richtlinie verwenden, um Verknüpfungen für Abfragen auf bestimmte Tabellen und Ansichten zu erzwingen, um gemeinsame Informationen in freigegebenen Tabellen zu finden. Eine Tabelle oder Ansicht, der eine Verknüpfungsrichtlinie zugewiesen wurde, wird als geschützt oder Tabelle mit Verknüpfungsbeschränkung bezeichnet.

Überblick

Ein wesentliches Feature von Snowflake ist die Möglichkeit, Datensets für andere Entitäten freizugeben. Mit Verknüpfungsrichtlinien kann ein Anbieter (Dateneigentümer) die Kontrolle darüber ausüben, was mit seinen Daten gemacht werden kann, auch nachdem sie für einen Verbraucher freigegeben wurden. Insbesondere kann der Anbieter von einem Verbraucher einer Tabelle verlangen, die Daten mit einer anderen Tabelle zu verknüpfen, anstatt Datensätze aus einer einzelnen Tabelle abzurufen. Diese Anforderung erleichtert die Datenfreigabe zwischen halbwegs vertrauenswürdigen Partnern, die über gemeinsame Datensätze verfügen. Die Auswahl von Daten aus einer einzigen Tabelle ist im Allgemeinen nicht sinnvoll. Aussagekräftige Daten sind verfügbar, wenn die Tabelle eines Eigentümers mit einer ähnlichen Tabelle eines Verbrauchers oder Partners verknüpft wird.

Nachdem die Verknüpfungsrichtlinie auf eine Tabelle oder Ansicht angewendet wurde, muss eine Abfrage erfolgen:

  • Verbinden Sie die Tabelle oder Ansicht mit einer anderen Tabelle oder Ansicht.

  • Geben Sie eine unterstützten Verknüpfungsart an.

  • Geben Sie eine Verknüpfungsbedingung mit zulässigen Verknüpfungsspalten an.

Mindestens eine Tabelle oder Ansicht, die an der Verknüpfung beteiligt ist, muss ungeschützt sein. Diese Einschränkung verhindert, dass Angreifer die Verknüpfungsrichtlinie umgehen, indem sie zwei geschützte Tabellen miteinander verknüpfen, die von derselben Organisation genutzt werden und übereinstimmende Schlüsselwerte haben.

Während Verknüpfungsrichtlinien den Zugriff auf verknüpfte Tabellen kontrollieren, garantieren sie nicht, dass ein böswilliger Akteur nicht sorgfältig konstruierte Abfragen verwenden könnte, um sensible Daten aus einer Tabelle mit Verknüpfungsbeschränkung zu erhalten. Mit genügend Abfrageversuchen könnte ein böswilliger Akteur möglicherweise die Verknüpfungsanforderungen umgehen. Verknüpfungsrichtlinien 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).

Erstellen und Umsetzen von Verknüpfungsrichtlinien

So erstellen und implementieren Sie eine Verknüpfungsrichtlinie:

  1. Erstellen Sie die Richtlinie selbst.

  2. Wenden Sie die Richtlinie auf eine neue oder bestehende Tabelle oder Ansicht an.

  3. Führen Sie einige Abfragen durch, um die erwartete Verhaltensweise der Richtlinie zu überprüfen.

Diese Schritte werden in den folgenden Abschnitten erläutert.

Vielleicht möchten Sie auch eine bestehende Richtlinie ändern und überprüfen, ob sich die erwartete Verhaltensweise ändert.

Sie können die Verknüpfungsrichtlinien in Ihrem Konto jederzeit mit den Befehlen SHOW JOIN POLICIES und DESCRIBE JOIN POLICY einsehen. Um die tatsächliche Definition einer Richtlinie zu sehen, fragen Sie die Ansicht JOIN_POLICIES ab. Um zu sehen, welche Tabellen und Ansichten mit Richtlinien verknüpft sind, fragen Sie die POLICY_REFERENCES Tabellenfunktion „Information Schema“ ab.

Informationen zur Verwaltung von Richtlinien, einschließlich der Einrichtung einer benutzerdefinierten Rolle für die Richtlinienverwaltung, finden Sie unter Verwalten von Verknüpfungsrichtlinien.

Erstellen einer Verknüpfungsrichtlinie

Die einfachste Form der Verknüpfungsrichtlinie verlangt von den Benutzern, dass sie eine Tabelle oder Ansicht immer mit einer anderen Tabelle oder Ansicht verknüpfen. Mit anderen Worten: Abfragen gegen eine einzelne Tabelle ohne eine Verknüpfungspezifikation sind nicht zulässig. Erstellen Sie zum Beispiel eine Richtlinie namens jp1:

CREATE JOIN POLICY jp1
  AS () RETURNS JOIN_CONSTRAINT -> JOIN_CONSTRAINT(JOIN_REQUIRED => TRUE);
Copy

Die vollständige Syntax dieses Befehls und seine JOIN_CONSTRAINT-Funktion finden Sie unter CREATE JOIN POLICY.

Anwenden einer Verknüpfungsrichtlinie auf eine Tabelle oder eine Ansicht

Nachdem Sie eine Verknüpfungsrichtlinie erstellt haben, implementieren Sie sie, indem Sie sie einer bestimmten Tabelle oder Ansicht zuweisen:

  • Verwenden Sie einen ALTER TABLE oder ALTER VIEW Befehl, wenn die Tabelle oder Ansicht bereits existiert.

  • Verwenden Sie einen CREATE TABLE oder CREATE VIEW Befehl für eine neue Tabelle oder Ansicht.

In beiden Fällen geben Sie den Parameter JOIN POLICY an, um die Verknüpfungsrichtlinie selbst zu identifizieren. Der folgende Befehl weist zum Beispiel der Tabelle join_table die Richtlinie jp zu:

CREATE OR REPLACE TABLE join_table (
  col1 INT,
  col2 VARCHAR,
  col3 NUMBER )
  JOIN POLICY jp1;
Copy

Optional können Sie auch den Parameter ALLOWED JOIN KEYS angeben, wenn Sie Verknüpfungen auf die Verwendung bestimmter verknüpfter Spalten beschränken möchten. Siehe Einschränkung von Verknüpfungen auf bestimmte Spalten.

Einer Tabelle oder Ansicht kann immer nur eine Verknüpfungsrichtlinie zugewiesen werden. Siehe Ersetzen einer Verknüpfungsrichtlinie.

Testen der Verknüpfungsrichtlinie durch Ausführen einiger Abfragen

Die folgenden Abfragen demonstrieren die erwartete Verhaltensweise, wenn die Richtlinie jp1 für die Tabelle join_table in Kraft ist. Diese Tabelle muss nicht geladen werden; eine leere Tabelle reicht aus, um die erwartete Verhaltensweise zu demonstrieren.

Eine Abfrage ohne eine Verknüpfung gibt einen erwarteten Fehler zurück:

SELECT * FROM join_table;
Copy
506037 (23001): SQL compilation error: Join Policy violation, please contact the policy admin for details

Eine Abfrage mit einer expliziten inneren Verknüpfung in col1 liefert Ergebnisse:

SELECT * FROM join_table jt1 INNER JOIN join_table_2 jt2 ON jt1.col1=jt2.col1;
Copy
+------+------+------+------+------+------+
| COL1 | COL2 | COL3 | COL1 | COL2 | COL3 |
|------+------+------+------+------+------|
+------+------+------+------+------+------+

Eine Abfrage mit einer expliziten inneren Verknüpfung in col2 liefert ebenfalls Ergebnisse:

SELECT * FROM join_table jt1 INNER JOIN join_table_2 jt2 ON jt1.col2=jt2.col2;
Copy
+------+------+------+------+------+------+
| COL1 | COL2 | COL3 | COL1 | COL2 | COL3 |
|------+------+------+------+------+------|
+------+------+------+------+------+------+

Einschränkung von Verknüpfungen auf bestimmte Spalten

Um die Verhaltensweise der Verknüpfungsrichtlinie weiter zu testen, lösen Sie die Richtlinie von der Tabelle, löschen Sie die Verknüpfungsrichtlinie, und erstellen Sie sie neu. Erstellen Sie dann join_table mit DDL, das den Parameter ALLOWED JOIN KEYS enthält.

ALTER TABLE join_table UNSET JOIN POLICY;

DROP JOIN POLICY jp1;

CREATE JOIN POLICY jp1
  AS () RETURNS JOIN_CONSTRAINT -> JOIN_CONSTRAINT(JOIN_REQUIRED => TRUE);

CREATE OR REPLACE TABLE join_table (
  col1 INT,
  col2 VARCHAR,
  col3 NUMBER )
  JOIN POLICY jp1 ALLOWED JOIN KEYS (col1);
Copy

Versuchen Sie nun eine der vorherigen Abfragen erneut, mit col2 als verknüpfte Spalte. Die Abfrage schlägt fehl, weil col2 kein zulässiger Verknüpfungsschlüssel ist.

SELECT * FROM join_table jt1 INNER JOIN join_table_2 jt2 ON jt1.col2=jt2.col2;
Copy
506038 (23001): SQL compilation error: Join Policy violation, invalid join condition with reason: Disallowed join key used.

Die gleiche Abfrage mit jt1.col1=jt2.col1 als Verknüpfungsbedingung wäre erfolgreich. Eine natürliche Verknüpfung dieser beiden Tabellen würde fehlschlagen, da sie versuchen würde, über col1 und col2 zu verknüpfen.

Anzeigen und Beschreiben von Verknüpfungsrichtlinien

Sie können die Befehle SHOW JOIN POLICIES und DESCRIBE JOIN POLICY verwenden, um grundlegende Informationen über die in Ihrem Konto vorhandenen Verknüpfungsrichtlinien zu erhalten. Ausführlichere Informationen über Verknüpfungsrichtlinien finden Sie unter Überwachen der Verknüpfungsrichtlinie.

SHOW JOIN POLICIES;
Copy
+-------------------------------+------+---------------+----------------+-------------+--------------+---------+-----------------+---------+
| created_on                    | name | database_name | schema_name    | kind        | owner        | comment | owner_role_type | options |
|-------------------------------+------+---------------+----------------+-------------+--------------+---------+-----------------+---------|
| 2024-12-04 15:15:49.591 -0800 | JP1  | POLICY1_DB    | POLICY1_SCHEMA | JOIN_POLICY | POLICY1_ROLE |         | ROLE            |         |
+-------------------------------+------+---------------+----------------+-------------+--------------+---------+-----------------+---------+
DESCRIBE JOIN POLICY jp1;
Copy
+------+-----------+-----------------+----------------------------------------+
| name | signature | return_type     | body                                   |
|------+-----------+-----------------+----------------------------------------|
| JP1  | ()        | JOIN_CONSTRAINT | JOIN_CONSTRAINT(JOIN_REQUIRED => TRUE) |
+------+-----------+-----------------+----------------------------------------+

Erstellen und Anwenden von bedingten Verknüpfungsrichtlinien

Richtlinienadministratoren können den SQL-Ausdruck einer Verknüpfungsrichtlinie 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änkung abzufragen, während andere Benutzer gezwungen sind, Verknüpfungen zu verwenden.

Die folgende Verknüpfungsrichtlinie gibt beispielsweise Benutzern mit den Rollen ACCOUNTADMIN, FINANCE_ROLE oder HR_ROLE uneingeschränkten Zugriff auf eine Tabelle, während alle anderen Benutzer eine Verknüpfung angeben müssen.

CREATE JOIN POLICY my_join_policy
  AS () RETURNS JOIN_CONSTRAINT ->
    CASE
      WHEN CURRENT_ROLE() = 'ACCOUNTADMIN'
          OR CURRENT_ROLE() = 'FINANCE_ROLE'
          OR CURRENT_ROLE() = 'HR_ROLE'
        THEN JOIN_CONSTRAINT(JOIN_REQUIRED => FALSE)
      ELSE JOIN_CONSTRAINT(JOIN_REQUIRED => TRUE)
    END;
Copy

Tipp

Sie können die folgenden Strategien anwenden, wenn Sie Kontextfunktionen wie CURRENT_ROLE in einer bedingten Richtlinie verwenden:

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

Anforderungen für Verknüpfungsabfragen

Abfragen gegen eine Tabelle oder Ansicht mit Verknüpfungsbeschränkung müssen den folgenden Anforderungen entsprechen, damit eine Verknüpfungsrichtlinie wirksam wird:

Unterstützte Arten von Verknüpfungen

Die folgenden expliziten Verknüpfungsarten werden für Tabellen mit Verknüpfungsbeschränkung unterstützt:

  • INNER JOIN (mit dem optionalen INNER Schlüsselwort; JOIN ist erforderlich)

  • LEFT OUTER JOIN und RIGHT OUTER JOIN, wobei die Tabelle mit der Verknüpfungsbeschränkung die „gegenüberliegende“ Tabelle ist. Wenn die Tabelle mit der Verknüpfungsbeschränkung die erste oder „linke“ Tabelle ist, muss die äußere Verknüpfung eine RIGHT OUTER JOIN sein. Wenn die Tabelle mit der Verknüpfungsbeschränkung die zweite oder „rechte“ Tabelle ist, muss die äußere Verknüpfung eine LEFT OUTER JOIN sein.

  • NATURAL JOIN (Innere Verknüpfung über Spalten mit gemeinsamen Namen)

Innere und äußere Verknüpfungen müssen explizit in der FROM-Klausel angegeben werden, mit den Verknüpfungsbedingungen ON oder USING. Diese Verknüpfungen können nicht in der WHERE-Klausel angegeben werden.

Nicht unterstützte Verknüpfungsarten

Die folgenden Verknüpfungsarten werden nicht unterstützt:

  • FULL OUTER JOIN

  • ASOF JOIN

  • LATERAL JOINS

  • Implizite Verknüpfungen in der WHERE-Klausel

  • Überkreuz-Verknüpfungen (Cross-Joins, kartesisches Produkt)

Verknüpfungen mit mehreren Tabellen mit Verknüpfungsbeschränkung

Wenn beiden (oder allen) Tabellen in einer Verknüpfungsabfrage eine Verknüpfungsrichtlinie zugewiesen wurde, schlägt die Abfrage mit einem Fehler fehl. Bei einer Verknüpfung von zwei Tabellen kann nur eine Tabelle eine Verknüpfungsbeschränkung haben.

UNION, INTERSECT und EXCEPT

  • Die Mengenoperationen UNION und UNION ALL werden in Abfragen gegen Tabellen mit Verknüpfungsbeschränkung nicht unterstützt.

  • INTERSECT-Mengenoperationen werden unterstützt, da sie semantisch äquivalent zu inneren Verknüpfungen sind.

  • Die Mengenoperationen MINUS und EXCEPT werden nur unterstützt, wenn sich die Tabelle mit Verknüpfungsbeschränkung auf der gefilterten Seite des Operators befindet (d. h. im zweiten Abfrageblock).

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:

Erwartete Fehler bei Abfragen gegen Tabellen mit Verknüpfungsbeschränkung

Die folgenden Beispiele zeigen einige der Fälle, in denen Abfragen voraussichtlich fehlschlagen, weil eine Verknüpfungsrichtlinie auf eine Tabelle oder Ansicht angewendet wird. Für Hintergrundinformationen siehe Anforderungen für Verknüpfungsabfragen. Die Tabellen in diesen Abfragen enthalten keine Zeilen, daher geben die Abfragen entweder ein leeres Ergebnis (Erfolg) oder einen Fehler (Misserfolg) zurück.

Abfragen ohne Verknüpfungen schlagen fehl

Wenn join_table eine Verknüpfungsrichtlinie zugewiesen wird, schlagen einfache Abfragen ohne Verknüpfungen fehl. Die folgende Abfrage gibt einen Fehler zurück.

SELECT col1, col2 FROM join_table;
Copy

WHERE-Klausel-Verknüpfungen sind verboten

Wenn join_table (alias jt1) eine Tabelle mit Verknüpfungsbeschränkung ist, gibt die folgende WHERE-Klausel-Verknüpfung einen Fehler zurück:

SELECT *
  FROM join_table jt1, join_table_2 jt2
  WHERE jt1.col1=jt2.col1;
Copy

Linke und rechte äußere Verknüpfungen hängen von der Reihenfolge der Tabellen ab

Die folgenden Beispiele zeigen die erwartete Verhaltensweise bei äußeren Verknüpfungen, wobei join_table (alias jt1) die Tabelle mit der Verknüpfungsbeschränkung ist. Die erste Abfrage liefert einen Fehler.

SELECT * FROM join_table jt1
  LEFT OUTER JOIN join_table_2 jt2 ON jt1.col1=jt2.col1;
Copy

Die zweite Abfrage liefert Ergebnisse.

SELECT * FROM join_table jt1
  RIGHT OUTER JOIN join_table_2 jt2 ON jt1.col1=jt2.col1;
Copy

Das Verknüpfen von zwei Tabellen mit Verknüpfungsbeschränkung wird nicht unterstützt

Wenn sowohl join_table als auch join_table_2 eine Verknüpfungsrichtlinie zugewiesen wurde, gibt die folgende Abfrage einen Fehler zurück:

SELECT * FROM join_table jt1 JOIN join_table_2 jt2 ON jt1.col1=jt2.col1;
Copy

UNION-Mengenoperationen sind nicht erlaubt, aber INTERSECT-Operationen sind erlaubt

In diesen Beispielen hat join_table eine Verknüpfungsrichtlinie, join_table_3 jedoch nicht. Die UNION-Abfrage schlägt fehl, aber eine ähnliche INTERSECT-Abfrage ist erfolgreich.

SELECT * FROM JOIN_TABLE
UNION
SELECT * FROM JOIN_TABLE_3;
Copy
SELECT * FROM JOIN_TABLE
INTERSECT
SELECT * FROM JOIN_TABLE_3;
Copy

EXCEPT-Verhaltensweise hängt von der Reihenfolge der Abfrageblöcke ab

Die EXCEPT-Verhaltensweise hängt von der Reihenfolge der Abfrageblöcke ab. Beachten Sie, dass die erste Abfrage zuerst aus der Tabelle mit der Verknüpfungsbeschränkung auswählt und einen Fehler zurückgibt.

SELECT * FROM JOIN_TABLE
EXCEPT
SELECT * FROM JOIN_TABLE_3;
Copy

Die zweite Abfrage ist erfolgreich.

SELECT * FROM JOIN_TABLE_3
EXCEPT
SELECT * FROM JOIN_TABLE;
Copy

Die Ansicht einer Tabelle mit Verknüpfungsbeschränkung ist ebenfalls geschützt

Nehmen wir an, dass join_table die Verknüpfungsrichtlinie jp1 zugewiesen wurde. Erstellen Sie eine Ansicht der Tabelle:

CREATE VIEW join_table_view AS
  SELECT * FROM join_table;
Copy

Jetzt fragen Sie die Ansicht ab, ohne eine Verknüpfung anzugeben:

SELECT * FROM join_table_view;
Copy

Die Abfrage schlägt fehl, weil sie gegen die Richtlinie für join_table verstößt. Die Abfrage der Ansicht muss eine Verknüpfung enthalten. Weitere Informationen zur Verhaltensweise von Verknüpfungsrichtlinien mit Ansichten finden Sie unter Ansichten und materialisierte Ansichten.

Verwalten von Verknüpfungsrichtlinien

Sie können Verknüpfungsrichtlinien ändern, ersetzen, ablösen, beschreiben und überwachen. Die folgenden Abschnitte behandeln diese Managementaufgaben.

Ändern einer Verknüpfungsrichtlinie

Sie können den Befehl ALTER JOIN POLICY verwenden, um die Regeln für Verknüpfungsrichtlinien zu ändern. Sie können eine Richtlinie auch umbenennen oder ihren Kommentar ändern.

Bevor Sie eine Verknüpfungsrichtlinie ändern, führen Sie den Befehl DESCRIBE JOIN POLICY oder die Funktion GET_DDL aus, um den aktuellen SQL-Ausdruck der Richtlinie zu überprüfen.

Führen Sie zum Beispiel den folgenden Befehl aus, um den SQL-Ausdruck der Verknüpfungsrichtlinie jp3 zu aktualisieren, sodass keine Verknüpfungen erforderlich sind:

ALTER JOIN POLICY jp3 SET BODY -> JOIN_CONSTRAINT(JOIN_REQUIRED => FALSE);
Copy

Ersetzen einer Verknüpfungsrichtlinie

Die empfohlene Methode zum Ersetzen einer Verknüpfungsrichtlinie ist die Verwendung des Parameters FORCE in einer ALTER TABLE-Anweisung, die die bestehende Richtlinie ablöst und eine neue in einem einzigen Befehl zuweist. Dieser Ansatz ermöglicht es Ihnen, die alte Richtlinie atomar zu ersetzen, ohne dass eine Schutzlücke entsteht.

Zum Beispiel, um eine neue Verknüpfungsrichtlinie einer Tabelle zuzuweisen, die bereits einer Verknüpfungsbeschränkung unterliegt:

ALTER TABLE join_table SET JOIN POLICY jp2 FORCE;
Copy

Sie können die Richtlinie auch in einer Anweisung von einer Tabelle oder Ansicht lösen (mit UNSET JOIN POLICY) und dann in einer anderen Anweisung eine neue Richtlinie festlegen (mit SET JOIN POLICY). Wenn Sie diese Methode wählen, ist die Tabelle in der Zeit zwischen den beiden Operationen nicht durch eine Verknüpfungsrichtlinie geschützt. Wird in dieser Zeit eine Abfrage ausgeführt, könnte sie möglicherweise auf sensible Daten zugreifen.

Lösen einer Verknüpfungsrichtlinie

Verwenden Sie die Klausel UNSET JOIN POLICY eines ALTER TABLE- oder ALTER VIEW-Befehls, um eine Verknüpfungsrichtlinie von einer Tabelle oder Ansicht zu lösen. Der Name der Richtlinie ist nicht erforderlich, da ein Objekt nicht mehr als eine Richtlinie haben kann. Beispiel:

ALTER VIEW join_view UNSET JOIN POLICY;
Copy

Überwachen der Verknüpfungsrichtlinie

Sie können die Verwendung der Verknüpfungsrichtlinie auf folgende Weise überwachen:

  • Fragen Sie die Ansicht JOIN_POLICIES im Schema „Account Usage“ der freigegebenen SNOWFLAKE-Datenbank ab. Diese Ansicht ist ein Katalog für alle Verknüpfungsrichtlinien in Ihrem Snowflake Konto.

  • Abfrage der POLICY_REFERENCES Tabellenfunktion „Information Schema“, um Verweise auf Verknüpfungsrichtlinie zu identifizieren und herauszufinden, auf welche Tabellen und Ansichten derzeit Richtlinien angewendet werden.

Informationen über Verknüpfungsrichtlinien erhalten

Um Informationen über bestehende Verknüpfungsrichtlinien zu erhalten, fragen Sie die Ansicht JOIN_POLICIES im Schema „Account Usage“ der gemeinsamen SNOWFLAKE-Datenbank ab. Diese Ansicht ist ein Katalog für alle Verknüpfungsrichtlinien in Ihrem Snowflake Konto. Sie können zum Beispiel den Richtlinientext (Body) für eine bestimmte Verknüpfungsrichtlinie zurückgeben:

SELECT policy_name, policy_body, created
  FROM SNOWFLAKE.ACCOUNT_USAGE.JOIN_POLICIES
  WHERE policy_name='JP2' AND created LIKE '2024-11-26%';
Copy
+-------------+----------------------------------------------------------+-------------------------------+
| POLICY_NAME | POLICY_BODY                                              | CREATED                       |
|-------------+----------------------------------------------------------+-------------------------------|
| JP2         | CASE                                                     | 2024-11-26 11:22:54.848 -0800 |
|             |           WHEN CURRENT_ROLE() = 'ACCOUNTADMIN'           |                               |
|             |             THEN JOIN_CONSTRAINT(JOIN_REQUIRED => FALSE) |                               |
|             |           ELSE JOIN_CONSTRAINT(JOIN_REQUIRED => TRUE)    |                               |
|             |         END                                              |                               |
+-------------+----------------------------------------------------------+-------------------------------+

Abrufen von Informationen über Tabellen und Ansichten, die mit Verknüpfungsrichtlinien verbunden sind

Die POLICY_REFERENCES Tabellenfunktion „Information Schema“ gibt Informationen über Tabellen und Ansichten zurück, die mit bestehenden Verknüpfungsrichtlinien verbunden sind. Sie können zwei verschiedene Syntaxoptionen verwenden:

  • Gibt eine Zeile für jedes Objekt (Ansicht) zurück, für das die angegebene Verknüpfungsrichtlinie 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.jp1'));
    
    Copy
  • Geben Sie Informationen über die Richtlinie zurück, die join_table zugewiesen 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.join_table', ref_entity_domain => 'table'));
    
    Copy
    +-------------+-------------+-----------------+-------------------+-----------------+----------------------+---------------+
    | POLICY_NAME | POLICY_KIND | REF_ENTITY_NAME | REF_ENTITY_DOMAIN | REF_COLUMN_NAME | REF_ARG_COLUMN_NAMES | POLICY_STATUS |
    |-------------+-------------+-----------------+-------------------+-----------------+----------------------+---------------|
    | JP1         | JOIN_POLICY | JOIN_TABLE      | TABLE             | NULL            | [ "COL1" ]           | ACTIVE        |
    +-------------+-------------+-----------------+-------------------+-----------------+----------------------+---------------+
    

Bewährte Verfahren für die Richtlinienverwaltung

Das Erstellen einer Verknüpfungsrichtlinie und das Zuweisen der Richtlinie zu einer Tabelle erfordert dieselbe allgemeine Prozedur wie das Erstellen und Zuweisen anderer Richtlinien, z. B. Maskierungs-, Projektions- und Aggregationsrichtlinien:

  1. Wenn Sie einen zentralisierten Managementansatz verwenden, erstellen Sie eine kundenspezifische Rolle (z. B. join_policy_admin) zur Verwaltung der Richtlinie. Alternativ können Sie auch eine externe Rolle verwenden.

  2. Gewähren Sie dieser Rolle die Berechtigungen zum Erstellen und Zuweisen einer Verknüpfungsrichtlinie.

  3. Erstellen Sie die Verknüpfungsrichtlinie.

  4. Erstellen oder ändern Sie eine Tabelle, um die Richtlinie der Tabelle zuzuweisen und um das Verbinden von Spalten zu ermöglichen (ALLOWED JOIN KEYS).

  5. Testen Sie einige Join- und Non-Join-Abfragen auf die Tabelle.

Erfolgreiche Abfragen gegen die Tabelle müssen ihre Daten mit einer anderen Tabelle oder Ansicht verknüpfen und sich auf die erlaubten Spalten beziehen.

Aufgaben des Administrators bei der Zugriffssteuerung
  1. Erstellen Sie eine kundenspezifische Rolle zur Verwaltung der Beitrittsrichtlinie. Sie können auch eine bestehende Rolle wiederverwenden.

    USE ROLE USERADMIN;
    
    CREATE ROLE join_policy_admin;
    
    Copy
  2. Erteilen Sie der kundenspezifischen Rolle join_policy_admin die Berechtigung, eine Verknüpfungsrichtlinie in einem Schema zu erstellen und die Richtlinie einer Tabelle oder Ansicht im Snowflake-Konto zuzuweisen.

    Bei diesem Schritt wird davon ausgegangen, dass die Verknüpfungsrichtlinie in einer Datenbank und einem Schema mit dem Namen privacy.join_policies gespeichert wird und dass diese Datenbank und dieses Schema bereits existieren:

    GRANT USAGE ON DATABASE privacy TO ROLE join_policy_admin;
    GRANT USAGE ON SCHEMA privacy.join_policies TO ROLE join_policy_admin;
    
    GRANT CREATE JOIN POLICY
      ON SCHEMA privacy.join_policies TO ROLE join_policy_admin;
    
    GRANT APPLY JOIN POLICY ON ACCOUNT TO ROLE join_policy_admin;
    
    Copy

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

    Informationen zu den Berechtigungen, die Sie für die Arbeit mit Verknüpfungsrichtlinien benötigen, finden Sie unter Verwalten von Verknüpfungsrichtlinien (in diesem Thema).

Aufgaben des Administrators einer Verknüpfungsrichtlinie
  • Erstellen Sie eine Verknüpfungsrichtlinie:

    USE ROLE join_policy_admin;
    USE SCHEMA privacy.join_policies;
    
    CREATE OR REPLACE JOIN POLICY jp1
      AS () RETURNS JOIN_CONSTRAINT -> JOIN_CONSTRAINT(JOIN_REQUIRED => TRUE);
    
    Copy

Interaktion von Verknüpfungsrichtlinien mit anderen Snowflake-Features

Die folgenden Abschnitte fassen zusammen, wie Verknüpfungsrichtlinien mit anderen Snowflake-Features und -Diensten interagieren.

Andere Richtlinien

In diesem Abschnitt wird beschrieben, wie eine Verknüpfungsrichtlinie mit anderen Richtlinien interagiert, darunter Maskierungsrichtlinien, Richtlinien für den Zeilenzugriff, Aggregationsrichtlinien und Projektionsrichtlinien.

Sie können einer Tabelle mit Verknüpfungsbeschränkung andere Richtlinien zuordnen. Damit eine Abfrage der Tabelle erfolgreich ist, müssen die Anforderungen aller Richtlinien erfüllt werden.

Wenn einer Tabelle mit Verknüpfungsbeschränkung eine Richtlinie für den Zeilenzugriff zugewiesen ist, wird eine Zeile, die aufgrund der Richtlinie für den Zeilenzugriff aus den Abfrageergebnissen ausgeschlossen wurde, bei der Berechnung der Ergebnisse der Verknüpfung nicht berücksichtigt.

Der Body einer Maskierungsrichtlinie, einer Richtlinie für den Zeilenzugriff, einer Aggregationsrichtlinie oder einer Projektionsrichtlinie kann nicht auf eine Tabelle mit Verknüpfungsbeschränkung verweisen, einschließlich ihrer Spalten.

Ansichten und materialisierte Ansichten

Sie können sowohl Ansichten als auch materialisierten Ansichten eine Verknüpfungsrichtlinie zuweisen. Wenn eine Verknüpfungsrichtlinie auf eine Ansicht angewandt wird, unterliegt die zugrunde liegende Tabelle keiner Verknüpfungsbeschränkung. Diese Basistabelle kann weiterhin ohne Einschränkung abgefragt werden.

Ob Sie eine Ansicht aus einer Tabelle mit Verknüpfungsbeschränkung erstellen können, hängt von der Art der Ansicht ab:

  • Sie können eine reguläre Ansicht aus einer oder mehreren Tabellen mit Verknüpfungsbeschränkung erstellen. Abfragen gegen diese Ansicht müssen jedoch Daten so verknüpfen, dass die Einschränkungen dieser Basistabellen eingehalten werden. Sie können eine Verknüpfungsrichtlinie für eine geschützte Tabelle nicht umgehen, indem Sie eine Ansicht auf die Tabelle erstellen. Die Richtlinie für die Tabelle wird bei Abfragen gegen die Ansicht beachtet und durchgesetzt. Ein Beispiel dazu finden Sie unter Die Ansicht einer Tabelle mit Verknüpfungsbeschränkung ist ebenfalls geschützt.

  • Sie können weder eine materialisierte Ansicht erstellen, die auf einer Tabelle oder Ansicht mit Verknüpfungsbeschränkung basiert, noch können Sie einer Tabelle oder Ansicht, auf der eine materialisierte Ansicht basiert, eine Verknüpfungsrichtlinie 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 Verknüpfungsrichtlinien-Objekts wird nicht unterstützt.

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

  • Das Klonen eines Schemas führt dazu, dass alle Verknüpfungsrichtlinien innerhalb des Schemas geklont werden.

  • Eine geklonte Tabelle ordnet sich denselben Verknüpfungsrichtlinien zu wie die Quelltabelle.

    • Wenn eine Tabelle im Kontext des zu klonenden übergeordneten Schemas geklont wird und die Quelltabelle einen Verweis auf eine Verknüpfungsrichtlinie im selben übergeordneten Schema hat (d. h. einen lokalen Verweis), hat die geklonte Tabelle einen Verweis auf die geklonte Verknüpfungsrichtlinie.

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

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

Replikation

Verknüpfungsrichtlinien und ihre 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 Tabelle oder Ansicht in der primären Datenbank hat einen Verweis auf eine Richtlinie 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 zur Verwaltung von Verknüpfungsrichtlinien.

Berechtigungen für Verknüpfungsrichtlinien

Snowflake unterstützt die folgenden Berechtigungen für das Verknüpfungsrichtlinien-Objekt.

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

Aktiviert die Set- und Unset-Operationen für eine Verknüpfungsrichtlinie für eine Tabelle.

OWNERSHIP

Überträgt die Eigentümerschaft an der Verknüpfungsrichtlinie, wodurch Sie die volle Kontrolle über die Richtlinie erhalten. Erforderlich, um die meisten Eigenschaften einer Verknüpfungsrichtlinie zu ändern.

Weitere Informationen dazu finden Sie unter Übersicht der DDL-Befehle, Operationen und Berechtigungen.

DDL-Referenz für Verknüpfungsrichtlinien

Snowflake unterstützt die folgenden DDL-Befehle, um Verknüpfungsrichtlinien zu erstellen und zu verwalten.

Übersicht der DDL-Befehle, Operationen und Berechtigungen

Die folgende Tabelle fasst die Beziehung zwischen den Berechtigungen der Verknüpfungsrichtlinie und den von 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

Erstellen einer Verknüpfungsrichtlinie

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

Ändern einer Verknüpfungsrichtlinie.

Die Rolle mit der Berechtigung OWNERSHIP für die Verknüpfungsrichtlinie.

Beschreiben einer Verknüpfungsrichtlinie

Eine der folgenden Berechtigungen:

  • Eine Rolle mit der globalen APPLY JOIN POLICY-Berechtigung.

  • Eine Rolle mit der Berechtigung OWNERSHIP für die Verknüpfungsrichtlinie.

  • Eine Rolle mit der Berechtigung APPLY für die Verknüpfungsrichtlinie.

Löschen einer Verknüpfungsrichtlinie.

Eine Rolle mit der Berechtigung OWNERSHIP für die Verknüpfungsrichtlinie.

Anzeigen einer Verknüpfungsrichtlinie.

Eine der folgenden Berechtigungen:

  • Eine Rolle mit der Berechtigung USAGE für das Schema, in dem die Verknüpfungsrichtlinie existiert.

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

Festlegen oder Aufheben einer Verknüpfungsrichtlinie für eine Tabelle.

Eine der folgenden Berechtigungen:

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

  • Eine Rolle mit der Berechtigung APPLY für die Verknüpfungsrichtlinie und der Berechtigung OWNERSHIP für die Tabelle oder die Ansicht.

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

  1. Für ein zentralisiertes Richtlinienmanagement, bei dem die kundenspezifische Rolle join_policy_admin Verknüpfungsrichtlinie für alle Tabellen erstellt und festlegt, sind die folgenden Berechtigungen erforderlich:

    USE ROLE securityadmin;
    GRANT USAGE ON DATABASE mydb TO ROLE join_policy_admin;
    GRANT USAGE ON SCHEMA mydb.schema TO ROLE join_policy_admin;
    GRANT CREATE JOIN POLICY ON SCHEMA mydb.schema TO ROLE join_policy_admin;
    GRANT APPLY ON JOIN POLICY ON ACCOUNT TO ROLE join_policy_admin;
    
    Copy
  2. In einem hybriden Managementansatz verfügt eine einzelne Rolle über die Berechtigung CREATE JOIN POLICY, um sicherzustellen, dass Verknüpfungsrichtlinien einheitlich benannt werden, und einzelne Teams oder Rollen haben die Berechtigung APPLY für eine bestimmte Verknüpfungsrichtlinie.

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

    USE ROLE securityadmin;
    GRANT CREATE JOIN POLICY ON SCHEMA mydb.schema TO ROLE join_policy_admin;
    GRANT APPLY ON JOIN POLICY cost_center TO ROLE finance_role;
    
    Copy