Catégories :

Fonctions contextuelles (Session)

SET_SYS_CONTEXT

Définit une valeur pour une clé spécifiée dans un espace de noms spécifié qui peut être récupérée ultérieurement en utilisant SYS_CONTEXT.

La fonction a deux modes de fonctionnement :

  • Attributs de session immuables (espace de nom SNOWFLAKE$SESSION_ATTRIBUTES) : définit des attributs de session personnalisés qui sont immuables une fois définis et persistent pendant la durée de la session. Utile pour suivre les métadonnées d’une session, telles que le contexte de l’application, les attributs de l’utilisateur ou les informations d’audit.

  • Variables de session (autres espaces de noms) : Se comporte comme la commande SET, en définissant des variables de session qui peuvent être mises à jour. Renvoie la valeur précédente de la variable.

Voir aussi :

SYS_CONTEXT, SYS_CONTEXT (espace de noms SNOWFLAKE$SESSION_ATTRIBUTES), SET

Syntaxe

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

Arguments

'namespace'

L’espace de noms dans lequel stocker la paire clé-valeur. Espaces de noms pris en charge :

  • SNOWFLAKE$SESSION_ATTRIBUTES - Stocke les attributs de session personnalisés immuables. Les noms d’attribut sont sensibles à la casse.

  • Toute autre chaîne (ouNULL ) - Traite l’espace de noms comme un préfixe pour un nom de variable de session, similaire à la commande SET. Les espaces de noms sont sensibles à la casse.

'key'

Le nom de l’attribut ou de la variable à définir. Tous les noms de clé sont sensibles à la casse.

'value'

La valeur à attribuer. La valeur doit être une chaîne ou expression dont le résultat est une chaîne.

Renvoie

La fonction renvoie une valeur VARCHAR :

  • Pour l’espace de noms SNOWFLAKE$SESSION_ATTRIBUTES : Renvoie toujours NULL (car les attributs immuables ne peuvent pas avoir une valeur précédente). Si l’attribut a déjà été défini dans la session en cours, la fonction signale une erreur à la place.

  • Pour les autres espaces de noms : Renvoie la valeur précédente de la variable de session, ou NULL si la variable n’existait pas auparavant. Cela correspond au comportement de la commande SET.

Exigences en matière de contrôle d’accès

Aucun privilège particulier n’est requis pour définir des attributs de session personnalisés. Tout utilisateur peut définir des attributs dans sa propre session.

Notes sur l’utilisation

Pour l’espace de noms SNOWFLAKE $SESSION_ATTRIBUTES (attributs immuables) :

  • Les attributs sont immuables. Une fois qu’un attribut est défini, toute tentative de le définir à nouveau (même à la même valeur) entraînera une erreur.

  • Les noms d’attributs sont sensibles à la casse.``app_context``, App_Context et APP_CONTEXT sont traités comme trois attributs différents.

  • Les attributs sont spécifiques à la session. Ils persistent pendant la durée de la session et ne sont pas visibles pour les autres sessions.

  • Pour récupérer les valeurs d’attribut, utilisez:doc:sys_context_snowflake_session_attributes :SYS_CONTEXT('SNOWFLAKE$SESSION_ATTRIBUTES', '<key>').

Pour les autres espaces de noms (variables de session) :

  • Les noms de variable sont sensibles à la casse. les variables user_id et``USER_ID`` sont traitées comme des variables différentes.

  • Les variables peuvent être mises à jour. La définition d’une variable qui existe déjà renvoie la valeur précédente et la met à jour avec la nouvelle valeur.

  • L’espace de noms (s’il est fourni) est utilisé comme préfixe :SET_SYS_CONTEXT('myns', 'mykey', 'val') crée une variable nommée myns.mykey.

  • Les variables peuvent être récupérées en utilisant``SYS_CONTEXT(“<namespace>”, “<key>”)`` avec la casse exacte utilisée lors de la définition de la variable.

Notes générales :

  • Si vous spécifiez l’appel de fonction dans une chaîne entre guillemets doubles dans un shell, isolez le caractère $ avec une barre oblique inverse (\) de sorte que $session_attributes ne soit pas interprété comme une variable de shell.

Exemples

Exemple 1 : Attributs de session immuables (espace de noms SNOWFLAKE $SESSION_ATTRIBUTES)

Définissez un attribut personnalisé pour suivre le contexte de l’application :

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

Récupérez la valeur d’attribut (remarque : les noms d’attributs sont sensibles à la casse) :

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

Une fois qu’un attribut est défini, la tentative de le modifier entraîne une erreur :

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

Les noms d’attribut sont sensibles à la casse.

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

Exemple 2 : variables de session (autres espaces de noms)

Définir une variable de session avec un préfixe d’espace de noms :

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

La variable est stockée avec la casse exacte fournie : myapp.user_id. Récupérer celle-ci :

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

Mettre à jour la variable (renvoie la valeur précédente) :

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