Kategorien:

Kontextfunktionen (Sitzungsobjekt)

IS_ROLE_IN_SESSION

Überprüft, ob der Argumentwert (d. h. die Rolle) 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>' )

Nichtliteral – Angabe einer Spalte:

IS_ROLE_IN_SESSION( <column_name> )

Argumente

'string_literal'

Der Name der Rolle.

column_name

Der Spaltenname in einer Tabelle oder einer Ansicht.

Nutzungshinweise

  • Verwenden Sie nur eine Syntax.

  • Wenn Sie die Funktion 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.

  • Die Funktion kann nicht in der Definition der materialisierten Ansicht verwendet werden, da die Funktion nicht deterministisch ist und Snowflake nicht bestimmen kann, welche Daten materialisiert werden sollen.

  • Syntax für Literale:

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

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

    • Der Name einer Datenbankrolle 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;
    

    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_auth_role);
    

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                          |
+-------------------------------+

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);

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;

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);

Fügen Sie die Richtlinie zu einer Tabelle hinzu:

alter table allowed_roles
  add row access policy rap_authz_role on (authz_role);

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)
);

Fügen Sie die Richtlinie zu einer Tabelle hinzu:

alter table allowed_roles
  add row access policy rap_authz_role_map on (authz_role);
Zurück zum Anfang