Categorias:

Funções de contexto (Sessão)

SET_SYS_CONTEXT

Define um valor para uma chave especificada em um namespace especificado que pode ser recuperado posteriormente usando SYS_CONTEXT.

Essa função tem dois modos de operação:

  • Atributos de sessão imutáveis (namespace SNOWFLAKE$SESSION_ATTRIBUTES): define atributos de sessão personalizados que são imutáveis ​​uma vez definidos e persistem durante a sessão. Útil para rastrear metadados sobre uma sessão, como contexto do aplicativo, atributos do usuário ou informações de auditoria.

  • Variáveis ​​de sessão (outros namespaces): comporta-se como o comando SET, definindo variáveis ​​de sessão que podem ser atualizadas. Retorna o valor anterior da variável.

Consulte também:

SYS_CONTEXT, SYS_CONTEXT (namespace SNOWFLAKE$SESSION_ATTRIBUTES), SET

Sintaxe

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

Argumentos

'namespace'

O namespace no qual armazenar o par chave-valor. Namespaces compatíveis:

  • SNOWFLAKE$SESSION_ATTRIBUTES – armazena atributos de sessão personalizados imutáveis. Os nomes dos atributos diferenciam maiúsculas de minúsculas.

  • Qualquer outra cadeia de caracteres (ou NULL) – trata o namespace como um prefixo para o nome de uma variável de sessão, semelhante ao comando SET. Os namespaces diferenciam maiúsculas de minúsculas.

'key'

O nome do atributo ou variável a ser definido. Todos os nomes de chave diferenciam maiúsculas de minúsculas.

'value'

O valor a ser designado. O valor deve ser uma cadeia de caracteres ou uma expressão que resulte em uma cadeia de caracteres.

Retornos

A função retorna um valor VARCHAR:

  • Para o namespace SNOWFLAKE$SESSION_ATTRIBUTES: sempre retorna NULL (porque atributos imutáveis ​​não podem ter um valor anterior). Se o atributo já tiver sido definido na sessão atual, a função vai gerar um erro.

  • Para outros namespaces: retorna o valor anterior da variável de sessão ou NULL se a variável não existia anteriormente. Isso corresponde ao comportamento do comando SET.

Requisitos de controle de acesso

Não são necessários privilégios especiais para definir atributos de sessão personalizados. Qualquer usuário pode definir atributos em sua própria sessão.

Notas de uso

Para o namespace SNOWFLAKE$SESSION_ATTRIBUTES (atributos imutáveis):

  • Os atributos são imutáveis. Depois que um atributo for definido, qualquer tentativa de defini-lo novamente (mesmo com o mesmo valor) resultará em um erro.

  • Os nomes dos atributos diferenciam maiúsculas de minúsculas. app_context, App_Context e APP_CONTEXT são tratados como três atributos diferentes.

  • Os atributos têm escopo de sessão. Eles persistem durante toda a sessão e não são visíveis para outras sessões.

  • Para recuperar os valores dos atributos, use SYS_CONTEXT (namespace SNOWFLAKE$SESSION_ATTRIBUTES): SYS_CONTEXT('SNOWFLAKE$SESSION_ATTRIBUTES', '<key>').

Para outros namespaces (variáveis ​​de sessão):

  • Os nomes das variáveis ​​**diferenciam maiúsculas de minúsculas**. user_id e USER_ID são tratados como variáveis ​​diferentes.

  • É possível atualizar as variáveis. Definir uma variável que já existe retorna o valor anterior e a atualiza com o novo valor.

  • O namespace (se fornecido) é usado como prefixo: SET_SYS_CONTEXT('myns', 'mykey', 'val') cria uma variável chamada myns.mykey.

  • É possível recuperar as variáveis ​​usando SYS_CONTEXT('<namespace>', '<key>') com as mesmas maiúsculas e minúsculas utilizadas ao definir a variável.

Notas gerais:

  • Se você estiver especificando a chamada da função em uma cadeia de caracteres entre aspas duplas em um shell, aplique o escape do caractere $ com uma barra invertida (\) para que $session_attributes não seja interpretado como uma variável do shell.

Exemplos

Exemplo 1: Atributos de sessão imutáveis ​​(namespace SNOWFLAKE$SESSION_ATTRIBUTES)

Defina um atributo personalizado para rastrear o contexto do aplicativo:

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

Recupere o valor do atributo (observação: os nomes dos atributos diferenciam maiúsculas de minúsculas):

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

Depois que um atributo é definido, tentar alterá-lo resulta em um erro:

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

Os nomes dos atributos diferenciam maiúsculas de minúsculas:

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

Exemplo 2: variáveis ​​de sessão (outros namespaces)

Defina uma variável de sessão com um prefixo de namespace:

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

A variável é armazenada com as mesmas maiúsculas e minúsculas fornecidas: myapp.user_id. Recupere-a:

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

Atualize a variável (retorna o valor anterior):

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