CONNECT(1 类)语句
CONNECT (Type 1) 语句根据远程工作单元的规则将应用程序进程连接到标识的应用程序服务器。
一个应用程序进程一次只能连接到一个应用程序服务器。 这称为 当前服务器。 可以在初始化应用程序请求者时建立缺省应用程序服务器。 如果隐式连接可用并且应用程序进程已启动,那么它将隐式连接到缺省应用程序服务器。 应用程序进程可以通过发出 CONNECT 语句来显式连接到其他应用程序服务器。 连接持续到发出 CONNECT RESET 语句或 DISCONNECT 语句,或者直到另一个 CONNECT 语句 更改应用程序服务器。
调用
尽管交互式 SQL 工具提供的界面可以呈现交互式执行的外观,但该语句只能嵌入在应用程序中。 这是一个无法动态准备的可执行语句。 使用命令行处理器调用时,可以指定其他选项。
有关更多信息,请参阅 使用命令行 SQL 语句和 XQuery 语句 。
授权
CONNECT 处理通过两个级别的访问控制。 要使连接成功,必须满足这两个级别。
- CONNECT 权限
- SECADM 权限
- DBADM 权限
- SYSADM 权限
- SYSCTRL 权限
- SYSMAINT 权限
- SYSMON 权限
语法
- 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.
描述
- CONNECT (无操作数)
- 返回有关当前服务器的信息。 将在 SQLCA 的 SQLERRP 字段中返回信息,如 "成功连接" 中所述。
如果存在连接状态,那么授权标识和数据库别名将放在 SQLCA 的 SQLERRMC 字段中。 如果授权标识超过 8 个字节,那么将截断为 8 个字节,并且将在 SQLCA 的 SQLWARN0 和 SQLWARN1 字段中分别使用 "W" 和 "A" 标记截断。
如果不存在任何连接并且可以进行隐式连接,那么将尝试进行隐式连接。 如果隐式连接不可用,那么此尝试会导致错误 (没有现有连接)。 如果没有连接,那么 SQLERRMC 字段为空。
应用程序服务器的地域代码和代码页放置在 SQLERRMC 字段中 (因为它们具有成功的 CONNECT 语句)。
这种形式的 CONNECT:- 不要求应用程序进程处于可连接状态。
- 如果已连接,那么不会更改连接状态。
- 如果未连接且隐式连接可用,那么将建立与缺省应用程序服务器的连接。 在这种情况下,应用程序服务器的国家或地区代码和代码页将放置在 SQLERRMC 字段中,如成功的 CONNECT 语句。
- 如果未连接且隐式连接不可用,那么应用程序进程将保持未连接状态。
- 不关闭游标。
- TO server-name 或 host-variable
- 通过指定的 server-name 或包含 server-name 的 host-variable 来标识应用程序服务器。
如果指定了 host-variable ,那么它必须是长度属性不大于 8 的字符串变量,并且不得包含指示符变量。 包含在 host-variable 中的 server-name 必须左对齐,并且不得用引号定界。
请注意, server-name 是标识应用程序服务器的数据库别名。 它必须列示在应用程序请求者的本地目录中。
执行 CONNECT 语句 时,应用程序进程必须处于可连接状态。
- 成功连接
- 如果 CONNECT 语句 成功:
- 将关闭所有打开的游标,销毁所有预编译语句,并从先前的应用程序服务器释放所有锁定。
- 应用程序进程与其先前的应用程序服务器 (如果有) 断开连接,并连接到标识的应用程序服务器。
- 应用程序服务器的实际名称 (不是别名) 放在 CURRENT SERVER 专用寄存器中。
- 有关应用程序服务器的信息放在 SQLCA 的 SQLERRP 字段中。 如果应用程序服务器是 IBM® 产品,那么该信息的格式为 pppvvrrm,其中:
- ppp 表示下列其中一个产品标识:
- DSN 用于 Db2 for z/OS
- ARI for Db2® VSE 和 VM 服务器
- IBM i 的 Db2 的 QSQ
- SQL 用于 Db2
- vv 是两位数的版本标识,例如 "08"
- rr 是两位数的发行版标识,例如 "01"
- m 是单字符修改级别标识,例如 "0"。
例如, Db2 V 9.5 标识为 "SQL09050"。
- ppp 表示下列其中一个产品标识:
- SQLCA 的 SQLERRMC 字段设置为包含以下值 (以 X'FF ' 分隔)
- 应用程序服务器的国家或地区代码 (如果使用 Db2 Connect ,那么为空白)。
- 应用程序服务器的代码页 (如果使用 Db2 Connect ,那么为 CCSID)。
- 授权标识 (仅限前 8 个字节) ,
- 数据库别名,
- 应用程序服务器的平台类型。 当前标识的值为:
- 标记
- 服务器
- QAS
- DB2 for IBM i
- QDB2
- Db2 for z/OS
- QDB2/6000
- Db2 数据库 AIX®
- QDB2/LINUX
- Db2 数据库 Linux®
- QDB2/NT
- Db2 视窗数据库
- QSQLDS/VM
- Db2 虚拟机服务器
- QSQLDS/VSE
- Db2 VSE 服务器
- 代理程序标识。 它标识代表应用程序在数据库管理器中执行的代理程序。 此字段与数据库监视器返回的 agent_id 元素相同。
- 代理程序索引。 它标识代理程序的索引并用于服务。
- 如果服务器实例在 Db2 pureScale® 环境中运行(如 SQLWARN0 和 SQLWARN4 分别设置为 "W "和 "S "所示),则此值代表成员编号。 如果如令牌 10 所指示,服务器实例在分区环境中运行,那么此令牌表示成员编号。 如果服务器实例在非分区环境中以及在 Db2 pureScale 环境外部运行,那么此值不适用并且始终为 0。
- 应用程序客户机的代码页。
- 如果此值为零,那么服务器实例将在非分区环境中以及 Db2 pureScale 环境外部运行。 否则,此非零值表示 Db2 pureScale 实例中的成员数 (如果 SQLWARN0 和 SQLWARN4 分别设置为 "W" 和 "S")。 如果此值非零,但既未设置 SQLWARN0 也未设置 SQLWARN4 ,那么它表示分区环境中的成员数。
- SQLCA 的 SQLERRD (1) 字段指示从应用程序代码页转换为数据库代码页时混合字符数据 (CHAR 数据类型) 的最大期望长度差异。 值为 0 或 1 指示没有扩展;值大于 1 指示长度可能扩展;负数值指示可能收缩。
- SQLCA 的 SQLERRD (2) 字段指示从数据库代码页转换为应用程序代码页时混合字符数据 (CHAR 数据类型) 的最大期望长度差异。 值为 0 或 1 指示没有扩展;值大于 1 指示长度可能扩展;负数值指示可能收缩。
- SQLCA 的 SQLERRD (3) 字段指示连接上的数据库是否可更新。 数据库最初是可更新的,但如果工作单元确定授权标识无法执行更新,那么将其更改为只读。 值为下列其中一项:
- 1-可更新
- 2-只读
- SQLCA 的 SQLERRD (4) 字段返回连接的某些特征。 值为下列其中一项:
- 0
- N/A (仅当从未处于最新级别,是一阶段落实且是更新者的客户机运行时才可能)。 1
- 一阶段落实。 2
- 一阶段落实; 只读 (仅适用于 TP 监视器环境中与 DRDA1 数据库的连接)。 3
- 两阶段落实。
- SQLCA 的 SQLERRD (5) 字段返回连接的认证类型。 值为下列其中一项:
- 0
- 已在服务器上认证。 1
- 已在客户机上认证。 2
- 使用 Db2 Connect 进行认证。 4
- 在服务器上使用加密进行认证。 5
- 使用 Db2 Connect with encryption 进行认证。 7
- 使用外部 Kerberos 安全性机制进行认证。 9
- 使用外部 GSS API 插件安全性机制进行认证。 11
- 在接受加密数据的服务器上进行认证。 255
- 未指定认证。
- SQLCA 的 SQLERRD (6) 字段返回在分区数据库环境中建立连接的数据库分区的数据库分区号。 否则,将返回值 0。
- 如果成功连接的授权标识超过 8 字节,那么 SQLCA 中的 SQLWARN1 字段将设置为 "A"。 这指示已发生截断。 SQLCA 中的 SQLWARN0 字段将设置为 "W" 以指示此警告。
- 连接失败
- 如果 CONNECT 语句 不成功:
- SQLCA 的 SQLERRP 字段设置为检测到错误的应用程序请求者的模块的名称。 模块名称的前三个字符标识产品。
- 如果 CONNECT 语句 失败,因为应用程序进程未处于可连接状态,那么应用程序进程的连接状态保持不变。
- 如果由于本地目录中未列出 server-name 而导致 CONNECT 语句 失败,那么将发出错误消息 (SQLSTATE 08001) ,并且应用程序进程的连接状态保持不变:
- 如果应用程序请求者未连接到应用程序服务器,那么应用程序进程将保持未连接状态。
- 如果应用程序请求者已连接到应用程序服务器,那么应用程序进程仍将连接到该应用程序服务器。 将在该应用程序服务器上执行任何其他语句。
- 如果 CONNECT 语句 由于任何其他原因而失败,那么应用程序进程将处于未连接状态。
- 允许其他并发连接到数据库,并阻止其他用户以互斥方式连接到数据库。
- 以互斥方式
- 阻止并发应用程序进程在应用程序服务器上执行任何操作,除非它们具有与持有互斥锁定的用户相同的授权标识。 Db2 Connect 不支持此选项。
- 在单个成员上
- 指定以互斥方式连接协调程序数据库 成员 ,并以共享方式连接所有其他 成员 。
如果数据库既不在分区环境中,也不在 Db2 pureScale 环境中,那么可以指定此选项,但它没有任何作用。
- RESET
- 断开应用程序进程与当前服务器的连接。 执行落实操作。 如果隐式连接可用,那么应用程序进程将保持未连接状态,直到发出 SQL 语句为止。
- USER 授权 名称/主机变量
- 标识尝试连接到应用程序服务器的用户标识。 如果指定了主变量,那么它必须是不包含指示符变量的字符串变量。 包含在 host-variable 中的用户标识必须左对齐,并且不得用引号定界。
- 使用密码 / 主机变量
- 标识尝试连接到应用程序服务器的用户标识的密码。 密码的最大长度由您要连接的数据服务器确定。 如果指定了主变量,那么它必须是字符串变量,并且不得包含指示符变量。
- 新增 password/host-variable CONFIRM password
- 标识应该分配给 USER 选项所标识的用户标识的新密码。 密码的最大长度由您要连接的数据服务器确定。 如果指定了主变量,那么它必须是字符串变量,并且不得包含指示符变量。 将更改密码的系统取决于设置用户认证的方式。 要在 Linux上支持更改密码,必须将数据库实例配置为使用安全插件 IBMOSchgpwdclient 和 IBMOSchgpwdserver。
引用密码
A-Z, a-z (ALPHABETIC CHARACTERS)
# $ @ (DIAMOND "LETTERS")
0-9 (NUMERIC CHARACTERS)
_ (UNDERSCORE CHARACTER)
. (PERIOD CHARACTER)
/ (FORWARD SLASH CHARACTER)
\ (BACKWARD SLASH CHARACTER)
: (COLON CHARACTER)
& * % - ~ + ; ? < = > [ ] ` | ^ { }db2 => CONNECT TO sample USER admin USING '!xyz'db2 connect to sample USER admin USING "'!xyz'"
db2 "connect to sample USER admin USING '!xyz'"或者,通过在不提供密码的情况下执行 CONNECT 语句来使用密码提示功能。 在密码提示中,您不需要向包含特殊字符的密码添加引号:
db2 => CONNECT TO sample USER admin
db2 CONNECT TO sample USER admin注意
- 应用程序进程执行的第一个 SQL 语句最好是 CONNECT 语句。
- 如果使用其他用户标识和密码向当前应用程序服务器发出 CONNECT 语句 ,那么将取消分配并重新分配对话。 所有游标都由数据库管理器关闭 (如果使用了 WITH HOLD 选项,那么会丢失游标位置)。
- 如果向当前应用程序服务器发出具有相同用户标识和密码的 CONNECT 语句 ,那么不会取消分配和重新分配对话。 在这种情况下,游标不会关闭。
- 要使用多分区分区数据库环境,用户或应用程序必须连接到 db2nodes.cfg 文件中列出的其中一个数据库分区。 您应该尝试确保并非所有用户都使用与协调程序分区相同的数据库分区。
- 无法在 CONNECT 语句中显式指定 authorization-name SYSTEM。 但是,在 Windows 操作系统上,在 "本地系统帐户" 下运行的本地应用程序可以隐式连接到数据库,以便用户标识为 SYSTEM。
- 显式连接到 Windows Server 时,可以使用兼容 Microsoft Windows Security Account Manager (SAM) 的名称来指定 authorization-name 或用户 host-variable 。
- 如果未显式激活数据库,客户机应用程序执行频繁重新连接,或者发出 DEACTIVATE DATABASE 和 ACTIVATE DATABASE 命令之间的时间间隔非常短,那么数据库可能不可访问。 通过发出 ACTIVATE DATABASE 命令激活数据库,然后尝试连接到数据库。
- 语法替换选择:与先前版本的 DB2 及其他数据库产品的兼容性支持下列替换。 这些备用项是非标准的,不应使用。
- 可以指定 DBPARTITIONNUM 或 NODE 来代替 MEMBER,除非 DB2_ENFORCE_MEMBER_SYNTAX 注册表变量设置为 ON。
示例
- 示例 1: 在 C 程序中,使用数据库别名 TOROLAB ,用户标识 FERMAT 和密码 THEM 连接到应用程序服务器 TOROLAB。
EXEC SQL CONNECT TO TOROLAB USER FERMAT USING THEOREM; - 示例 2: 在 C 程序中,连接到其数据库别名存储在主变量 APP_SERVER (varchar (8)) 中的应用程序服务器。 成功连接后,将应用程序服务器的 3 字符产品标识复制到变量 PRODUCT (char (3))。
EXEC SQL CONNECT TO :APP_SERVER; if (strncmp(SQLSTATE,'00000',5)) strncpy(PRODUCT,sqlca.sqlerrp,3); - 示例 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
