CONNECT (タイプ 1) ステートメント
CONNECT (タイプ 1) ステートメントは、リモート作業単位の規則に従って、 指定したアプリケーション・サーバーにアプリケーション・プロセスを接続します。
1 つのアプリケーション・プロセスは、 一時点で 1 つのアプリケーション・サーバーにのみ接続できます。 これは、現行サーバー と呼ばれます。 デフォルトのアプリケーション・サーバーは、 アプリケーション・リクエスターの初期設定時に確立されます。 暗黙接続が使用可能な場合にアプリケーション・プロセスが開始されると、 暗黙でデフォルトのアプリケーション・プロセスに接続されます。 そのアプリケーション・プロセスで CONNECT ステートメントを使用することによって、 それとは別のアプリケーション・サーバーに明示的に接続することもできます。接続は、CONNECT RESET ステートメント、または DISCONNECT が出されるまで、 あるいは別の CONNECT ステートメントによってアプリケーション・サーバーが変更されるまで継続します。
呼び出し
対話式 SQL 機能には外見上対話式の実行に見えるインターフェースが用意されている場合がありますが、 このステートメントはアプリケーション・プログラムに組み込むことだけが可能です。 これは、動的に作成できない実行可能ステートメントです。 コマンド行プロセッサーを使用して呼び出した場合は、追加オプションを指定できます。
詳しくは、コマンド行 SQL ステートメントおよび XQuery ステートメントの使用を参照してください。
許可
CONNECT 処理は 2 レベルのアクセス制御を経ます。接続が成功するには、両方のレベルが満足されなければなりません。
- CONNECT 権限
- SECADM 権限
- DBADM 権限
- SYSADM 権限
- SYSCTRL 権限
- SYSMAINT 権限
- SYSMON 権限
構文
説明
- CONNECT (オペランドなし)
- 現行サーバーに関する情報を戻します。
この情報は、「正常に接続された場合」の項に説明されているとおり、SQLCA の SQLERRP フィールドに戻されます。
接続状態が存在する場合、 許可 ID とデータベース別名が、SQLCA の SQLERRMC フィールドに入れられます。 許可 ID が 8 バイトを超える場合、これは 8 バイトに切り捨てられ、 SQLCA の SQLWARN0 および SQLWARN1 フィールドにそれぞれ W と A のフラグが付きます。
接続が存在せず、暗黙接続が可能な場合は、暗黙接続が試みられます。 暗黙接続が使用可能でない場合、この試みはエラーになります (既存の接続がない)。 接続がない場合、SQLERRMC フィールドはブランクになります。
アプリケーション・サーバーのテリトリー・コードとコード・ページは、 SQLERRMC フィールドに入れられます (正常に実行される CONNECT ステートメントの場合と同じ)。
この形式の CONNECT を使用する場合、- アプリケーション・プロセスが接続可能状態である必要はありません。
- 接続されている場合、接続状態は変わりません。
- 接続されておらず、暗黙接続が使用可能な場合は、 デフォルトのアプリケーション・サーバーとの接続が行われます。 この場合、正常に実行される CONNECT ステートメントの場合と同様に、 アプリケーション・サーバーの国または地域別コードとコード・ページが、SQLERRMC フィールドに入れられます。
- 未接続で暗黙的接続が不能な場合、アプリケーション・プロセスは未接続のままになります。
- カーソルをクローズしません。
- TO server-nameまたはhost-variable
- server-name (サーバー名) またはそのサーバー名を含む host-variable (ホスト変数) を指定することによって、
アプリケーション・サーバーを指定します。
host-variable (ホスト変数) を指定する場合、 それは、長さ属性が 8 以下の文字ストリング変数でなければならず、 標識変数を含めることはできません。 その host-variable に入る server-name は、左揃えにする必要があり、引用符で区切ることはできません。
server-name は、 アプリケーション・サーバーを指定するデータベース別名である点に注意してください。 この名前は、アプリケーション・リクエスターの ローカル・ディレクトリーにリストされている必要があります。
CONNECT ステートメントが実行される時点で、 アプリケーション・プロセスは接続可能状態でなければなりません。
- 正常に接続された場合
- CONNECT ステートメントが正常に実行された場合、
- オープンされていたカーソルはすべてクローズされ、 準備済みのステートメントはすべて破棄されて、 以前のアプリケーション・サーバーからのすべてのロックが解放されます。
- アプリケーション・プロセスはそれ以前のアプリケーション・サーバー (ある場合) から切断され、 指定されたアプリケーション・サーバーに接続されます。
- そのアプリケーション・サーバーの実際の名前 (別名ではなく) が CURRENT SERVER 特殊レジスターに入れられます。
- アプリケーション・サーバーに関する情報が、SQLCA の SQLERRP フィールドに入れられます。 アプリケーション・サーバーが IBM® 製品の場合、情報の形式は pppvvrrm になります。
- SQLCA の SQLERRMC フィールドは、次の値を含む (X'FF' で区切って) ように設定されます。
- アプリケーション・サーバーの国または地域のコード。
- アプリケーション・サーバーのコード・ページ。
- 許可 ID (最初の 8 バイトまで)。
- データベース別名。
- アプリケーション・サーバーのプラットフォーム・タイプ。
- エージェント ID。 これは、アプリケーションに代わってデータベース・マネージャー内で実行されるエージェントを指定します。 このフィールドは、データベース・モニターによって戻される agent_id エレメントと同じです。
- エージェント索引。 これは、エージェントの索引を識別し、サービスに使用されます。
- トークン 10 で示されるように、サーバー・インスタンスがパーティション環境で作動する場合、このトークンはメンバー番号を表します。
- アプリケーション・クライアントのコード・ページ。
- この値がゼロ以外で、SQLWARN0 と SQLWARN4 のいずれも設定されていない場合、これはパーティション環境におけるメンバー数を表します。
- SQLCA の SQLERRD(1) フィールドは、 アプリケーション・コード・ページからデータベース・コード・ページへの変換が行われる際に見込まれる 混合文字データ (CHAR データ・タイプ) の長さの最大差を示します。 0 または 1 の値は、長さが変わらないことを示し、1 より大きい値は長さが長くなることを、 負の値は切り捨てが生じることを示します。
- SQLCA の SQLERRD(2) フィールドは、 データベース・コード・ページからアプリケーション・コード・ページへの変換が行われる際に見込まれる 混合文字データ (CHAR データ・タイプ) の長さの最大差を示します。 0 または 1 の値は、長さが変わらないことを示し、1 より大きい値は長さが長くなることを、 負の値は切り捨てが生じることを示します。
- SQLCA の SQLERRD(3) フィールドは、
接続されているデータベースが更新可能か否かを示します。
データベースは、最初は更新可能ですが、
その許可 ID で更新を実行できないことが作業単位で明らかになると、
読み取り専用に変更されます。
この値は、次のいずれかです。
- 1 - 更新可能
- 2 - 読み取り専用
- SQLCA の SQLERRD(4) フィールドは、接続の特定の特性を戻します。
この値は、次のいずれかです。
- 0
- なし (1 フェーズ・コミットで更新元でもあり、ただし最新レベルにないクライアントから実行している場合にのみ可能)。
- 1
- 1 フェーズ・コミット。
- 2
- 1 フェーズ・コミット。 読み取り専用 (TP モニター環境にある DRDA1 データベースとの接続にのみ適用可能)。
- 3
- 2 フェーズ・コミット。
- SQLCA の SQLERRD(5) フィールドは、接続のための認証タイプを戻します。
この値は、次のいずれかです。
- 0
- サーバーで認証された。
- 1
- クライアントで認証された。
- 4
- 暗号化を伴ってサーバーで認証された。
- 7
- 外部 Kerberos セキュリティー機構を使用して認証された。
- 9
- 外部 GSS API プラグイン・セキュリティー機構を使用して認証された。
- 11
- 暗号化されたデータを受け入れるサーバーで認証された。
- 255
- 認証は指定されません。
- SQLCA の SQLERRD(6) フィールドは、パーティション・データベース環境にある場合に、 接続されたデータベース・パーティションのデータベース・パーティション番号を戻します。 区分化されていない場合、値 0 が戻されます。
- 正常に行われた接続の許可 ID の長さが 8 バイトを超える場合には、SQLCA の SQLWARN1 フィールドは A に設定されます。 これは、切り捨てが発生したことを示します。 SQLCA にある SQLWARN0 フィールドは、W に設定されて警告を示します。
- 正常に接続されなかった場合
- CONNECT ステートメントが正常に実行されなかった場合、
- SQLCA の SQLERRP フィールドは、 エラーを検出したアプリケーション・リクエスターのモジュール名に設定されます。 モジュール名の最初の 3 文字は、製品を識別します。
- アプリケーション・プロセスが接続可能状態でないために CONNECT ステートメントがエラーになった場合、 アプリケーション・プロセスの接続状態は変更されません。
- server-name がローカル・ディレクトリーのリストにないために CONNECT ステートメントがエラーになった場合は、
エラー・メッセージ (SQLSTATE 08001) が出され、
アプリケーション・プロセスの接続状態は変更されません。
- アプリケーション・リクエスターがアプリケーション・サーバーに接続されなかった場合、 アプリケーション・プロセスは接続されないままです。
- アプリケーション・リクエスターがアプリケーション・サーバーに既に接続されていた場合、 アプリケーション・プロセスはそのアプリケーション・サーバーに接続されたままです。 それ以降のステートメントは、そのアプリケーション・サーバーで実行されます。
- その他の理由で CONNECT ステートメントがエラーになる場合、 アプリケーション・プロセスは接続されていない状態になります。
- IN SHARE MODE
- データベースへの他の同時接続を可能にし、 他のユーザーがデータベースに排他モードで接続しないようにします。
- IN EXCLUSIVE MODE
- 排他ロックを保持するユーザーと同じ許可 ID を持つ場合を除き、
複数の並行アプリケーション・プロセスがアプリケーション・サーバーで何らかの操作を実行するのを防止します。
- ON SINGLE MEMBER
- コーディネーターの メンバー を排他モードで接続し、 その他のすべての メンバー を共有モードで接続することを指定します。
- RESET
- アプリケーション・プロセスを現行サーバーから切断します。 コミット操作が行われます。 暗黙接続が使用可能な場合、 アプリケーション・プロセスは SQL ステートメントが発行されるまで未接続のままになります。
- USER authorization-name/host-variable
- アプリケーション・サーバーに接続するユーザー ID を指定します。 host-variable (ホスト変数) を指定する場合、それは、標識変数を含まない文字ストリング変数でなければなりません。 host-variable に入るユーザー ID は、左揃えにする必要があり、引用符で区切ることはできません。
- USING password/host-variable
- アプリケーション・サーバーに接続しようとするユーザー ID のパスワードを識別します。 パスワードの最大長は、接続先のデータ・サーバーによって決まります。 ホスト変数を指定する場合は、文字ストリング変数でなければならず、 標識変数を含めることはできません。
- NEW password/host-variable CONFIRM password
- USER オプションによって識別されるユーザー ID に割り当てられる新規パスワードを識別します。 パスワードの最大長は、接続先のデータ・サーバーによって決まります。 ホスト変数を指定する場合は、文字ストリング変数でなければならず、 標識変数を含めることはできません。パスワードが変更されるシステムは、ユーザー認証がセットアップされた方法によって異なります。 Linux 上のパスワードの変更をサポートするためには、セキュリティー・プラグインの IBMOSchgpwdclient および IBMOSchgpwdserver を使用するようにデータベース・インスタンスを構成する必要があります。
注
- アプリケーション・プロセスによって実行される最初の SQL ステートメントを CONNECT ステートメントにすることは望ましいことです。
- 異なるユーザー ID およびパスワードを用いて CONNECT ステートメントを現行のアプリケーション・サーバーに出すと、 会話が割り振り解除され、割り振りし直されます。 すべてのカーソルは、 データベース・マネージャーによってクローズされます (WITH HOLD オプションが使用された場合は、 カーソル位置は失われます)。
- 同じユーザー ID およびパスワードを用いて、 CONNECT ステートメントが現行のアプリケーション・サーバーに出された場合、 会話の割り振り解除および再割り振りは行われません。 この場合、カーソルはクローズされません。
- 複数パーティションのパーティション・データベース環境を使用するには、 ユーザーまたはアプリケーションは db2nodes.cfg ファイルにリストされたデータベース・パーティションのいずれかに接続する必要があります。 コーディネーターのパーティションと同じデータベース・パーティションをすべてのユーザーが使用しないようにする必要があります。
- authorization-name SYSTEM を CONNECT ステートメント内で明示的に指定することはできません。 ただし、Windows オペレーティング・システムでは、 ローカル・システム・アカウントの下で稼働しているローカル・アプリケーションは暗黙的にデータベースに接続することができ、その場合、ユーザー ID が SYSTEM になります。
- Windows Server に明示的に接続するときは、 Microsoft Windows Security Account Manager (SAM) 互換名を使用して、authorization-name またはユーザーの host-variable を指定することができます。
- データベースが明示的にアクティブ化されていない場合データベースはアクセス不能になっている可能性があり、クライアント・アプリケーションは頻繁に再接続を試みる、つまり、DEACTIVATE DATABASE と ACTIVATE DATABASE コマンドを発行する時間間隔が非常に短いということになります。ACTIVATE DATABASE コマンドを発行してデータベースをアクティブ化してからデータベースに接続するようにしてください。
例
- 例 1: C プログラムで、データベース別名 TOROLAB、
ユーザー ID FERMAT、およびパスワード THEOREM を使用して、
アプリケーション・サーバー TOROLAB に接続します。
EXEC SQL CONNECT TO TOROLAB USER FERMAT USING THEOREM; - 例 2:
C プログラムで、
データベース別名がホスト変数 APP_SERVER (varchar(8)) に入っているアプリケーション・サーバーに接続します。正常に接続された後、アプリケーション・サーバーの 3 文字の製品 ID を、
変数 PRODUCT (char(3)) にコピーします。
EXEC SQL CONNECT TO :APP_SERVER; if (strncmp(SQLSTATE,'00000',5)) strncpy(PRODUCT,sqlca.sqlerrp,3);
