SET SESSION AUTHORIZATION ステートメント
SET SESSION AUTHORIZATION ステートメントは、SESSION_USER 特殊レジスターの値を変更します。
このステートメントは、トランザクションの制御下にはありません。 SET SESSION AUTHORIZATION ステートメントは、 同一の接続に複数の異なる許可 ID を想定する単一ユーザーをサポートすることを目的としているため、 複数の異なるユーザーが同じ接続を再利用するシナリオ (一般に、 接続プールと呼ばれる) には使用しないでください。
呼び出し
このステートメントはアプリケーション・プログラムに組み込むことができ、また対話式に出すことができます。 このステートメントは、動的に作成できる実行可能ステートメントです。
許可
このステートメントの許可 ID が持つ特権には、特殊レジスターの設定先の許可 ID 値に対する SETSESSIONUSER が含まれている必要があります。
構文
説明
- SESSION_USER 特殊レジスターに新しい値として使用する許可 ID。
- ユーザー
- USER 特殊レジスターの値。
- CURRENT_USER
- CURRENT USER 特殊レジスターの値。
- SYSTEM_USER
- SYSTEM_USER 特殊レジスターの値。 ホスト変数 (host-variable)
- タイプ CHAR または VARCHAR の変数です。 host-variable の内容の長さは、128 バイトを超えてはなりません (SQLSTATE 28000)。 NULL に設定することはできません。 host-variable が標識変数を伴っている場合、
その標識変数の値は NULL 値以外でなければなりません (SQLSTATE 28000)。
host-variable の文字は左寄せでなければなりません。 ホスト変数で authorization-name を指定する場合は、大文字への変換が行われないため、すべての文字を大文字で指定する必要があります。
ストリング定数 - 128 バイトの最大長を超えない文字ストリング定数。
- ALLOW ADMINISTRATION
- 同じ作業単位内でこのステートメントよりも前に SQL スキーマ・ステートメントを指定できることを示します。
ルール
- SESSION_USER 特殊レジスターで指定される値は、 タイプ USER の許可 ID の規則に従わなければなりません (SQLSTATE 42602)。
- OWNER BIND オプションは、静的 SQL ステートメントに使用される許可 ID を指定します。
- このステートメントは、開かれている WITH HOLD カーソルがない、 新しい作業単位の最初のステートメント (SET 特殊レジスター・ステートメントを除く) として発行します (SQLSTATE 25001)。 この制限には、SET 特殊レジスター・ステートメント以外のステートメントに対するすべての PREPARE 要求も含まれます。
- SESSION_USER 特殊レジスターの値は、 DYNAMICRULES(RUN) BIND オプションでバインドされたパッケージのすべての動的 SQL ステートメントに対する許可 ID として使用されます (これには、 パッケージがルーチンで使用されていない場合の INVOKERUN および DEFINERUN も含まれます)。 パッケージが DYNAMICRULES オプションに基づいて所有者、起動側、 または定義元の許可に使用される場合、このステートメントは、パッケージ内から発行される動的 SQL ステートメントに対して効果がありません。
注
- SET SESSION AUTHORIZATION ステートメントを使用して、セッション許可 ID を変更することができます。 セッション許可 ID とは、接続の現在のユーザーを表すもので、DYNAMICRULES 実行パッケージ内の動的 SQL に比較してすべての許可検査を行うときにデータベース・マネージャーが考慮に入れる許可 ID です。 SESSION_USER 特殊レジスターは、このセッション許可 ID の現行値を表示するのに使用できます。
- 新しい接続における SESSION_USER 特殊レジスターの初期値は、 SYSTEM_USER 特殊レジスターの値と同じです。
- このステートメントで指定されているセッション許可 ID のグループ情報は、 ステートメントの実行時に獲得されます。
- SESSION_USER 特殊レジスターの設定は、 CURRENT SCHEMA または CURRENT PATH 特殊レジスターには影響を与えません。
- SESSION_USER 特殊レジスターの設定中にエラーが発生した場合、レジスターは直前の値に復帰します。
- このステートメントを使用して、複数の異なるユーザーが同一の接続を再利用できるようにしないでください。元の接続所有者がもっていた SESSION_USER 特殊レジスター値を変更する能力が、各ユーザーに継承されてしまうからです。 このステートメントは、特権のチェックを SYSTEM_USER の値に依存しており、
最初の接続許可 ID は SET SESSION AUTHORIZATION ステートメントによって変更されません。 さらに、このステートメントでは、接続の再利用に影響を与える以下の振る舞いに対処できません。
- CONNECT 特権には、新しい許可 ID のチェックが行われません。
- 更新可能特殊レジスターの内容がリセットされません。 特に、ENCRYPTION PASSWORD 特殊レジスターの内容が変更されず、 新しい許可 ID で暗号化または暗号化解除できてしまいます。
- 宣言済みグローバル一時表の内容が影響を受けず、 新しい許可 ID からアクセスできてしまいます。
- リモート・サーバーへの既存のリンクがリセットされません。
- ALLOW ADMINISTRATION 節が指定される場合、
以下のタイプのステートメントまたは操作を SET SESSION AUTHORIZATION ステートメントよりも先行させることができます。
- データ定義言語 (DDL)。 これにはセーブポイントの定義やグローバル一時表の宣言が含まれますが、SET INTEGRITY は含まれません。
- GRANT および REVOKE ステートメント
- LOCK TABLE ステートメント
- COMMIT および ROLLBACK ステートメント
- 特殊レジスターの SET
- グローバル変数の SET
例
- 例 1:
以下のステートメントは、SESSION_USER 特殊レジスターを設定します。
SET SESSION_USER = RAJIV
- 例 2: セッション許可 ID (SESSION_USER 特殊レジスター) を、
ステートメント発行元の接続を確立する際に使用されたシステム許可 ID の値にします。
SET SESSION AUTHORIZATION SYSTEM_USER