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 之间的选择由预编译器选项确定。 有关这些选项的概述,请参阅 连接到分布式关系数据库
。
- 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; ...注:- 不是 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
如果应用程序执行 PGM1 ,那么 PGM4:- 连接到渥太华运行: connect=2, sqlrules=DB2, disconnect = CONDITIONAL
- 连接到 REGINA 运行: connect=2, sqlrules=DB2, disconnect = CONDITIONAL
- 示例 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
