Kategorien:

Kontextfunktionen (Sitzung)

SET_SYS_CONTEXT

Legt einen Wert für einen bestimmten Schlüssel in einem bestimmten Namespace fest, der später mit SYS_CONTEXT abgerufen werden kann.

Diese Funktion hat zwei Vorgangsmodi:

  • Unveränderliche Sitzungsattribute (SNOWFLAKE$SESSION_ATTRIBUTES-Namespace): Legt kundenspezifische Sitzungsattribute fest, die nach der Einstellung unveränderlich sind und für die Dauer der Sitzung bestehen bleiben. Nützlich für die Verfolgung von Metadaten über eine Sitzung, z. B. Anwendungskontext, Benutzerattribute oder Audit-Informationen.

  • Sitzungsvariablen (andere Namespaces): Verhält sich wie der Befehl SET, um Sitzungsvariablen festzulegen, die aktualisiert werden können. Gibt den vorherigen Wert der Variablen zurück.

Siehe auch:

SYS_CONTEXT, SYS_CONTEXT (SNOWFLAKE$SESSION_ATTRIBUTES-Namespace), SET

Syntax

CALL SET_SYS_CONTEXT( '<namespace>', '<key>', '<value>' )

Argumente

'namespace'

Der Namespace, in dem das Schlüssel-Wert-Paar gespeichert werden soll. Unterstützte Namespaces:

  • SNOWFLAKE$SESSION_ATTRIBUTES: Speichert unveränderliche kundenspezifische Sitzungsattribute. Bei Attributnamen wird zwischen Groß- und Kleinschreibung unterschieden.

  • Eine beliebige andere Zeichenfolge (oder NULL): Behandelt den Namespace als Präfix für den Namen einer Sitzungsvariablen, ähnlich wie der Befehl SET. Bei Namespaces wird zwischen Groß- und Kleinschreibung unterschieden.

'key'

Der Name des festzulegenden Attributs oder der festzulegenden Variablen. Bei sämtlichen Schlüsselnamen wird zwischen Groß- und Kleinschreibung unterschieden.

'value'

Der zuzuweisende Wert. Der Wert muss eine Zeichenfolge oder ein Ausdruck sein, die bzw. der eine Zeichenfolge ergibt.

Rückgabewerte

Die Funktion gibt einen VARCHAR-Wert zurück.

  • Für den SNOWFLAKE$SESSION_ATTRIBUTES-Namespace: Gibt immer NULL zurück (da unveränderliche Attribute keinen vorherigen Wert haben können). Wenn das Attribut bereits in der aktuellen Sitzung festgelegt wurde, gibt die Funktion stattdessen einen Fehler aus.

  • Für andere Namespaces: Gibt den vorherigen Wert der Sitzungsvariablen oder NULL zurück, wenn die Variable zuvor nicht existierte. Dies entspricht dem Verhalten des Befehls SET.

Anforderungen an die Zugriffssteuerung

Es sind keine besonderen Berechtigungen erforderlich, um kundenspezifische Sitzungsattribute festzulegen. Jeder Benutzende kann Attribute in seiner eigenen Sitzung festlegen.

Nutzungshinweise

Für SNOWFLAKE$SESSION_ATTRIBUTES-Namespace (unveränderliche Attribute):

  • Attribute sind unveränderlich. Sobald ein Attribut festgelegt ist, führt jeder Versuch, es erneut festzulegen (auch für den gleichen Wert), zu einem Fehler.

  • Bei Attributnamen wird zwischen Groß- und Kleinschreibung unterschieden. app_context, App_Context und APP_CONTEXT werden als drei verschiedene Attribute behandelt.

  • Attribute sind sitzungsbezogen. Sie bleiben für die Dauer der Sitzung bestehen und sind für andere Sitzungen nicht sichtbar.

  • Verwenden Sie SYS_CONTEXT (SNOWFLAKE$SESSION_ATTRIBUTES-Namespace): SYS_CONTEXT('SNOWFLAKE$SESSION_ATTRIBUTES', '<key>'), um Attributwerte abzurufen.

Für andere Namespaces (Sitzungsvariablen):

  • Bei Variablennamen wird zwischen Groß-/Kleinschreibung unterschieden. user_id und USER_ID werden als verschiedene Variablen behandelt.

  • Variablen können aktualisiert werden. Durch die Festlegung einer Variablen, die bereits vorhanden ist, wird der vorherige Wert zurückgegeben und mit dem neuen Wert aktualisiert.

  • Der Namespace (falls angegeben) wird als Präfix verwendet: SET_SYS_CONTEXT('myns', 'mykey', 'val') erstellt eine Variable mit dem Namen myns.mykey.

  • Variablen können mithilfe von SYS_CONTEXT('<namespace>', '<key>') mit der genauen Schreibweise abgerufen werden, die bei der Einstellung der Variablen verwendet wurde.

Allgemeine Hinweise:

  • Wenn Sie den Funktionsaufruf in einer Zeichenfolge in doppelten Anführungszeichen angeben, versehen Sie das $-Zeichen mit einem Backslash (\), als Escapezeichen, damit $session_attributes nicht als Shell-Variable interpretiert wird.

Beispiele

Beispiel 1: Unveränderliche Sitzungsattribute (SNOWFLAKE$SESSION_ATTRIBUTES-Namespace)

Legen Sie ein kundenspezifisches Attribut zur Verfolgung des Anwendungskontexts fest:

CALL SET_SYS_CONTEXT('SNOWFLAKE$SESSION_ATTRIBUTES', 'app_context', 'production');

Rufen Sie den Attributwert ab (Hinweis: Bei Attributnamen wird zwischen Groß- und Kleinschreibung unterschieden):

SELECT SYS_CONTEXT('SNOWFLAKE$SESSION_ATTRIBUTES', 'app_context');
+---------------------------------------------------------------+
| SYS_CONTEXT('SNOWFLAKE$SESSION_ATTRIBUTES', 'app_context')   |
|---------------------------------------------------------------|
| production                                                    |
+---------------------------------------------------------------+

Sobald ein Attribut festgelegt ist, führt der Versuch, es zu ändern, zu einem Fehler:

-- This will fail because the attribute is immutable
CALL SET_SYS_CONTEXT('SNOWFLAKE$SESSION_ATTRIBUTES', 'app_context', 'development');
SQL compilation error: Cannot overwrite context value: app_context

Bei Attributnamen wird zwischen Groß- und Kleinschreibung unterschieden.

-- This succeeds because it's a different attribute name (different case)
CALL SET_SYS_CONTEXT('SNOWFLAKE$SESSION_ATTRIBUTES', 'APP_CONTEXT', 'staging');

SELECT SYS_CONTEXT('SNOWFLAKE$SESSION_ATTRIBUTES', 'app_context') AS lower_case,
       SYS_CONTEXT('SNOWFLAKE$SESSION_ATTRIBUTES', 'APP_CONTEXT') AS upper_case;
+------------+------------+
| LOWER_CASE | UPPER_CASE |
|------------+------------|
| production | staging    |
+------------+------------+

Beispiel 2: Sitzungsvariablen (andere Namespaces)

Legen Sie eine Sitzungsvariable mit einem Namespace-Präfix fest:

CALL SET_SYS_CONTEXT('myapp', 'user_id', '12345');
+---------------------------------------------------+
| SET_SYS_CONTEXT('myapp', 'user_id', '12345')     |
|---------------------------------------------------|
| NULL                                              |
+---------------------------------------------------+

Die Variable wird mit der genauen Schreibweise gespeichert, die angegeben wird: myapp.user_id. Rufen Sie sie ab:

SELECT SYS_CONTEXT('myapp', 'user_id');
+----------------------------------+
| SYS_CONTEXT('myapp', 'user_id')  |
|----------------------------------|
| 12345                            |
+----------------------------------+

Aktualisieren Sie die Variable (gibt den vorherigen Wert zurück):

CALL SET_SYS_CONTEXT('myapp', 'user_id', '67890');
+---------------------------------------------------+
| SET_SYS_CONTEXT('myapp', 'user_id', '67890')     |
|---------------------------------------------------|
| 12345                                             |
+---------------------------------------------------+