Kategorien:

Kontextfunktionen (Sitzungsobjekt)

IS_ROLE_IN_SESSION

Überprüft, ob die Kontorolle in der Hierarchie der aktiven Primär- oder Sekundärrolle des Benutzers für die Sitzung enthalten ist oder ob die angegebene Spalte eine Rolle enthält, die in der Hierarchie der aktiven Primär- oder Sekundärrolle des Benutzers für die Sitzung enthalten ist.

Eingaben

Zeichenfolgenliteral zur direkten Angabe einer Rolle oder Nichtliteral zur Angabe eines Spaltennamens.

Rückgabewerte
  • TRUE:

    • Bei einem Zeichenfolgenliteral als Argument erben die aktive Primärrolle bzw. die aktiven Sekundärrollen des aktuellen Benutzers der Sitzung die Berechtigungen der angegebenen Rolle.

      Wenn DEFAULT_SECONDARY_ROLES den Wert ALL hat, erben alle Rollen, die dem Benutzer zugewiesen wurden, die Berechtigungen der angegebenen Rolle.

      Die angegebene Rolle kann die aktuelle Primärrolle oder Sekundärrolle sein (d. h. die von CURRENT_ROLE bzw. CURRENT_SECONDARY_ROLES zurückgegebenen Rollen) oder eine beliebige Rolle, die in der Rollenhierarchie darunter liegt.

    • Bei einem Nichtliteral als Argument wertet Snowflake jede Zeile aus und gibt eine Zeile zurück, die einen Wert enthält, der eine aktive Primär- oder Sekundärrolle in der aktuellen Sitzung des Benutzers angibt. Jede Zeile entspricht einem Rollennamen, der für die aktive Primär- oder Sekundärrolle sichtbar ist.

  • FALSE:

    • Bei einer Zeichenfolgenliteral als Argument liegt die angegebene Rolle entweder in der Rollenhierarchie über der aktuellen Primär- oder Sekundärrolle oder sie ist überhaupt nicht in der Rollenhierarchie enthalten.

    • Bei einem Nichtliteral als Argument wertet Snowflake jede Zeile aus. Wenn eine Zeile den Namen einer Rollen enthält, die entweder in der Rollenhierarchie über der aktuellen Primär- oder Sekundärrolle liegt oder die überhaupt nicht in der Rollenhierarchie enthalten ist, gibt Snowflake diese Zeile nicht zurück. In diesem Fall gibt Snowflake nur Zeilen mit einem Rollennamen zurück, der für die aktive Primär- oder Sekundärrolle sichtbar ist (falls vorhanden).

  • NULL:

    • In einem Data Sharing-Verbraucherkonto gibt diese Funktion NULL zurück, wenn sie wie in Bedingungen von Maskierungsrichtlinien auf ein freigegebenes Objekt (z. B. eine sichere UDF oder eine sichere Ansicht). Dieses Verhalten verhindert, dass die Rollenhierarchie in einem Data Sharing-Verbraucherkonto offengelegt wird.

Siehe auch:

IS_OBJECT, Erweiterte Sicherheit auf Spaltenebene

Syntax

Literal – Direkte Angabe einer Rolle:

IS_ROLE_IN_SESSION( '<string_literal>' )
Copy

Nichtliteral – Angabe einer Spalte:

IS_ROLE_IN_SESSION( <column_name> )
Copy

Argumente

'string_literal'

Der Name der Rolle.

column_name

Der Spaltenname in einer Tabelle oder einer Ansicht.

Nutzungshinweise

  • Verwenden Sie nur eine Syntax.

  • Syntax für Literale:

    • Es kann nur ein Datenbank-Rollenname als Argument übergeben werden.

    • Das Argument muss eine Zeichenfolge in Großbuchstaben sein.

    • Der Name einer Kontorolle wird nicht unterstützt.

  • Syntax für Nichtliterale:

    • Es kann nur genau eine Spalte als Argument übergeben werden.

    • Die Spalte muss den Datentyp STRING haben.

    • Verwenden Sie für die Angabe der Spalte eine der folgenden Optionen:

      • column_name

      • table_name.column_name

      • schema_name.table_name.column_name

      • database_name.schema_name.table_name.column_name

  • Virtuelle Spalten:

    Eine virtuelle Spalte, die das Ergebnis eines berechneten Wertes aus einem Ausdruck enthält, anstatt den berechneten Wert in der Tabelle zu speichern, wird nicht unterstützt.

    SELECT IS_ROLE_IN_SESSION(UPPER(authz_role)) FROM t1;
    
    Copy

    Eine virtuelle Spalte wird nur unterstützt, wenn der Ausdruck einen Alias für den Spaltennamen enthält:

    CREATE VIEW v2 AS
    SELECT
      authz_role,
      UPPER(authz_role) AS upper_authz_role
    FROM t2;
    
    SELECT IS_ROLE_IN_SESSION(upper_authz_role) FROM v2;
    
    Copy
  • Richtlinien:

    Wenn Sie diese Funktionen mit einer Maskierungsrichtlinie oder einer Zeilenzugriffsrichtlinie verwenden möchten, muss Ihr Snowflake-Konto die Enterprise Edition oder höher haben.

    Snowflake empfiehlt die Verwendung dieser Funktion, wenn Rollenhierarchie und geerbte Berechtigungen von den Richtlinienbedingungen ausgewertet werden müssen.

  • Ergebnis-Cache:

    Wenn Sie diese Funktion in einer Maskierungsrichtlinie oder einer Zeilenzugriffsrichtlinie verwenden und sich weder die Richtlinie noch die durch die Richtlinie geschützte Tabelle oder Spalte gegenüber einer früheren Abfrage ändert, können Sie die Funktion RESULT_SCAN verwenden, um die Ergebnisse einer Abfrage auf der geschützten Tabelle zurückzugeben. Der Ergebnis-Cache gilt nur bei Verwendung der Syntax für Nichtliterale.

  • Diese Funktionen können nicht in der Definition der materialisierten Ansicht verwendet werden, da sie nicht deterministisch sind und Snowflake nicht bestimmen kann, welche Daten materialisiert werden sollen.

Beispiele

Überprüfen Sie, ob die einer bestimmten Rolle erteilten Berechtigungen an die aktuelle Rolle der Sitzung vererbt werden:

SELECT IS_ROLE_IN_SESSION('ANALYST');

+-------------------------------+
| IS_ROLE_IN_SESSION('ANALYST') |
|-------------------------------|
| True                          |
+-------------------------------+
Copy

Geben Sie die aktive Primär- oder Sekundärrolle für die Spalte mit dem Namen ROLE_NAME zurück:

SELECT *
FROM myb.s1.t1
WHERE IS_ROLE_IN_SESSION(t1.role_name);
Copy

Geben Sie eine Rolle direkt in der Bedingung einer Maskierungsrichtlinie an:

CREATE OR REPLACE MASKING POLICY allow_analyst AS (val string)
RETURNS string ->
CASE
  WHEN IS_ROLE_IN_SESSION('ANALYST') THEN val
  ELSE '*******'
END;
Copy

Geben Sie der Spalte mit dem Namen AUTHZ_ROLE (d. h. die autorisierte Rolle) in einer Zeilenzugriffsrichtlinie an, und legen Sie die Richtlinie für die Tabellenspalte fest:

Erstellen Sie die Richtlinie:

CREATE OR REPLACE ROW ACCESS POLICY rap_authz_role AS (authz_role string)
RETURNS boolean ->
IS_ROLE_IN_SESSION(authz_role);
Copy

Fügen Sie die Richtlinie zu einer Tabelle hinzu:

ALTER TABLE allowed_roles
  ADD ROW ACCESS POLICY rap_authz_role ON (authz_role);
Copy

Geben Sie die Spalte mit dem Namen AUTHZ_ROLE in einer Zeilenzugriffsrichtlinie an, die eine Zuordnungstabelle verwendet, um die autorisierte Rolle in einer Spalte der Zuordnungstabelle mit dem Namen ROLE_NAME zu suchen. Nachdem Sie die Richtlinie erstellt haben, fügen Sie diese der Tabelle mit der Spalte AUTHZ_ROLE hinzu:

Erstellen Sie die Richtlinie:

CREATE OR REPLACE ROW ACCESS POLICY rap_authz_role_map AS (authz_role string)
RETURNS boolean ->
EXISTS (
  SELECT 1 FROM mapping_table m
  WHERE authz_role = m.key and IS_ROLE_IN_SESSION(m.role_name)
);
Copy

Fügen Sie die Richtlinie zu einer Tabelle hinzu:

ALTER TABLE allowed_roles
  ADD ROW ACCESS POLICY rap_authz_role_map ON (authz_role);
Copy