Kategorien:

Kontextfunktionen (Sitzungsobjekt)

IS_DATABASE_ROLE_IN_SESSION

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

Eingaben

Zeichenfolgenliteral zur Angabe des Namens der Datenbankrolle oder Nichtliteral zur Angabe eines Spaltennamens.

Rückgabewerte
  • True:

    • Bei einem Literal als Argument (Datenbankrollenname) erben die aktive Primärrolle bzw. die aktiven Sekundärrollen des aktuellen Benutzers der Sitzung die Berechtigungen der angegebenen Datenbankrolle.

    • Bei einem Nichtliteral als Argument (Spaltenname) wertet Snowflake jede Zeile in der Tabelle aus und gibt eine Zeile zurück, die einen Wert enthält, der eine Datenbankrolle in der aktuellen Sitzung des Benutzers angibt. Jede Zeile entspricht einem Datenbankrollennamen, der aus der verwendeten Datenbank oder der in einer Abfrage angegebenen Datenbank stammt.

  • False:

    • Bei einem Literal-Argument befindet sich die angegebene Datenbankrolle nicht in der Rollenhierarchie der primären oder sekundären Rolle des aktuellen Benutzers.

    • Bei einem nicht-literalen Argument gibt Snowflake keine Zeile zurück, wenn die Datenbankrolle nicht in der Tabellenspalte für die verwendete Datenbank oder die in einer Abfrage angegebene Datenbank enthalten ist.

Syntax

Literal – Direkte Angabe einer Datenbankrolle:

IS_DATABASE_ROLE_IN_SESSION( '<string_literal>' )
Copy

Nichtliteral – Angabe einer Spalte:

IS_DATABASE_ROLE_IN_SESSION( <column_name> )
Copy

Argumente

'string_literal'

Gibt den Namen der Datenbankrolle an.

Geben Sie entweder den vollqualifizierten Namen oder den relativen Namen der Datenbankrolle an.

column_name

Der Spaltenname in einer Tabelle oder einer Ansicht.

Nutzungshinweise

Diese Hinweise gelten nur für die Funktion IS_DATABASE_ROLE_IN_SESSION:

  • Eine Datenbankrolle wird in der Rollenhierarchie aktiv, wenn die Datenbank, die die Datenbankrolle enthält, in Gebrauch ist oder wenn eine Tabelle in derselben Datenbank abgefragt wird, die die Datenbankrolle enthält.

    Wenn Sie ein Datenfreigabe-Verbraucher sind und eine Datenbankrolle zur Abfrage richtliniengeschützter Daten verwenden, laden Sie die Datenbank, die die Datenbankrolle enthält, mit einem USE DATABASE database_name-Befehl, bevor Sie die richtliniengeschützten Daten abfragen. Mit diesem Befehl wird die Datenbankrolle in der Rollenhierarchie der aktuellen Rolle für den Benutzer aktiviert. Weitere Details dazu finden Sie unter Freigeben von Daten, die durch eine Richtlinie geschützt sind.

  • Wenn der Wert der Benutzereigenschaft DEFAULT_SECONDARY_ROLES ALL ist, gibt die Funktion True zurück, wenn eine Kontorolle, die dem Benutzer zugewiesen wurde, die Berechtigungen der angegebenen Datenbankrolle erbt.

  • Wenn Sie diese Funktion in der Bedingung einer Maskierungsrichtlinie oder einer Zeilenzugriffsrichtlinie verwenden, die freigegebene Daten schützt, stellen Sie sicher, dass die Datenbank, die die Richtlinie enthält, und die richtliniengeschützten Daten beide für das Verbraucherkonto freigegeben sind. Die Richtlinie und die durch die Richtlinie geschützten Daten können sich in derselben Datenbank oder in verschiedenen Datenbanken befinden. Weitere Details dazu finden Sie unter Freigeben von Daten, die durch eine Richtlinie geschützt sind.

Diese Hinweise gelten sowohl für die Funktionen IS_DATABASE_ROLE_IN_SESSION als auch IS_ROLE_IN_SESSION:

  • 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_DATABASE_ROLE_IN_SESSION('DB1.R1');
Copy
+---------------------------------------+
| IS_DATABASE_ROLE_IN_SESSION('DB1.R1') |
+---------------------------------------+
| True                                  |
+---------------------------------------+

Rückgabe von Datenbankrollenwerten für die Spalte mit dem Namen ROLE_NAME:

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

Weitere Beispiele für die sichere Datenfreigabe finden Sie unter Freigeben von Daten, die durch eine Richtlinie geschützt sind.