メインコンテンツまでスキップ
翻訳ページ

このページは AI の支援を受けて英語から翻訳されています。内容が異なる場合は英語版が正となります。

SET

セッション変数を割り当てるか、現在のセッションのランタイム設定を構成します。StackQL v1.0 以降で利用できます。

関連項目:
[UNSET] [ セッション変数 ] [ プロバイダーセッション ] [IDENTIFIER]


構文​

setStatement::=

SETSESSIONsetExpression','setExpression';'

setExpression::=

variableNameconfigurationPath'='literalDEFAULTvariableReference

 
 

SET [ SESSION ] <target> = { <literal> | DEFAULT | <reference> } [, <target> = { <literal> | DEFAULT | <reference> } ...];

target
プレーンな識別子(region)、二重引用符で囲んだ名前("providers.saved")、または二重引用符で囲み、ドル記号を接頭辞に持つ設定パス("$.auth.aws.password")のいずれかです。

literal
文字列、数値、ブール値、または null です。文字列は単一引用符で囲みます。配列とオブジェクトはスカラー値ではありません。JSON ドキュメントは文字列として保持してください。

DEFAULT
ターゲットをリセットします。UNSET と同等です。明示的な null は保存される値であり、リセットではありません。

reference
既存の変数への、二重引用符で囲んだ "$name" 形式の参照です。たとえば SET "$.providers.production" = "$providers.saved"; のように指定します。

SESSION
省略可能で、StackQL が持つ唯一のスコープです。SET SESSION name = ... と SET name = ... は同じ文です。すべての割り当ては現在のセッションに属し、それ以外には属しません。このキーワードは、SET SESSION と SET GLOBAL が異なるデータベースと同じようにスクリプトを読めるようにするために存在します。SET GLOBAL は解析されますが、セッション間で共有される状態がないため、configuration scope "global" is not supported; use SESSION というエラーで拒否されます。

1 つの SET リスト内の割り当ては順番に適用され、トランザクションではありません。リスト内の 2 番目の割り当てが失敗しても、1 番目の割り当ては有効なままです。

ターゲット​

ターゲット効果
name または "name"スカラーのセッション変数を保存します。この変数は、後続の文で $name として参照します。ドットだけでは設定は選択されません。"providers.saved" は providers.saved という名前の変数です。古い "variables.name" という表記は name のエイリアスです。
"$.auth.<provider>.<field>"このセッションについて、プロバイダーの認証コンテキストのフィールドを 1 つ設定します。フィールドは、そのプロバイダーの --auth オブジェクトのキーです(たとえば credentialsenvvar、password、token_url)。
"$.providers.<alias>"独自の認証情報、テナンシーラベル、パラメーターのデフォルト値、チューニング設定を持つプロバイダーエイリアスをバインドします。値は文字列に格納した JSON ドキュメントです。プロバイダーセッションを参照してください。
"$.secrets.<name>"セッションのシークレットストアにシークレットを保存します。値はリテラル文字列で、通常は JSON の auth ドキュメントです。プロバイダーエイリアスからは auth_secret として参照します。
"$.secret_store"永続的な OS のシークレットストア({"backend":"os","namespace":"..."})を選択します。運用者が設定するフラグ --allow-persistent-secrets が必要です。

どの形式も現在のセッションにのみ影響します。srv サーバーへの独立した接続は、互いの割り当てを参照できません。また、MCP リクエストはそれぞれが独立したセッションです。そのため、MCP サーバーを使用する場合は、1 つの文のバッチで設定とクエリを行ってください。


例​

セッション変数を設定する​

各文は、指定した名前で 1 つのスカラーを保存し、値はその型を保持します。region は文字列、minimum_count は整数、enabled はブール値です。null は値として保存されるため、後で $optional_value は未定義として失敗するのではなく、SQL の NULL に解決されます。最後の文は、1 つのリストで 2 つの変数を割り当てます。

SET region = 'ap-southeast-2';
SET minimum_count = 3;
SET enabled = true;
SET optional_value = null;
SET suffix = 'East', some_id = 42;

セッションスコープを明示する​

最初の 2 つの文は同一です。SESSION は存在する唯一のスコープを指定するもので、どちらの割り当ても、変数が解除されるかセッションが終了するまで有効です。セッション設定とグローバル設定を区別するデータベースと同じようにスクリプトを読めるようにしたい場合に、このキーワードを使用します。コメントアウトされた文は比較のために示しています。この文は何も割り当てず、セッション間で共有される状態がないため、configuration scope "global" is not supported; use SESSION というエラーで失敗します。

SET region = 'ap-southeast-2';
SET SESSION region = 'ap-southeast-2';

/*
SET GLOBAL region = 'ap-southeast-2';
-- FAILS with configuration scope "global" is not supported; use SESSION
*/

クエリで変数を使用する​

任意の式の位置で、引用符を付けずに $name で変数を参照します。値はその型を保持します。文字列は SQL リテラルとしてエスケープされ、数値、ブール値、null はそのまま渡されます。WHERE 句の変数はリクエストの計画が作成される前に解決されるため、リテラルと同様にプロバイダーにプッシュされます。

SET project = 'stackql-demo';
SET zone = 'australia-southeast1-a';

SELECT name, status FROM google.compute.instances
WHERE project = $project AND zone = $zone;

変数をリセットする​

DEFAULT は UNSET とまったく同じように変数を削除します。そのため、再び設定されるまで、後続の $region は variable "$region" is not defined というエラーで失敗します。コメントアウトされたクエリはその失敗を示しています。これは null を割り当てる場合とは異なります。その場合、変数は NULL 値を持ったまま残ります。

SET region = 'ap-southeast-2';
SET region = DEFAULT;

/*
SELECT name FROM aws.s3.buckets WHERE region = $region;
-- FAILS with variable "$region" is not defined
*/

別の変数から値をコピーする​

右辺には、既存の変数への二重引用符で囲んだ参照を指定できます。この場合、その時点で変数が保持している値がコピーされます。ここでは、まずプロバイダーのバインディングを providers.saved という名前の通常の変数として保存し(ドットがあっても設定にはなりません)、次にそれを $.providers.production パスにコピーして有効にします。その後で保存したコピーを削除しても、有効なバインディングには影響しません。

SET "providers.saved" = '{"provider":"aws","tenancy":"production-account","auth":{"type":"aws_signing_v4","access_key_id_env_var":"PRODUCTION_AWS_ACCESS_KEY_ID","secret_access_key_env_var":"PRODUCTION_AWS_SECRET_ACCESS_KEY"}}';
SET "$.providers.production" = "$providers.saved";
UNSET "providers.saved";

このセッションで認証情報フィールドを上書きする​

プロバイダーの認証コンテキストは、起動時に --auth で渡されるオブジェクトです。$.auth の下のパスは、セッションの残りの期間、そのオブジェクトのフィールドを 1 つ置き換え、他のフィールドはそのまま残します。ここでは、GitHub プロバイダーが、読み取り専用のトークンを保持する別の環境変数を参照するように設定します。この変数は StackQL プロセスの環境から読み取られます。フィールドが解除されるかセッションが終了するまで、以降の github.* に対するクエリではこの変数が使用されます。

SET "$.auth.github.credentialsenvvar" = 'GITHUB_TOKEN_READONLY';

プロバイダーエイリアスをバインドする​

プロバイダーエイリアスは、独立して構成されたプロバイダーの 2 つ目のインスタンスで、クエリではプロバイダー名の代わりに使用します。値は文字列に格納した JSON ドキュメントです。provider は基になるプロバイダーを指定し、tenancy はアカウントのラベルを指定します。auth は --auth と同じ形の認証情報ブロックで、params は region などのリクエストパラメーターのデフォルト値を指定します。その後、production.s3.buckets に対するクエリはその認証情報で実行され、aws.s3.buckets は起動時の構成を維持します。キーの完全な一覧はプロバイダーセッションにあります。

SET "$.providers.production" = '{
"provider": "aws",
"tenancy": "production-account",
"auth": {
"type": "aws_signing_v4",
"access_key_id_env_var": "PRODUCTION_AWS_ACCESS_KEY_ID",
"secret_access_key_env_var": "PRODUCTION_AWS_SECRET_ACCESS_KEY"
},
"params": {"region": "ap-southeast-2"}
}';

SELECT name FROM production.s3.buckets;