CONNECT (タイプ 2) ステートメント

CONNECT (タイプ 2) ステートメントは、 指定したアプリケーション・サーバーにアプリケーション・プロセスを接続し、 アプリケーション制御の分散作業単位の規則を確立します。 このサーバーは、そのプロセスの現行サーバーになります。

CONNECT (タイプ 1) ステートメントのほとんどの性質は、 CONNECT (タイプ 2) ステートメントにも適用されます。 この項では、それらを繰り返して説明するのではなく、 タイプ 2 のエレメントのうちタイプ 1 とは異なる部分だけを説明します。

呼び出し

対話式 SQL 機能には外見上対話式の実行に見えるインターフェースが用意されている場合がありますが、 このステートメントはアプリケーション・プログラムに組み込むことだけが可能です。 これは、動的に作成できない実行可能ステートメントです。 コマンド行プロセッサーを使用して呼び出した場合は、追加オプションを指定できます。

詳しくは、 コマンド行 SQL ステートメントおよび XQuery ステートメントの使用 を参照してください。

許可

CONNECT 処理は 2 レベルのアクセス制御を経ます。 接続を成功させるには、両方のレベルで条件を満たす必要があります。

アクセス制御の最初のレベルは認証です。ここでは、接続に関連付けられたユーザー ID が、そのサーバーに対してセットアップされている認証メソッドに従って、正常に認証される必要があります。 認証に成功すると、サーバーで有効な認証プラグインにしたがって、接続ユーザー ID からデータベース許可 ID が導出されます。 次にこの データベース許可 ID が、接続のためのアクセス制御の 2 番目のレベルである許可を通過しなければなりません。 そのためには、この許可 ID は以下の権限のうちの少なくとも 1 つを持っている必要があります。
  • CONNECT 権限
  • SECADM 権限
  • DBADM 権限
  • SYSADM 権限
  • SYSCTRL 権限
  • SYSMAINT 権限
  • SYSMON 権限
注: パーティション・データベースの場合、ユーザー定義とグループ定義は、すべてのデータベース・パーティションで同一でなければなりません。

構文

タイプ 1 とタイプ 2 のどちらを選択するかは、プリコンパイラー・オプションによって決められます。 これらのオプションの概要については、 分散リレーショナル・データベースへの接続を参照してください。

Read syntax diagramSkip visual syntax diagramCONNECTTOserver-namehost-variablelock-blockauthorizationRESETauthorization1
authorization
Read syntax diagramSkip visual syntax diagramUSERauthorization-namepasswordsaccesstoken2APIKEYapi-key3
passwords
Read syntax diagramSkip visual syntax diagramUSINGpasswordNEWpasswordCONFIRMpasswordCHANGE PASSWORD
accesstoken
Read syntax diagramSkip visual syntax diagramACCESSTOKENtoken4ACCESSTOKENTYPEtoken-type
lock-block
Read syntax diagramSkip visual syntax diagramIN SHARE MODEIN EXCLUSIVE MODEON SINGLE MEMBER
Notes:
  • 1 This form is only valid if implicit connect is enabled.
  • 2 This feature is available starting from Db2 Version 11.5 Mod Pack 4.
  • 3 This feature is available starting from Db2 Version 11.5 Mod Pack 4.
  • 4 This feature is available starting from Db2 Version 11.5 Mod Pack 4.

説明

TO server-name/host-variable
サーバーの名前のコーディング規則は、タイプ 1 と同じです。

SQLRULES(STD) オプションが有効な場合、server-name は、 アプリケーション・プロセスの既存の接続を指定するものであってはなりません。 そのように指定すると、エラー (SQLSTATE 08002) になります。

SQLRULES(Db2) オプションが有効で、 server-name がアプリケーション・プロセスの既存の接続を指定している場合、 その接続が現行接続になり、古い接続は休止状態になります。 つまり、この状況での CONNECT ステートメントの効果は、 SET CONNECTION ステートメントの効果と同じです。

SQLRULES の指定の詳細に関しては、分散作業単位のセマンティクスを制御するオプションを参照してください。

正常に接続された場合
CONNECT ステートメントが正常に実行された場合、
  • アプリケーション・サーバーとの接続は作成されるか、 または休止でない状態になり、現行接続かつ保留状態になります。
  • CONNECT TO が現行サーバー以外のサーバーに出されると、 現行の接続は休止状態になります。
  • CURRENT SERVER 特殊レジスターと SQLCA は、CONNECT (タイプ 1) の場合と同じ方法で更新されます。
正常に接続されなかった場合
CONNECT ステートメントが正常に実行されなかった場合、
  • エラーの理由に関係なく、 アプリケーション・プロセスの接続状態とその接続の状態は変更されません。
  • 失敗したタイプ 1 の CONNECT の場合と同様に、SQLCA の SQLERRP フィールドは、 エラーを検出したアプリケーション・リクエスターまたはサーバーのモジュール名に設定されます。
CONNECT (オペランドなし)、IN SHARE/EXCLUSIVE MODE、USER、および USING
接続が存在する場合、タイプ 2 はタイプ 1 と同様に動作します。 許可 ID とデータベース別名は、SQLCA の SQLERRMC フィールドに入れられます。 接続が存在しない場合、暗黙接続の試みは行われず、 SQLERRP および SQLERRMC の各フィールドはブランクを戻します。 (アプリケーションでは、これらのフィールドを調べることによって、 現行接続が存在しているか否かの検査を行うことができます。)

USER と USING を含むオペランドのない CONNECT は、DB2DBDFT 環境変数を使用することによって、 アプリケーション・プロセスをデータベースに接続することができます。 この方法は、タイプ 2 の CONNECT RESET に相当しますが、 ユーザー ID とパスワードの使用が可能です。

RESET
デフォルトのデータベースが使用可能な場合、 そのデータベースへの明示接続と同等です。 デフォルトのデータベースが使用できない場合、 アプリケーション・プロセスの接続状態とその接続の状態は変更されません。

デフォルトのデータベースが使用可能か否かは、インストール・オプション、環境変数、 および認証設定値によって決まります。

ルール

  • 分散作業単位のセマンティクスを制御するオプションに概説されているように、接続管理のセマンティクスは、一連の接続オプションによって制御されます。 すべてのプリプロセス済みソース・ファイルには、デフォルト値が割り当てられます。 1 つのアプリケーションが、 異なるさまざまな接続オプションでプリコンパイルされた複数のソース・ファイルで構成されている場合もあります。

    SET CLIENT コマンドまたは API を最初に実行しない限り、 実行時に実行される最初の SQL ステートメントを含むソース・ファイルのプリプロセスに使用された接続オプションが、 有効な接続オプションになります。

    ソース・ファイルの 1 つの CONNECT ステートメントが、異なる接続オプションで次々にプリプロセスされ、 その合間に SET CLIENT コマンドまたは API を実行することなく実行されると、 エラー (SQLSTATE 08001) が戻されます。 SET CLIENT コマンドまたは API を実行すると、 アプリケーション内のすべてのソース・ファイルをプリプロセスするために使用された接続オプションは無視されます。

    このステートメントの セクションの例 1 は、これらの規則を示しています。

  • CONNECT ステートメントを使用して接続を確立したり切り替えたりすることができますが、USER/USING 節を使用した CONNECT は、指定したサーバーとの現行接続や休止接続がない場合にしか受け入れられません。 USER/USING 節によって同じサーバーとの接続を発行するには、その前に接続を解放する必要があります。 そうでない場合、リジェクトされます (SQLSTATE 51022)。 接続を解放するには、DISCONNECT ステートメントまたは RELEASE ステートメントを出し、 次に COMMIT ステートメントを出します。

タイプ 1 とタイプ 2 の CONNECT ステートメントの比較

CONNECT ステートメントのセマンティクスは、CONNECT プリコンパイラー・オプションまたは SET CLIENT API によって決定されます ( 分散作業単位のセマンティクスを制御するオプションを参照してください)。 CONNECT タイプ 1 または CONNECT タイプ 2 は指定することができ、 それらのプログラムの CONNECT ステートメントは、 それぞれタイプ 1 およびタイプ 2 の CONNECT ステートメントと呼ばれます。 それらの意味について、以下の表に説明します。

CONNECTの使用:

タイプ 1 タイプ 2
各作業単位は、1 つのアプリケーション・サーバーに対してのみ接続を確立できます。 各作業単位は、複数のアプリケーション・サーバーとの接続を確立することができます。
他のアプリケーション・サーバーと接続するためには、 その前に、現行の作業単位をコミットまたはロールバックする必要があります。 他のアプリケーション・サーバーと接続する前に、 現行の作業単位をコミットまたはロールバックする必要はありません。
CONNECT ステートメントは、現行接続を確立します。 後続の SQL 要求は、他の CONNECT によって変更されるまで、この接続に送られます。 最初の接続を確立する場合はタイプ 1 の CONNECT と同じです。 休止接続に切り替える際に SQLRULES が STD に設定されている場合には、 SET CONNECTION ステートメントを使用する必要があります。
現行接続への接続が有効であり、現行接続を変更しません。 SQLRULES プリコンパイラー・オプションが 'DB2' に設定されている場合は、タイプ 1 の CONNECT と同じです。 SQLRULES が STD に設定されている場合、SET CONNECTION ステートメントを使用する必要があります。
他のアプリケーション・サーバーに接続すると、現行接続が切断されます。 新しい接続が現行接続になります。 1 つの作業単位で維持される接続は 1 つだけです。 別のアプリケーション・サーバーに接続すると、 現行接続は休止状態 になります。 新しい接続が現行接続になります。 1 つの作業単位で複数の接続を維持できます。

CONNECT が休止接続のアプリケーション・サーバーに対するものである場合、 それが現行接続になります。

CONNECT を使用した休止接続への接続は、 SQLRULES(DB2) が指定されている場合にのみ可能です。 SQLRULES(STD) が指定されている場合は、 SET CONNECTION ステートメントを使用する必要があります。

SET CONNECTION ステートメントはタイプ 1 の接続でサポートされていますが、 有効な接続先は現行接続だけです。 タイプ 2 の接続では、 接続状態を休止から現行に変更する SET CONNECTION ステートメントがサポートされています。

使用 接続 ...ユーザー ...USING:

タイプ 1 タイプ 2
USER と接続しています ...USING 文節は、現行接続を切断し、指定された許可名とパスワードを使用して新規接続を確立します。 USER/USING 節を使用した接続は、 指定したその同じサーバーに対する現行接続も休止接続もない場合にのみ、 受け入れられます。

暗黙の CONNECT、CONNECT RESET の使用、 および切断

タイプ 1 タイプ 2
CONNECT RESET を使用して、現行接続を切断することができます。 CONNECT RESET は、デフォルトのアプリケーション・サーバーがシステムに定義されている場合、 それに対する明示的接続に相当します。

接続は、COMMIT の正常実行時にアプリケーションによって切断できます。 コミットの前には、RELEASE ステートメントを使用して、接続を解放ペンディングにします。 このような接続はすべて、その次の COMMIT 時に切断されます。

あるいは RELEASE ステートメントの代わりに、 プリコンパイラー・オプションの DISCONNECT(EXPLICIT)、DISCONNECT(CONDITIONAL)、 DISCONNECT(AUTOMATIC)、 または DISCONNECT の各ステートメントを使用することができます。

CONNECT RESET を使用して現行接続を切断した場合、 その次の SQL ステートメントが CONNECT ステートメントでなく、 デフォルトのアプリケーション・サーバーがシステムに定義されていれば、 それに対する暗黙接続が行われます。 デフォルトのアプリケーション・サーバーがシステムに定義されている場合、 CONNECT RESET はそれに対する明示接続に相当します。
連続して CONNECT RESET を出すと、エラーになります。 連続する CONNECT RESET を発行してエラーになるのは、 SQLRULES(STD) が指定されている場合だけです。 このオプションを指定すると既存の接続に対して CONNECT を使用できなくなります。
CONNECT RESET は、現行の作業単位を暗黙的にコミットします。 CONNECT RESET では、現行の作業単位のロールバックが暗黙のうちに行われます。
何らかの理由で既存の接続がシステムによって切断された場合、 このデータベースに対して CONNECT 以外の SQL ステートメントを連続して出すと、 08003 という SQLSTATE を受け取ることになります。 既存の接続がシステムによって切断された場合でも、COMMIT、ROLLBACK、 および SET CONNECTION の各ステートメントを使用することができます。
アプリケーション・プロセスが正常に終了した時点で、作業単位が暗黙のうちにコミットされます。 タイプ 1 と同じ。
アプリケーション・プロセスが終了すると、すべての接続 (1 つだけ) が切断されます。 アプリケーション・プロセスが終了すると、 すべての接続 (現行、休止、および解放ペンディングのもの) が切断されます。

CONNECT のエラー

タイプ 1 タイプ 2
ローカル・ディレクトリーにサーバー名が定義されていないというエラー以外で CONNECT がエラーになった場合、 現行接続があるかどうかに関係なく、アプリケーション・プロセスは未接続状態になります。 それ以降の CONNECT 以外のステートメントは、08003 の SQLSTATE を受け取ることになります。 CONNECT がエラーになったときに現行接続があっても、その現行接続は影響を受けません。

CONNECT がエラーになったときに、現行接続がなかった場合、 プログラムは未接続状態になります。 それ以降の CONNECT 以外のステートメントは、08003 の SQLSTATE を受け取ることになります。

  • 暗黙接続は、タイプ 2 の接続を行うアプリケーションの最初の SQL ステートメントでサポートされます。 SQL ステートメントをデフォルトのデータベースに対して実行するには、 まず CONNECT RESET ステートメントまたは CONNECT USER/USING ステートメントを使用して、 接続を確立する必要があります。 オペランドのない CONNECT ステートメントでは、 現行接続があればそれに関する情報が表示されますが、 現行接続がない場合にはデフォルトのデータベースには接続しません。
  • authorization-name SYSTEM を CONNECT ステートメントで明示的に指定することはできません。 ただし、Windows オペレーティング・システムでは、ローカル・システム・アカウントの下で実行されているローカル・アプリケーションは、暗黙的にデータベースに接続して、ユーザー ID が SYSTEM になるようにすることができます。
  • Windows Server に明示的に接続する場合、 authorization-name またはユーザー host-variable は、 Microsoft Windows Security Account Manager (SAM) 互換を使用して指定できます。 名前。
  • 接続の終了: 接続の終了時に、まだトランザクションがコミットまたはロールバックされていない場合、このようなトランザクションがどうなるかについて詳しくは、『暗黙の CONNECT、CONNECT RESET の使用、および切断』セクションを参照してください。 動作を確実に整合させるには、COMMIT ステートメントまたは ROLLBACK ステートメントを、CONNECT ステートメントの動作に従属させずに明示的にコード化します。
  • 代替構文: 以前のバージョンの Db2® および他のデータベース製品との互換性のために、以下がサポートされています。 これらの代替は非標準であり、使用すべきではありません。
    • DB2_ENFORCE_MEMBER_SYNTAX レジストリー変数が ON に設定されている場合を除き、DBPARTITIONNUM または NODE を MEMBER の代わりに指定できます。

  • 例 1: この例では、複数のソース・プログラム (枠で囲んでいるもの) の使用法を示します。 いくつかは異なる接続オプション (コードの上のステートメント内に示しているもの) を指定してプリプロセスされ、 そのうち 1 つは SET CLIENT API 呼び出しを含んでいます。
    PGM1: CONNECT(2) SQLRULES(DB2) DISCONNECT(CONDITIONAL)
       ...
       exec sql CONNECT TO OTTAWA;
       exec sql SELECT col1 INTO :hv1
       FROM tbl1;
       ...
    PGM2: CONNECT(2) SQLRULES(STD) DISCONNECT(AUTOMATIC)
       ...
       exec sql CONNECT TO QUEBEC;
       exec sql SELECT col1 INTO :hv1
       FROM tbl2;
       ...
    PGM3: CONNECT(2) SQLRULES(STD) DISCONNECT(EXPLICIT)
       ...
       SET CLIENT CONNECT 2  SQLRULES DB2  DISCONNECT EXPLICIT 1
       exec sql CONNECT TO LONDON;
       exec sql SELECT col1 INTO :hv1 
       FROM tbl3;
       ...
    注:
    1. SET CLIENT API の実際の構文ではありません。
    PGM4: CONNECT(2) SQLRULES(DB2) DISCONNECT(CONDITIONAL)
       ...
       exec sql CONNECT TO REGINA;
       exec sql SELECT col1 INTO :hv1 
       FROM tbl4;
       ...
    アプリケーションが PGM1 に続いて PGM2 を実行すると、次のようになります。
    • OTTAWA への接続が実行されます。 connect=2、 sqlrules=DB2、 disconnect=CONDITIONAL
    • QUEBEC への接続はエラー (SQLSTATE 08001) になります。 これは、SQLRULES と DISCONNECT が共に異なっているためです。
    アプリケーションが PGM1 に続いて PGM3 を実行すると、次のようになります。
    • OTTAWA への接続が実行されます。 connect=2、 sqlrules=DB2、 disconnect=CONDITIONAL
    • LONDON への接続が実行されます。 connect=2、 sqlrules=DB2、 disconnect=EXPLICIT
    2 番目の CONNECT ステートメントの前に SET CLIENT API が実行されるため、問題ありません。
    アプリケーションが PGM1 に続いて PGM4 を実行すると、次のようになります。
    • OTTAWA への接続が実行されます。 connect=2、 sqlrules=DB2、 disconnect=CONDITIONAL
    • REGINA への接続が実行されます。 connect=2 sqlrules=DB2、 disconnect=CONDITIONAL
    これは、PGM1 のプリプロセッサー・オプションが PGM4 と同じなので、問題ありません。
  • 例 2: この例では、CONNECT (タイプ 2)、SET CONNECTION、RELEASE、 および DISCONNECT の各ステートメントの相互関係を示します。 S0、S1、S2、および S3 は 4 つのサーバーを示します。
    シーケンス ステートメント 現行サーバー 休止接続 解放ペンディング
    0
    • ステートメントはない
    • なし
    • なし
    • なし
    1
    • SELECT * FROM TBLA
    • S0 (デフォルト値)
    • なし
    • なし
    2
    • CONNECT TO S1
    • SELECT * FROM TBLB
    • S1
    • S1
    • S0
    • S0
    • なし
    • なし
    3
    • CONNECT TO S2
    • UPDATE TBLC SET ...
    • S2
    • S2
    • S0, S1
    • S0, S1
    • なし
    • なし
    4
    • CONNECT TO S3
    • SELECT * FROM TBLD
    • S3
    • S3
    • S0, S1, S2
    • S0, S1, S2
    • なし
    • なし
    5
    • SET CONNECTION S2
    • S2
    • S0, S1, S3
    • なし
    6
    • RELEASE S3
    • S2
    • S0, S1
    • S3
    7
    • COMMIT
    • S2
    • S0, S1
    • なし
    8
    • SELECT * FROM TBLE
    • S2
    • S0, S1
    • なし
    9
    • DISCONNECT S1
    • SELECT * FROM TBLF
    • S2
    • S2
    • S0
    • S0
    • なし
    • なし
  • 例 3: JWT アクセス・トークンを使用して SAMPLE データベースに接続します。
    connect to sample accesstoken <access_token> accesstokentype jwt
    
       Database Connection Information
    
     Database server        = DB2/LINUXX8664 11.5.4.0
     SQL authorization ID   = NEWTON
     Local database alias   = SAMPLE