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:
Erstellen Sie die Richtlinie selbst.
Wenden Sie die Richtlinie auf eine neue oder bestehende Tabelle oder Ansicht an.
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);
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;
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;
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;
+------+------+------+------+------+------+
| 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;
+------+------+------+------+------+------+
| 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);
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;
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;
+-------------------------------+------+---------------+----------------+-------------+--------------+---------+-----------------+---------+
| 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;
+------+-----------+-----------------+----------------------------------------+
| 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;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.
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;
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;
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;
Die zweite Abfrage liefert Ergebnisse.
SELECT * FROM join_table jt1
RIGHT OUTER JOIN join_table_2 jt2 ON jt1.col1=jt2.col1;
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;
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;
SELECT * FROM JOIN_TABLE
INTERSECT
SELECT * FROM JOIN_TABLE_3;
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;
Die zweite Abfrage ist erfolgreich.
SELECT * FROM JOIN_TABLE_3
EXCEPT
SELECT * FROM JOIN_TABLE;
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;
Jetzt fragen Sie die Ansicht ab, ohne eine Verknüpfung anzugeben:
SELECT * FROM join_table_view;
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);
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;
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;
Ü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%';
+-------------+----------------------------------------------------------+-------------------------------+
| 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'));
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'));
+-------------+-------------+-----------------+-------------------+-----------------+----------------------+---------------+ | 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:
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.Gewähren Sie dieser Rolle die Berechtigungen zum Erstellen und Zuweisen einer Verknüpfungsrichtlinie.
Erstellen Sie die Verknüpfungsrichtlinie.
Erstellen oder ändern Sie eine Tabelle, um die Richtlinie der Tabelle zuzuweisen und um das Verbinden von Spalten zu ermöglichen (ALLOWED JOIN KEYS).
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
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;
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;
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);
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:
|
Löschen einer Verknüpfungsrichtlinie. |
Eine Rolle mit der Berechtigung OWNERSHIP für die Verknüpfungsrichtlinie. |
Anzeigen einer Verknüpfungsrichtlinie. |
Eine der folgenden Berechtigungen:
|
Festlegen oder Aufheben einer Verknüpfungsrichtlinie für eine Tabelle. |
Eine der folgenden Berechtigungen:
|
Snowflake unterstützt verschiedene Berechtigungen zum Erstellen und Festlegen einer Verknüpfungsrichtlinie für ein Objekt.
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;
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üpfungsrichtliniecost_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;