CREATE ROW ACCESS POLICY

Erstellt eine neue Zeilenzugriffsrichtlinie im aktuellen/angegebenen Schema oder ersetzt eine bestehende Zeilenzugriffsrichtlinie.

Fügen Sie nach dem Erstellen einer Zeilenzugriffsrichtlinie diese Richtlinie mit einem ALTER TABLE-Befehl zu einer Tabelle oder mit einem ALTER VIEW-Befehl zu einer Ansicht hinzu.

Siehe auch:

DDL für Zeilenzugriffsrichtlinien

Syntax

Snowflake unterstützt die folgende Syntax zum Erstellen einer Zeilenzugriffsrichtlinie.

CREATE [ OR REPLACE ] ROW ACCESS POLICY [ IF NOT EXISTS ] <name> AS
( <arg_name> <arg_type> [ , ... ] ) RETURNS BOOLEAN -> <body>
[ COMMENT = '<string_literal>' ]
Copy

Erforderliche Parameter

name

Bezeichner für die Zeilenzugriffsrichtlinie, der für Ihr Schema eindeutig sein muss.

Der Bezeichnerwert muss mit einem alphabetischen Zeichen beginnen und darf keine Leer- oder Sonderzeichen enthalten, es sei denn, die gesamte Bezeichnerzeichenfolge wird in doppelte Anführungszeichen gesetzt (z. B. „Mein Objekt“). Bei Bezeichnern, die in doppelte Anführungszeichen eingeschlossen sind, ist auch die Groß-/Kleinschreibung zu beachten.

Weitere Details dazu finden Sie unter Anforderungen an Bezeichner

AS ( <arg_name> <arg_type> [ , ... ] )

Die Signatur für die Zeilenzugriffsrichtlinie.

Eine Signatur gibt einen Satz von Attributen an, die berücksichtigt werden müssen, um festzustellen, ob Zugriff auf die Zeile erlaubt ist. Die Attributwerte stammen aus dem Datenbankobjekt (z. B. Tabelle oder Ansicht), das durch die Zeilenzugriffsrichtlinie geschützt werden soll.

RETURNS BOOLEAN

Eine Zeilenzugriffsrichtlinie muss den Wert „true“ oder „false“ ergeben. Dem Benutzer, der eine durch eine Zeilenzugriffsrichtlinie geschützte Tabelle abfragt, werden in der Ausgabe die Zeilen angezeigt, die auf dem basieren, wie body geschrieben wurde.

body

SQL-Ausdruck, der die Argumentwerte in der Signatur verarbeitet, um zu bestimmen, welche Zeilen beim Abfragen einer Tabelle zurückgegeben werden sollen, die durch eine Zeilenzugriffsrichtlinie geschützt ist.

Der body-Ausdruck kann ein beliebiger SQL-Ausdruck sein, der einen booleschen Wert ergibt. Snowflake unterstützt Ausdrücke, die Übersicht zu benutzerdefinierten Funktionen, Schreiben von externen Funktionen und Ausdrücke mit Unterabfragen aufrufen.

Optionale Parameter

COMMENT = 'string_literal'

Gibt einen Kommentar für die Zeilenzugriffsrichtlinie an.

Standard: Kein Wert

Anforderungen an die Zugriffssteuerung

Eine Rolle, die zur Ausführung dieses SQL-Befehls verwendet wird, muss mindestens die folgenden Berechtigungen haben:

Berechtigung

Objekt

Anmerkungen

CREATE ROW ACCESS POLICY

Schema

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

Eine Anleitung zum Erstellen einer kundenspezifischen Rolle mit einer bestimmten Gruppe von Berechtigungen finden Sie unter Erstellen von kundenspezifischen Rollen.

Allgemeine Informationen zu Rollen und Berechtigungen zur Durchführung von SQL-Aktionen auf sicherungsfähigen Objekten finden Sie unter Übersicht zur Zugriffssteuerung.

Weitere Informationen zur DDL und zu Berechtigungen von Maskierungsrichtlinien finden Sie unter Verwalten der Sicherheit auf Spaltenebene.

Nutzungshinweise

  • Das Einfügen einer oder mehrerer Unterabfragen in den Richtlinientext kann zu Fehlern führen. Wenn möglich, begrenzen Sie die Anzahl der Unterabfragen, begrenzen Sie die Anzahl der JOIN-Operationen, und vereinfachen Sie die Bedingungen der WHERE-Klausel.

  • Wenn ein Datenbankobjekt sowohl eine Zeilenzugriffsrichtlinie als auch eine oder mehrere -Maskierungsrichtlinien hat, wird die Zeilenzugriffsrichtlinie zuerst ausgewertet.

    Weitere Informationen zu Zeilenzugriffsrichtlinien während der Laufzeit von Abfragen finden Sie unter Erläuterungen zu Zeilenzugriffsrichtlinien.

  • Eine bestimmte Tabellen- oder Ansichtsspalte kann entweder in der Signatur einer Maskierungsrichtlinie oder in der Signatur einer Zeilenzugriffsrichtlinie angegeben werden. Oder anders ausgedrückt, dieselbe Spalte kann nicht gleichzeitig in einer Maskierungsrichtliniensignatur und in einer Zeilenzugriffsrichtliniensignatur angegeben werden.

    Weitere Informationen dazu finden Sie unter CREATE MASKING POLICY.

  • Sie können die Richtliniensignatur (d. h. den Argumentnamen oder den Eingabe-/Ausgabedatentyp) nicht mit CREATE OR REPLACE ROW ACCESS POLICY ändern, wenn die Richtlinie an eine Tabelle oder Ansicht angehängt ist, und auch nicht mit ALTER ROW ACCESS POLICY. Wenn Sie die Signatur ändern müssen, führen Sie eine DROP ROW ACCESS POLICY-Anweisung für die Richtlinie aus, und erstellen Sie dann eine neue Zeilenzugriffsrichtlinie.

  • Wenn der body der Richtlinie ein Lookup auf einer Zuordnungstabelle enthält, erstellen Sie eine zentralisierte Zuordnungstabelle, und speichern Sie die Zuordnungstabelle in derselben Datenbank wie die geschützte Tabelle. Dies ist besonders wichtig, wenn body die Funktion IS_DATABASE_ROLE_IN_SESSION aufruft. Weitere Informationen dazu finden Sie in den Nutzungshinweisen.

  • Ein Data Sharing-Anbieter kann keine Zeilenzugriffsrichtlinien in einem Leserkonto erstellen.

  • Metadaten:

    Achtung

    Kunden müssen sicherstellen, dass bei der Nutzung des Snowflake-Dienstes keine personenbezogenen Daten (außer für ein Objekt „Benutzer“), sensible Daten, exportkontrollierte Daten oder andere regulierte Daten als Metadaten eingegeben werden. Weitere Informationen dazu finden Sie unter Metadatenfelder in Snowflake.

  • CREATE OR REPLACE <Objekt>-Anweisungen sind atomar. Das heißt, wenn ein Objekt ersetzt wird, erfolgt das Löschen des alten Objekts und das Erstellen des neuen Objekts in einer einzigen Transaktion.

Beispiele

In diesen Beispielen wird die Kontextfunktion CURRENT_ROLE verwendet. Wenn Rollenaktivierung und Rollenhierarchie in den Richtlinienbedingungen erforderlich sind, verwenden Sie IS_ROLE_IN_SESSION.

Mit der folgenden Zeilenzugriffsrichtlinie wird Benutzern, deren aktuelle Rolle (siehe CURRENT_ROLE) die kundenspezifische Rolle it_admin ist, das Anzeigen der Mitarbeiter-ID-Nummer (d. h. empl_id) im Abfrageergebnis erlaubt.

create or replace row access policy rap_it as (empl_id varchar) returns boolean ->
  case
      when 'it_admin' = current_role() then true
      else false
  end
;
Copy

Mit der folgenden Zeilenzugriffsrichtlinie wird Benutzern erlaubt, Zeilen im Abfrageergebnis anzuzeigen, wenn eine der beiden folgenden Bedingungen erfüllt ist:

  1. Die aktuelle Rolle ist die kundenspezifische Rolle sales_executive_role. Fragen Sie die Funktion CURRENT_ROLE ab, um die aktuelle Rolle zu ermitteln.

  2. Die aktuelle Rolle ist die kundenspezifische Rolle sales_manager, und die Abfrage gibt eine sales_region an, die der Zuordnungstabelle salesmanageregions entspricht.

use role securityadmin;

create or replace row access policy rap_sales_manager_regions_1 as (sales_region varchar) returns boolean ->
  'sales_executive_role' = current_role()
      or exists (
            select 1 from salesmanagerregions
              where sales_manager = current_role()
                and region = sales_region
          )
;
Copy

Wobei:

rap_sales_manager_regions_1

Der Name der Zeilenzugriffsrichtlinie.

as (sales_region varchar)

Die Signatur für die Zeilenzugriffsrichtlinie.

Eine Signatur gibt einen Satz von Attributen an, die berücksichtigt werden müssen, um festzustellen, ob Zugriff auf die Zeile erlaubt ist. Die Attributwerte stammen aus der Tabelle, die durch die Zeilenzugriffsrichtlinie geschützt werden soll.

returns boolean ->

Gibt die Anwendung der Zeilenzugriffsrichtlinie an.

Beachten Sie, dass der <expression> der Zeilenzugriffsrichtlinie unmittelbar auf den rechten Pfeil (d. h. ->) folgt.

Der Ausdruck kann ein beliebiger SQL-Ausdruck mit booleschem Wert sein. Snowflake unterstützt Ausdrücke, die UDFs, externe Funktionen und Ausdrücke mit Unterabfragen aufrufen.

'sales_executive_role' = current_role()

Die erste Bedingung des Ausdrucks der Zeilenzugriffsrichtlinie, die es Benutzern mit der kundenspezifischen Rolle „sales_executive_role“ erlaubt, Daten anzuzeigen.

or exists (select 1 from salesmanagerregions where sales_manager = current_role() and region = sales_region)

Die zweite Bedingung des Ausdrucks der Zeilenzugriffsrichtlinie, in dem eine Unterabfrage verwendet wird.

Die Unterabfrage erfordert, dass CURRENT_ROLE die kundenspezifische Rolle „sales_manager“ ist, wobei die ausgeführte Abfrage auf den Daten eine Region angibt, die in der Zuordnungstabelle salesmanagerregions aufgeführt ist.

Die folgende Zeilenzugriffsrichtlinie legt zwei Attribute in der Richtliniensignatur fest:

create or replace row access policy rap_test2 as (n number, v varchar)
  returns boolean -> true;
Copy

Wobei:

rap_test2

Der Name der Zeilenzugriffsrichtlinie.

(n number, v varchar)

Die Signatur für die Zeilenzugriffsrichtlinie.

Eine Signatur gibt einen Satz von Attributen an, die berücksichtigt werden müssen, um festzustellen, ob Zugriff auf die Zeile erlaubt ist. Die Attributwerte stammen aus der Tabelle, die durch die Zeilenzugriffsrichtlinie geschützt werden soll.

returns boolean -> true

Legt die Anwendung der Zeilenzugriffsrichtlinie fest.

Der zurückgegebene Wert bestimmt, ob der Benutzer Zugriff auf eine bestimmte Zeile des Datenbankobjekts hat, zu dem die Zeilenzugriffsrichtlinie hinzugefügt wurde.

Weitere Beispiele finden Sie unter Zeilenzugriffsrichtlinien verwenden.