CONNECT(2 类)语句

CONNECT (Type 2) 语句将应用程序进程连接到标识的应用程序服务器,并建立面向应用程序的分布式工作单元的规则。 然后,此服务器是进程的当前服务器。

CONNECT (Type 1) 语句的大多数方面也适用于 CONNECT (Type 2) 语句。 本部分仅描述类型 2 与类型 1 不同的那些元素,而不是在此处重复该材料。

调用

尽管交互式 SQL 工具提供的界面可以呈现交互式执行的外观,但该语句只能嵌入在应用程序中。 这是一个无法动态准备的可执行语句。 使用命令行处理器调用时,可以指定其他选项。

有关更多信息,请参阅 使用命令行 SQL 语句和 XQuery 语句

授权

CONNECT 处理通过两个级别的访问控制。 要使连接成功,必须满足这两个级别。

第一级访问控制是认证,其中必须根据为服务器设置的认证方法成功认证与连接相关联的用户标识。 成功认证时,将根据对服务器有效的认证插件从连接用户标识派生数据库授权标识。 然后,此数据库授权标识必须通过连接的第二级访问控制,即授权。 为此,此授权标识必须至少具有下列其中一个权限:
  • 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.

描述

服务器名称/主机变量
用于对服务器名称进行编码的规则与类型 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。 授权标识和数据库别名放置在 SQLCA 的 SQLERRMC 字段中。 如果连接不存在,那么不会尝试建立隐式连接,并且 SQLERRP 和 SQLERRMC 字段将返回空白。 (应用程序可以通过检查这些字段来检查当前连接是否存在。)

没有包含 USER 和 USING 的操作数的 CONNECT 仍然可以使用 DB2DBDFT 环境变量将应用程序进程连接到数据库。 此方法等同于类型 2 CONNECT RESET ,但允许使用用户标识和密码。

RESET
相当于显式连接到缺省数据库 (如果可用)。 如果缺省数据库不可用,那么应用程序进程的连接状态及其连接状态保持不变。

缺省数据库的可用性由安装选项,环境变量和认证设置确定。

规则

  • 管理分布式工作单元语义的选项中所述,一组连接选项用于管理连接管理的语义。 缺省值将分配给每个预处理的源文件。 应用程序可以由使用不同连接选项预编译的多个源文件组成。

    除非先执行 SET CLIENT 命令或 API ,否则在预处理包含在运行时执行的第一个 SQL 语句的源文件时使用的连接选项将成为有效的连接选项。

    如果随后在不执行任何介入的 SET CLIENT 命令或 API 的情况下执行使用不同连接选项预先处理的源文件中的 CONNECT 语句,那么将返回错误 (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 类
每个工作单元只能与一个应用程序服务器建立连接。 每个工作单元都可以与多个应用程序服务器建立连接。
在允许连接到另一个应用程序服务器之前,必须落实或回滚当前工作单元。 在连接到另一个应用程序服务器之前,无需落实或回滚当前工作单元。
CONNECT 语句用于建立当前连接。 后续 SQL 请求将转发到此连接,直到另一个 CONNECT 更改为止。 如果建立第一个连接,那么与类型 1 CONNECT 相同。 如果切换到休眠连接并且 SQLRULES 设置为 STD ,那么必须改为使用 SET CONNECTION 语句。
连接到当前连接是有效的,不会更改当前连接。 如果 SQLRULES 预编译器选项设置为 "DB2" ,那么与类型 1 CONNECT 相同。 如果 SQLRULES 设置为 STD ,那么必须改为使用 SET CONNECTION 语句。
连接到另一个应用程序服务器将断开当前连接。 新连接将成为当前连接。 在工作单元中仅维护一个连接。 连接到另一个应用程序服务器会使当前连接进入 休眠状态。 新连接将成为当前连接。 可以在一个工作单元中维护多个连接。

如果 CONNECT 用于休眠连接上的应用程序服务器,那么它将成为当前连接。

仅当指定了 SQLRULES (DB2) 时,才允许使用 CONNECT 连接到休眠连接。 如果指定了 SQLRULES (STD) ,那么必须改为使用 SET CONNECTION 语句。

类型 1 连接支持 SET CONNECTION 语句,但唯一有效的目标是当前连接。 对于类型 2 连接,支持 SET CONNECTION 语句以将连接状态从休眠更改为当前状态。

使用 CONNECT ...用户 ...使用:

1 类 2 类
正在与 USER 连接 ...USING 子句断开当前连接,并使用给定的授权名称和密码建立新连接。 仅当没有与同一指定服务器的当前或休眠连接时,才会接受使用 USER/USING 子句进行连接。

使用 隐式 CONNECT , CONNECT RESET断开:

1 类 2 类
CONNECT RESET 可用于断开当前连接。 CONNECT RESET 相当于显式连接到缺省应用程序服务器 (如果已在系统中定义了缺省应用程序服务器)。

应用程序可以在成功 COMMIT 时断开连接。 在落实之前,请使用 RELEASE 语句将连接标记为释放暂挂。 所有此类连接都将在下一次 COMMIT 时断开连接。

替代方法是使用预编译器选项 DISCONNECT (显式) , DISCONNECT (条件) , DISCONNECT (自动) 或 DISCONNECT 语句来代替 RELEASE 语句。

使用 CONNECT RESET 断开当前连接后,如果下一个 SQL 语句不是 CONNECT 语句,那么它将执行与缺省应用程序服务器的隐式连接 (如果已在系统中定义)。 CONNECT RESET 相当于显式连接到缺省应用程序服务器 (如果已在系统中定义)。
发出连续 CONNECT RESET 是错误。 仅当指定了 SQLRULES (STD) 时才发出连续 CONNECT RESET 是错误的,因为此选项不允许对现有连接使用 CONNECT。
CONNECT RESET 隐式落实当前工作单元。 CONNECT RESET 隐式回滚当前工作单元。
如果系统由于任何原因断开现有连接,那么此数据库的后续非 CONNECT SQL 语句将接收到 SQLSTATE 08003。 如果系统断开现有连接,那么仍允许 COMMIT , ROLLBACK 和 SET CONNECTION 语句。
当应用程序进程成功终止时,将隐式落实工作单元。 与类型 1 相同。
当应用程序进程终止时,所有连接 (只有一个) 都将断开连接。 当应用程序进程终止时,所有连接 (当前连接,休眠连接和标记为释放暂挂的连接) 都将断开连接。

CONNECT 失败:

1 类 2 类
无论当 CONNECT 失败时是否存在当前连接 (在本地目录中未定义 server-name 以外的错误) ,应用程序进程都处于未连接状态。 后续非 CONNECT 语句接收到 SQLSTATE 08003。 如果 CONNECT 失败时存在当前连接,那么当前连接不受影响。

如果 CONNECT 失败时没有当前连接,那么程序将处于未连接状态。 后续非 CONNECT 语句接收到 SQLSTATE 08003。

注意

  • 具有类型 2 连接的应用程序中的第一个 SQL 语句支持隐式连接。 为了在缺省数据库上执行 SQL 语句,必须首先使用 CONNECT RESET 或 CONNECT USER/USING 语句来建立连接。 不带操作数的 CONNECT 语句将显示有关当前连接的信息 (如果有) ,但如果没有当前连接,那么将不连接到缺省数据库。
  • 无法在 CONNECT 语句中显式指定 authorization-name SYSTEM。 但是,在 Windows 操作系统上,在 "本地系统帐户" 下运行的本地应用程序可以隐式连接到数据库,以便用户标识为 SYSTEM。
  • 显式连接到 Windows Server 时,可以使用兼容 Microsoft Windows Security Account Manager (SAM) 的 authorization-name 或用户 host-variable 名称。
  • 终止连接: 当连接终止且事务尚未落实或回滚时,请参阅 "使用隐式 CONNECT , CONNECT RESET 和断开连接" 部分,以获取有关此类事务的详细信息。 要确保行为一致,请对显式 COMMIT 语句或 ROLLBACK 语句进行编码,而不是根据 CONNECT 语句的行为进行编码。
  • 替代语法: 支持以下内容以与先前版本的 Db2® 和其他数据库产品兼容。 这些备用项是非标准的,不应使用。
    • 可以指定 DBPARTITIONNUM 或 NODE 来代替 MEMBER,除非 DB2_ENFORCE_MEMBER_SYNTAX 注册表变量设置为 ON。

示例

  • 示例 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:
    • 连接到渥太华运行: connect=2, sqlrules=DB2, disconnect = CONDITIONAL
    • 连接到 QUEBEC 失败, SQLSTATE 08001 ,因为 SQLRULES 和 DISCONNECT 都不同。
    如果应用程序执行 PGM1 ,那么 PGM3:
    • 连接到渥太华运行: connect=2, sqlrules=DB2, disconnect = CONDITIONAL
    • 连接到伦敦运行: connect=2, sqlrules=DB2, disconnect = EXPLICIT
    这是正常的,因为 SET CLIENT API 在第二个 CONNECT 语句之前运行。
    如果应用程序执行 PGM1 ,那么 PGM4:
    • 连接到渥太华运行: 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 表示四个服务器。
    序列 语句 当前服务器 休眠连接 发布暂挂
    0
    • 无语句
    1
    • select * from tbla
    • S0 (缺省值)
    2
    • 连接到 S1
    • 从 tblb 中选择 *
    • S1
    • S1
    • S0
    • S0
    3
    • 连接到 S2
    • 更新 tblc 设置...
    • S2
    • S2
    • S0, S1
    • S0, S1
    4
    • 连接到 S3
    • select * from tbld
    • S3
    • S3
    • S0, S1, S2
    • S0, S1, S2
    5
    • 设置连接 S2
    • S2
    • S0, S1, S3
    6
    • 发行版 S3
    • S2
    • S0, S1
    • S3
    7
    • COMMIT
    • S2
    • S0, S1
    8
    • 从 tble 中选择 *
    • S2
    • S0, S1
    9
    • 断开连接 S1
    • 从 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