カテゴリ:

コンテキスト関数 (セッション)

SET_SYS_CONTEXT

:doc:`sys_context`を使用して後で取得できる、指定された名前空間の指定されたキーの値を設定します。

この関数には、2つの操作モードがあります。

  • **不変のセッション属性**(``SNOWFLAKE$SESSION_ATTRIBUTES``名前空間):一度設定されると不変であり、セッションの間保持されるカスタムセッション属性を設定します。アプリケーションコンテキスト、ユーザー属性、監査情報など、セッションに関するメタデータを追跡するのに役立ちます。

  • **セッション変数**(その他の名前空間)::doc:`SET </sql-reference/sql/set>`コマンドのように動作し、更新可能なセッション変数を設定します。変数の以前の値を返します。

こちらもご参照ください。

SYS_CONTEXTSYS_CONTEXT(SNOWFLAKE$SESSION_ATTRIBUTES 名前空間)SET

構文

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

引数

'namespace'

キーと値のペアを格納する名前空間。サポートされている名前空間:

  • SNOWFLAKE$SESSION_ATTRIBUTES - 不変のカスタムセッション属性を保存します。属性名は**大文字と小文字を区別**します。

  • その他の文字列(またはNULL) - :doc:`SET </sql-reference/sql/set>`コマンドと同様に、名前空間をセッション変数名のプレフィックスとして扱います。名前空間では**大文字と小文字が区別されます**。

'key'

設定する属性または変数の名前。すべてのキーの名前では、大文字と小文字が区別されます

'value'

割り当てる値。値は、文字列または文字列に評価される式である必要があります。

戻り値

この関数は VARCHAR 値を返します。

  • ``SNOWFLAKE$SESSION_ATTRIBUTES``名前空間の場合:常にNULLを返します(不変の属性は、以前の値を持つことができないため)。属性が現在のセッションですでに設定されている場合、関数は代わりにエラーを発生させます。

  • その他の名前空間の場合:セッション変数の以前の値を返します。変数が以前に存在しなかった場合はNULLを返します。これは:doc:`SET </sql-reference/sql/set>`コマンドの動作と一致します。

アクセス制御の要件

カスタムセッション属性を設定するために、特別な権限は必要ありません。いずれのユーザーも自分のセッションで属性を設定できます。

使用上の注意

SNOWFLAKE$SESSION_ATTRIBUTES名前空間(不変の属性)の場合:

  • 属性は**不変**です。一度属性が設定された場合、(同じ値であっても)再度設定を試行するとエラーになります。

  • 属性名は大文字と小文字を区別します。app_contextApp_Context、および``APP_CONTEXT``は3つの異なる属性として扱われます。

  • 属性は**セッションスコープ**です。これらはセッション中ずっと表示され、他のセッションからは見えません。

  • 属性値を取得するには、SYS_CONTEXT(SNOWFLAKE$SESSION_ATTRIBUTES 名前空間)``SYS_CONTEXT('SNOWFLAKE$SESSION_ATTRIBUTES', '<key>')``を使用します。

その他の名前空間(セッション変数)の場合:

  • 変数名は大文字と小文字を区別します。``user_id``と``USER_ID``は異なる変数として扱われます。

  • 変数は**更新**できます。すでに存在する変数を設定すると、以前の値が返され、新しい値で更新されます。

  • 名前空間(指定されている場合)はプレフィックスとして使用されます。``SET_SYS_CONTEXT('myns', 'mykey', 'val')``は``myns.mykey``という名前の変数を作成します。

  • 変数は、変数を設定する際に使用した大文字小文字を厳密に区別して``SYS_CONTEXT('<namespace>', '<key>')``を使用して取得できます。

一般的なメモ

  • シェルの二重引用符で囲まれた文字列で関数呼び出しを指定する場合は、 $ 文字をバックスラッシュ(\)でエスケープして、 $session_attributes がシェル変数として解釈されないようにします。

例1:不変のセッション属性(SNOWFLAKE$SESSION_ATTRIBUTES名前空間)

アプリケーションコンテキストを追跡するカスタム属性を設定します。

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

属性値を取得します(注:属性名は大文字と小文字を区別します)。

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

属性が設定され、その変更を試行するとエラーになります。

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

属性名は大文字と小文字を区別します。

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

例2:セッション変数(その他の名前空間)

名前空間プレフィックス付きのセッション変数を設定します。

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

変数は、指定されたとおりの大文字小文字で格納されます:myapp.user_id。取得する:

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

変数を更新します(以前の値を返します)。

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