- 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.
Angabe des vollqualifizierten Namens einer Datenbankrolle im Format
database_name.database_role_name
. Verwenden Sie stattdessen den relativen Namendatabase_role_name
.
Syntax¶
Literal – Direkte Angabe einer Datenbankrolle:
IS_DATABASE_ROLE_IN_SESSION( '<string_literal>' )
Nichtliteral – Angabe einer Spalte:
IS_DATABASE_ROLE_IN_SESSION( <column_name> )
Argumente¶
'string_literal'
Gibt den Namen der Datenbankrolle an.
Geben Sie den relativen Namen der Datenbankrolle an. Die Funktion gibt
False
zurück, wenn Sie den vollqualifizierten Namen angeben.column_name
Der Spaltenname in einer Tabelle oder einer Ansicht.
Nutzungshinweise¶
Diese Hinweise gelten nur für die Funktion IS_DATABASE_ROLE_IN_SESSION:
Verwenden Sie diese Tabelle, um die Evaluation der Funktion vorherzusagen, wenn das Funktionsargument ein Zeichenfolgenliteral ist:
Kontext
Evaluation
Abfrage.
Sitzungsdatenbank.
Tabellen- oder Ansichtsdefinition mit WHERE-Klausel.
Hängt von Folgendem ab:
Wenn Sie eine Datenbank in Verwendung haben und den relativen Namen der Tabelle oder Ansicht verwenden, ist der Kontext die verwendete Datenbank (Sitzungsdatenbank).
Wenn Sie den vollqualifizierten Namen der Tabelle oder Ansicht angeben, ist der Kontext die Datenbank, die die Tabelle oder Ansicht enthält.
Geschützte Tabelle oder Ansicht.
Datenbank, die die Tabelle oder Ansicht enthält.
Gespeicherte Prozedur mit Eigentümerrechten.
Datenbank, die die gespeicherte Prozedur enthält.
Gespeicherte Prozedur mit Aufruferrechten.
Sitzungsdatenbank.
UDF
Datenbank, die die geschützte Tabelle oder Ansicht enthält.
Wenn die UDF nicht in einer Richtlinie aufgerufen wird, gibt die Funktion die Datenbank zurück, die die UDF enthält.
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 Data Sharing-Verbraucher sind und zur Abfrage richtliniengeschützter Daten eine Datenbankrolle verwenden, laden Sie erst die Datenbank, die die geschützte Tabelle enthält, mit einem
USE DATABASE database_name
-Befehl, bevor Sie die richtliniengeschützten Daten abfragen. Alternativ können Sie auch den vollqualifizierten Namen des geschützten Objekts in der Abfrage angeben. Bei beiden Ansätzen 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 Sie diese Funktion im
body
einer Datenzugriffsrichtlinie angeben, z. B. in einer Maskierungs- oder Zeilenzugriffsrichtlinie, verwendet die Funktion die Datenbank und das Schema der geschützten Tabelle.Wenn Sie beispielsweise der Tabelle
hr.tables.empl_info
eine Zeilenzugriffsrichtlinie hinzufügen, sucht die Funktion nach ihrem Argument, dem Namen der Datenbankrolle oder dem Spaltennamen, in der Datenbankhr
, da diese Datenbank die geschützte Tabelle enthält.Vermeiden Sie Abfragestrukturen, bei denen Snowflake eine Inline-Ansicht erstellen muss. In diesem Kontext ist eine Inline-Ansicht eine temporäre Ansicht, die Snowflake zur Ermittlung des Abfrageergebnisses erstellt. Wenn Ihre Abfrage beispielsweise diese Funktion aufruft und Sie eine WITH-Klausel am Anfang der Abfrage oder eine Unterabfrage in der FROM-Klausel angeben, gibt Snowflake einen Fehler zurück:
Could not resolve the database for IS_DATABASE_ROLE_IN_SESSION({})
Dabei ist
{}
ein Platzhalter für das Funktionsargument in Ihrer Abfrage. Der Grund für den Fehler ist, dass Snowflake nicht genügend Informationen hat, um den Kontext des Funktionsarguments zu evaluieren. Um die Fehlermeldung zu beheben, vereinfachen Sie Ihre Abfrage, indem Sie beispielsweise die WITH-Klausel oder die Unterabfrage in der FROM-Klausel entfernen.Wenn der Wert der Benutzereigenschaft
DEFAULT_SECONDARY_ROLES
ALL
ist, gibt die FunktionTrue
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 sein und die gleiche Groß-/Kleinschreibung haben, mit der die Rolle in Snowflake gespeichert ist. Weitere Details dazu finden Sie unter Anforderungen an Bezeichner.
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;
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;
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('R1');
+-----------------------------------+
| IS_DATABASE_ROLE_IN_SESSION('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);
Weitere Beispiele für die sichere Datenfreigabe finden Sie unter Freigeben von Daten, die durch eine Richtlinie geschützt sind.