返回首页

gbase数据、南大通用产品文档:GBase8sConnectionString 属性中的服务器关键字

更新日期:2024年09月11日

在 GBase
8s
.NET
Provider 中,
SERVER 关键字应当用于将 GBASEDBTSERVER 名
称指定为 SetNet 实用程序中的设置。
在 GBASE Data Server .NET Provider 中,SERVER 关键字应以格式
: 指定,其中 为实例的机器名称,而
为实例正在侦听的端口。

使用 CONNECT 语句连接数据库环境。该语句是 SQL ANSI/ISO 标准的扩展。
语法

用法
CONNECT 语句将应用程序连接到数据库环境,数据库环境可以是数据库、数据
库服务器或数据库连同数据库服务器。如果应用程序成功连接到指定的数据库环
境,则连接成为应用程序的当前连接。如果应用程序没有到数据库服务器的当前
连接,则 SQL 语句失败。如果指定数据库名称,则数据库服务器打开该数据
库,您不能在 PREPARE 语句中包含 CONNECT 。
应用程序可同时连接到数个数据库环境,并且它可以建立到同一个数据库环境的
多个连接,条件是每个连接有唯一的连接名称。
在 UNIX™ 上,建立到同一个数据库环境的多个连接的唯一限制是,一个应用程
序到每个使用共享内存连接机制的本地服务器只能建立一个连接。要找出本地服
务器是使用共享内存连接机制,还是使用本地回送连接机制,请检查
$GBASEDBTDIR/etc/sqlhosts 文件。有关 sqlhosts 文件的更多信息,请参阅
GBase 8s 管理员指南。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 196
在 Windows™ 上,本地连接机制是命名管道。从一个客户机到本地服务器可以
存在多个连接。
任何时候都只有一个连接处于当前状态;其它连接均处于休眠状态。应用程序无
法通过休眠的连接来与数据库进行交互。当应用程序建立新连接时,该连接就成
为当前连接,而上一个当前连接变成休眠连接。可以使用SET CONNECTION 语
句使休眠的连接成为当前连接。另见 SET CONNECTION 语句 。
对于不同 GBase 8s 实例的数据库之间的连接,您不能使用不同的服务器别名在
相同的两台数据库服务器之间建立多个活动的连接。如果使用 CONNECT TO
dbserveralias 语句指定不同服务器别名来连接同一个远程服务器(dbserveralias
标识在 DBSERVERALIASES 配置参数的设置中声明),则不会发出错误,但是
初始连接是重复使用的。
执行 CONNECT 语句的权限
当前用户,或者 PUBLIC ,必须在 CONNECT 语句指定的数据库上拥有
Connect 权限。执行 CONNECT 语句的用户不能和数据库中现有的角色拥有相同
的用户名。
有关当 CONNECT 语句连接到远程主机上的数据库服务器时如何使用 USER
Authentication 子句指定备用用户名的信息,请参阅 USER Authentication 子句 。
连接上下文
每个连接包含一组称为 连接上下文的信息。连接上下文包含当前用户的名称。数
据库环境与此名称相关联的信息以及连接状态的信息(例如活动的是否与连接相
关联)。当应用程序进入休眠状态时保存连接上下文,而当应用程序再次成为当
前应用程序时恢复此上下文。(有关更多信息,请参阅 使休眠连接成为当前的连
接。)
数据库环境
此 CONNECT 以及类似于 SET CONNECTION 语句,可使用数据库环境语法段
指定应用程序尝试建立连接的数据库或数据库服务器。不同于 SET
CONNECTION 语句,该 CONNECT 语句还可以为此指定的数据库环境的连接声
明名称。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 197
数据库环境

元素
描述
限制
语法
connection
此处声明的连接的
名称,该名称可选
的并区分大小写
在连接名称中必须唯一
标识符
connection_var 存储 connection
名称的主变量
必须为固定长度的字符
数据类型
Language
specific
db_var
包含有效数据库环
境(以语法图中的
格式)的主变量
必须为固定长度的字符
数据类型,其内容以语
法图中的格式显示
Language
specific
dbname
要连接的数据库
必须已经存在
标识符
dbservername
进行连接的数据库
服务器的名称
必须已经存在;@ 符号
和 dbservername 之间
的空格无效。另见对
dbservername 的限
制 。
标识符
如果设置了 DELIMIDENT 环境变量,数据库环境中的任何引号( ' )必须是单
引号。如果没有设置 DELIMIDENT ,那么单引号( ' )或者双引号( " )在
此都有效。
对 dbservername 的限制
如果指定 dbservername ,则它必须服满足以下限制。

如果您指定的数据库服务器没有联机,则您会接收到一条错误。

您在 dbservername 中指定的数据库服务器必须匹配 sqlhosts 文件中的
数据库服务器的名称。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 198
注: 如果数据库服务器的名称是一个分隔标识符或它包含大写字母,则数据库服
务器不能参与跨数据库分布的 DML 操作。(如果该服务器包含大写字母,它还
不能参与由 SQL 语句指定的服务器名称作为到数据库名称的限定符的跨数据库
分布的 DML 操作。这些语句发生 -908 错误并失败,因为该 SQL 语法分析器
将服务器名称中的所有的大写字母降档为小写字母。)要避免此限制,当声明要
参与分布查询的数据库服务器的别名或名称使,仅指定没有大写字母的未分隔的
名称。
指定数据库环境
可以指定数据库服务器和数据库,或仅指定数据库服务器,或仅指定数据库。数
据库如何定位和打开取决于您是否在数据库环境表达式中指定数据库服务器名
称。
仅指定数据库服务器
@dbservername 选项仅建立一个到数据库服务器的连接;它不打开数据库。使用
此选项时,必须随后使用 DATABASE 或 CREATE DATABASE 语句(或它们
的 PREPARE 语句以及 EXECUTE 语句)来打开数据库。
指定数据库服务器和数据库
如果同时指定数据库服务器和数据库,则应用程序连接到数据库服务器,该数据
库服务器找到并打开数据库。
仅指定数据库
dbname 选项建立到缺省数据库服务器或 DBPATH 环境变量中的另一个数据库
服务器的连接。它还找到并打开指定的数据库。(如果这仅指定数据库名称,则
db_var 选项也是如此。)
如果仅指定 dbname ,则其数据库服务器从 DBPATH 环境变量读取。在
GBASEDBTSERVER 环境变量中的数据库服务器总是在 DBPATH 值之前。
在 UNIX™ 上,如以下示例所示设置 GBASEDBTSERVER 和 DBPATH 环境变量(对于
C shell ):
setenv GBASEDBTSERVER srvA
setenv DBPATH //srvB://srvC

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 199
在 Windows™ 上,从任务栏选择开始 > 程序 > GBase 8s > setnet32 并设置
GBASEDBTSERVER 和 DBPATH 环境变量:
set GBASEDBTSERVER = srvA
set DBPATH = //srvA://srvB://srvC
下一个示例显示应用程序使用的生成的 DBPATH :
//srvA://srvB://srvC
应用程序首先建立到 GBASEDBTSERVER 指定的数据库服务器的连接。数据库
服务器使用配置文件中的参数来找到数据库。如果数据库不驻留在缺省数据库服
务器上,或缺省数据库服务器脱机,则应用程序连接到 DBPATH 中的下一个数
据库服务器。在先前的示例中,该数据库服务器是 srvB 。
声明连接名称
在 ESQL/C 应用程序中,可以通过包含 AS 关键字为此数据库环境的连接声明标
识符,其跟随在引号字符或存储标识符的主变量之后。该主变量必须是固定长度
的字符数据类型。
连接标识
可选的 connection 名称是应用程序可以用来引用随后的 SET CONNECTION 和
DISCONNECT 语句中的连接的唯一标识。如果应用程序不提供连接名称(或连
接主机变量),则它可以引用使用数据库服务器的连接。然而,如果应用程序对
同一个数据库环境进行了多个连接,则每个连接必须拥有唯一的名称。
只有 CONNECT 语句可以使用 AS 关键字声明连接名称。然而,CONNECT 语
句不能引用之前声明的连接名称以指定数据库环境的连接。
USER Authentication 子句
USER Authentication 子句指定用来确定应用程序是否可以访问远程主机上目标计
算机的信息。
USER Authentication Clause


GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 200
元素
描述
限制
语法
user_id
有效的登录名
请参阅 对用户标识参数
的限制
引用字
符串
user_id_var
包含 user_id 的主
变量
必须为固定长度字符数据
类型;与 user_id 相同
的限制
特定于
语言
validation_var
包含 user_id 或
user_id_var 中登
录名称的有效密码的
主变量
必须为固定长度字符数据
类型。请参阅对验证参数
变量的限制
特定于
语言
当 CONNECT 语句连接到远程主机上的数据库服务器时需要 USER
Authentication 子句。CONNECT 语句后,远程主机上的所有数据库操作使用指定
的用户名。
在 DB-Access 中,USING 子句在从 DB-Access 执行的文件中是有效的。在交互
方式中,DB-Access 提示输入密码,所以就不使用 USING 关键字和
validation_var 。
对验证参数变量的限制
在 UNIX™ 上,validation_var 中存储的密码必须是有效的密码,并且必须存在
于 /etc/passwd 文件中。如果应用程序连接到远程数据库服务器,则密码必须同
时存在于本地远程数据库服务器的此文件中。
在 Windows™ 上,validation_var 中存储的密码必须是有效的密码,并且必须是
用户管理器中输入的密码。如果应用程序连接到远程数据库服务器,则密码必须
同时存在于客户机和服务器的域中。
对用户标识参数的限制
如果发生以下任意一种情况,则连接会被拒绝:

指定的用户缺少访问数据库环境中指定数据库的权限。

指定的用户缺少连接到远程主机所必需的许可权。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 201

您提供了 USER Authentication 子句但是遗漏了 USING validation_var 指
定。
为了与 CONNECT 语句的 X/Open 标准一致,GBase 8s ESQL/C 预处理器允许
具有 USER Authentication 子句的 CONNECT 语句不带 USING validation_var 指
定。然而如果没有提供 validation_var ,则数据库服务器在运行时拒绝连接。
在 UNIX™ 上,您指定的 user_id 必须是有效的登录名且必须存在于
/etc/passwd 文件中。如果该应用程序连接到远程服务器,则登录名必须同时存在
于本地和远程数据库服务器的此文件中。
在 Windows™ 上,您指定的 user_id 必须是有效的登录名且必须存在于用户管
理器中。如果应用程序连接到远程数据库服务器,则登录名必须同时存在于客户
机和服务器的域中。
缺省用户 ID 的使用
如果未提供 USER Authentication 子句,则缺省的用户 ID 用于尝试此连接。
缺省用户 ID 是运行此应用程序的用户的登录名。在这种情况下,您通过标准授
权过程获得网络许可权。例如,在 UNIX™ 上,缺省用户 ID 必须匹配可信主机
文件(/etc/hosts.equiv 文件或由 REMOTE_SERVER_CFG 配置参数指定的文
件)。在 Windows™ 上,您必须是域的成员,或者如果数据库服务器是本地安
装的,则您必须是安装它的计算机上的有效用户。
缺省连接规范
可以使用 DEFAULT 关键字请求到缺省数据库服务器的缺省连接,而不用指定显
式数据库环境。缺省数据库可以是本地的或远程的。要指定缺省数据库服务器,
请在 GBASEDBTSERVER 中设置其名称。这种形式的CONNECT 选项打不开
数据库。
如果该 CONNECT TO DEFAULT 语句成功,则必须使用 DATABASE 语句或
CREATE DATABASE 语句来在缺省数据库环境中打开或创建数据库。
使用 DATABASE 语句的隐式连接
如果不在应用程序中执行 CONNECT 语句,则第一条 SQL 语句必须是以下数据
库语句(或者是以下语句的单个 PREPARE 语句):

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 202

DATABASE

CREATE DATABASE

DROP DATABASE
如果这些数据库语句是应用程序中的第一条 SQL 语句,则该语句建立到数据库
服务器的连接,这被称为隐式连接。如果数据库服务器仅指定数据库名称,则从
DBPATH 环境变量获取数据库服务器名称。这种情况在 指定数据库环境 中有描
述。
进行隐式连接的应用程序可以显式建立其它的连接(使用 CONNECT 语句),但
是不能建立另一个隐式连接,除非最初的隐式连接已关闭。应用程序可使用
DISCONNECT 语句终止隐式连接。在建立隐式连接之后,在关闭显式连接之
前,不能使用任何数据库语句创建隐式连接。
进行任何隐式连接之后,该连接被认为是缺省连接,不管数据库服务器是否是
GBASEDBTSERVER 环境变量指定的缺省值。如果进行了其它显式连接,则此
功能允许应用程序引用隐式连接,因为隐式连接没有标识。
例如,如果您在隐式连接后建立一个显式连接,则您可以通过发出 SET
CONNECTION DEFAULT 语句使隐式连接变为当前连接。然而,这意味着一旦
建立了隐式连接,则不能使用 CONNECT DEFAULT 语句,因为隐式连接现在是
当前连接。
数据库语句总可用来打开数据库或者在当前数据库服务器上创建新的数据库。
WITH CONCURRENT TRANSACTION 选项
WITH CONCURRENT TRANSACTION 子句使您能够在当前连接中存在活动事务
时,切换到另一个连接。如果当前连接不是使用 WITH CONCURRENT
TRANSACTION 子句建立的,则您不能在事务是活动的情况下切换到另一个连
接;CONNECT 或 SET CONNECTION 语句失败,返回一条错误,并且当前连接
中的事务继续保持活动。
这种情况中,应用程序必须在当前连接切换到另一个连接之前提交或者回滚当前
连接中活动的事务。
WITH CONCURRENT TRANSACTION 子句支持多个并发事务的概念,其中每个
连接可有其自己的事务并且 COMMIT WORK 和 ROLLBACK WORK 语句仅影

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 203
响当前的连接。WITH CONCURRENT TRANSACTION 子句不支持单个事务横跨
多个连接上的数据库的全局事务。COMMIT WORK 和 ROLLBACK WORK 语句
对跨越多个连接的数据库不起作用。
以下示例说明如何使用 WITH CONCURRENT TRANSACTION 子句:
main()
{
EXEC SQL connect to 'a@srv1' as 'A';
EXEC SQL connect to 'b@srv2' as 'B' with concurrent transaction;
EXEC SQL connect to 'c@srv3' as 'C' with concurrent transaction;

/*
Execute SQL statements in connection 'C' , starting a transaction
*/
EXEC SQL set connection 'B'; -- switch to connection 'B'

/*
Execute SQL statements starting a transaction in 'B'.
Now there are two active transactions, one each in 'B' and 'C'.
*/

EXEC SQL set connection 'A'; -- switch to connection 'A'

/*
Execute SQL statements starting a transaction in 'A'.
Now there are three active transactions, one each in 'A', 'B' and 'C'.
*/

EXEC SQL set connection 'C'; -- ERROR, transaction active in 'A'

/*
SET CONNECTION 'C' fails (current connection is still 'A')
The transaction in 'A' must be committed or rolled back because
connection 'A' was started without the CONCURRENT TRANSACTION
clause.
*/
EXEC SQL commit work; -- commit tx in current connection ('A')


GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 204
/*
Now, there are two active transactions, in 'B' and in 'C',
which must be committed or rolled back separately
*/

EXEC SQL set connection 'B'; -- switch to connection 'B'
EXEC SQL commit work; -- commit tx in current connection ('B')

EXEC SQL set connection 'C'; -- go back to connection 'C'
EXEC SQL commit work; -- commit tx in current connection ('C')

EXEC SQL disconnect all;
}
警告: 当应用程序使用 WITH CONCURRENT TRANSACTION 子句建立到同一
个数据库环境的多个连接时,可能发生死锁现象。
TRUSTED 子句
使用 TRUSTED 子句指定应用程序连接到数据库环境的连接是可信连接。

SQL 日志也是general 日志,它记录数据库曾经执行过的SQL 语句。
日志文件命名格式
日志文件名称可通过设置general_log_file 参数修改,默认路径$GCLUSTER_BA
SE/log/gcluster/gclusterd.log。
日志内容说明

通过如下语句,开启SQL 日志,语法如下:
SET GLOBAL general_log =on;
SET GLOBAL log_output='FILE'|'TABLE';

log_output 参数值'FILE'|'TABLE'选项值为二选一;

log_output 参数值是FILE 时,表示生成日志文件,为默认设置;

log_output 参数值是TABLE 时,表示生成日志的日志内容输出到表中,
一般这个选项在集群监控工具中使用;

log_output 参数值是TABLE 时,表示将SQL 语句写入一个表中,在监
控工具中要开启审计日志功能,则必须设置为TABLE;

日志文件名称可通过设置general_log_file 参数修改,默认是$GCLUSTE
R_BASE/log/gcluster/gclusterd.log。
注意
在监控工具中开启SQL 日志功能方法为:
SET GLOBAL general_log=true;
SET GLOBAL log_output='TABLE';