返回首页

gbase数据、南大通用产品文档:GBase8sGBASEDBTCMNAME 环境变量

更新日期:2024年09月11日

如果连接管理器发出事件警报,那么会使用 GBASEDBTCMNAME 环境变量来存储发出警
报的连接管理器实例的名称。该环境变量由连接管理器自动设置。
GBASEDBTCMNAME 环境变量对应于连接管理器配置文件中的 NAME 参数。
CMALARMPROGRAM 程序使用该环境变量来确定对事件警报负责的连接管理器实例。

也可以在自己的连接管理器事件警报处理程序中使用该环境变量。
该环境变量由连接管理器自动设置,不应进行修改。

数据库的对象模式和违反检测可帮助您监视数据完整性。在模式更改期间,或当对于短期
内大批量数据执行插入、删除和更新操作时组合这些特性,这些特性特别有效。
在对象模式特性的讨论的上下文之内,数据库对象是约束、索引和触发器,且它们中的每
一个都有不同的模式。请不要将与对象模式特性相关的数据库对象与一般的数据库对象相
混淆。一般的数据库对象是诸如表和同义词之类的对象。

对象模式的定义
您可为约束或唯一索引设置禁用、启用或过滤模式。您可为触发器或重复索引设置启用或
禁用模式。
您可使用数据库对象模式来控制 INSERT、
DELETE 和 UPDATE 语句的效果。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 187 -
启用模式
在缺省情况下,约束、索引和触发器是启用的。
当数据库对象是启用的时,
数据库服务器识别该数据库对象的存在,
并在它执行 INSERT、
DELETE 或 UPDATE 语句时考虑该数据库对象。因此,当触发器事件发生时,强制执行
启用的约束,更新启用的索引,并执行启用的触发器。
当您启用约束和唯一索引时,
如果存在违反的行,
则该数据处理语句失败
(即,
不更改行)
且数据库服务器返回错误消息。
当您分析违反表和诊断表中的信息时,您可标识该失败的原因。然后,您可采取更正活动
或回滚该操作。
禁用模式
当数据库对象是禁用的时,在执行 INSERT、DELETE 或 UPDATE 语句时,数据库服务
器不考虑它。当触发器事件发生时,不强制执行禁用的约束,不更新禁用的索引,也不执
行禁用的触发器。当您禁用约束和唯一索引时,违反该约束或唯一索引的限制的任何数据
操纵语句都成功,(即,更改目标行),且数据库服务器不返回错误消息。
过滤模式
当约束或唯一索引处于过滤模式时,
该语句成功,
且在 INSERT、
DELETE 或 UPDATE 语
句期间,通过将失败了的行写到与该目标表相关联的违反表,数据库服务器强制满足约束
或唯一索引需求。将关于该约束违反的诊断信息写到与目标表相关联的诊断表。

使用数据操纵语句的模式的示例
一个使用 INSERT 语句的示例可说明启用模式、禁用模式与过滤模式之间的差异。请考虑
这样一条 INSERT 语句,其中一个用户试图在表上添加不满足完整性约束的一行。例如,
假设用户 joe 创建了名为 cust_subset 的表,且此表由下列列构成:ssn(客户的社会保险编
号)

fname
(客户的名)

lname
(客户的姓)
以及 city
(客户生活的城市)

ssn 列具有 INT
数据类型。其他三列有 CHAR 数据类型。
假设用户 joe 定义了 lname 列为非空,但尚未将名称指定给非空约束,于是,数据库服务器
已隐式地将名称 n104_7 指定给此约束。最后,假设用户 joe 在 ssn 列上创建了名
为 unq_ssn 的唯一索引。
现在,对 cust_subset 有 Insert 权限的用户 linda 在此表上输入下列 INSERT 语句:
INSERT INTO cust_subset (ssn, fname, city)
VALUES (973824499, "jane", "los altos");
要更好地理解启用模式、禁用模式与过滤模式之间的区别,您可在下面三个部分中查看前
面的 INSERT 语句的结果。
当约束为启用的时,插入操作的结果

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 188 -
如果在 cust_subset 表上的 NOT NULL 约束是启用的,
则 INSERT 语句不能在此表中插入
新行。而当用户 linda 输入该 INSERT 语句时,她收到下列错误消息:
-292 An implied insert column lname does not accept NULLs.
当约束为禁用时,插入操作的结果
如果在 cust_subset 表上 NOT NULL 约束是禁用的,则用户 linda 发出的 INSERT 操作成
功地在此表中插入新行。cust_subset 表的新行有下列列值。
ssn
fname lname
city
973824499 jane
NULL
los altos

当约束处于过滤模式时,插入的结果
如果将 cust_subset 表上的 NOT NULL 约束设置为过滤模式,
则用户 linda 发出的 INSERT
命令不能在此表中插入新行。而将该新行插入到违反表内,并将描述完整性违反的诊断行
添加到诊断表。
假设用户 joe 已为 cust_subset 表启动了违反表和诊断表。违反表名为 cust_subset_vio,诊断
表名为 cust_subset_dia。当用户 linda 在cust_subset 目标表上发出 INSERT 语句时,添加
到 cust_subset_vio 违反表的新行有下列列值。
ssn
fnam
e
lnam
e
city gbasedbt_tupl
eid
gbasedbt_opt
ype
gbasedbt_recow
ner
9738244
99
jane
NULL los
alto
s
1
I
linda
cust_subset_vio 违反表中的此新行有下列特征:
违反表的前四列恰好与目标表的列相匹配。这四列与目标表的对应列有相同的名称和相同
的数据类型,它们具有用户 linda 输入的 INSERT 语句提供了的列值。
gbasedbt_tupleid 列中的值 1 是分配给不符合的行的唯一序列标识符。
gbasedbt_optype 列中的值 I 表示操作类型的代码,该操作已导致了创建此不符合的行。特
别地,I 代表 INSERT 操作。
gbasedbt_recowner 列中的值 linda 标识发出了导致创建此不符合行的用户。
用户 linda 在 cust_subset 目标表上发出的 INSERT 语句还导致将诊断行添加
到 cust_subset_dia 诊断表。添加到诊断表的诊断行有下列列值。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 189 -
gbasedbt_tuplei
d
objtype objowner objname
1
C
joe
n104_7
cust_subset_dia 诊断表中的此新诊断行有下列特征:
通过同时出现在两表中的 gbasedbt_tupleid 列,将此诊断表的行连接到违反表的对应行。
值 1 同时出现在两表中的此列。
objtype 列中的值 C 标识违反表中对应行导致的完整性违反的类型。
特别地,
值 C 代表约束
违反。
objowner 列中的值 joe 表示检测到违反完整性的约束的所有者。
objname 列中的值 n104_7 给出对其检测到了完整性违反的约束的名称。
通过连接违反表与诊断表,用户 joe(其拥有 cust_subset 目标表及其相关联的特殊表)或
DBA 可在违反表中发现在 INSERT 语句之后创建了的其 gbasedbt_tupleid 值为 1 的行,

此行违反约束。
表的所有者或 DBA 可查询 sysconstraints 系统目录表来确定此约束为 NOT
NULL 约束。
既然知道该 INSERT 语句失败的原因,
用户 joe 或 DBA 便可采取更正行动。

对于一个违反行的多个诊断行
在前面的示例中,仅诊断表中的一行对应于违反表中的新行。然而,当将单个新行添加到
违反表时,
可将多个诊断行添加到诊断表。
例如,
如果用户linda 在 INSERT 语句中输入了
的 ssn 值(973824499)与 cust_subset 目标表的 ssn 列中现有的值相同,则在违反表中仅会
出现一个新行,但会在cust_subset_dia 诊断表中出现下列两个诊断行。
gbasedbt_tuplei
d
objtype objowner objname
1
C
joe
n104_7
1
I
joe
unq_ssn
诊断表中的两行同时对应于违反表的同一行,
因为这两行在 gbasedbt_tupleid 列中都有值 1。
然而,第一个诊断行标识用户 linda 发出了的 INSERT 语句导致约束违反,而第二个诊断
行标识同一 INSERT 语句导致唯一索引违反。
在此第二个诊断行中,objtype 中的值 I 代表
唯一索引违反,且objname 列中的值 unq_ssn 给出检测出了完整性违反的索引的名称。
要获取关于如何设置数据库对象模式的更多信息,请参阅《GBase 8s SQL 指南:语法》 中
的 SET Database Object Mode 语句。
违反表和诊断表

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 190 -
当您为目标表启动违反表时,在对目标表的 INSERT、UPDATE 和 DELETE 操作期间,
违反约束和唯一索引的任何行都不会导致整个操作失败,但会被过滤到违反表。诊断表包
含关于由违反表中每一行导致的完整性违反的信息。通过检查这些表,您可标识失败的原
因,并通过修正违反或回滚操作来采取更正行动。
在您为目标表创建违反表之后,您不可改变基础表或违反表的列或分片。在您已启动了违
反表之后,如果您改变目标表上的约束,则将不符合的行过滤到违反表。
要获取关于如何启动和停止违反表的信息,
请参阅
《GBase 8s SQL 指南:
语法》
中的 START
VIOLATIONS TABLE 和 STOP VIOLATIONS TABLE 语句。
违反表与数据库对象模式的关系
如果您将定义在表上的约束和唯一索引设置为过滤模式,但您未为此目标表创建违反表和
诊断表,则在插入、更新或删除操作期间,违反约束或唯一索引要求的任何行都不过滤到
违反表。相反,您会收到错误消息,指示您必须为目标表启动违反表。
类似地,如果您将禁用的约束或禁用的唯一索引设置为启用模式或过滤模式,且您想要能
够标识不满足约束或唯一索引要求的现有的行,则在您发出 SET Database Object Mode 语
句之前必须创建违反表。
START VIOLATIONS TABLE 语句的示例
下列示例展示执行 START VIOLATIONS TABLE 语句的不同方式。
启动违反表和诊断表而不指定它们的名称
要为演示数据库中名为 customer 的目标表启动违反表和诊断表,请输入下列语句:
START VIOLATIONS TABLE FOR customer;
由于您的 START VIOLATIONS TABLE 语句不包括 USING 子句,因此违反表的缺省名
称为 customer_vio,诊断表的缺省名称为customer_dia。customer_vio 表包括下列列:
customer_num
fname
lname
company
address1
address2
city
state
zipcode
phone
gbasedbt_tupleid
gbasedbt_optype
gbasedbt_recowner

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 191 -
customer_vio 表与 customer 表有相同的表定义,除了 customer_vio 表有包含关于导致了坏
行的操作的信息的三个附加列之外。
customer_dia 表包括下列列:
gbasedbt_tupleid
objtype
objowner
objname
对于目标表,
此列的列表展示诊断表与违反表之间的重要差异。
尽管对于目标表中的每列,
违约表都有相匹配的列,但诊断表的列不依赖于目标表的模式。由任何 START
VIOLATIONS TABLE 语句创建的诊断表始终有以上列表中的四列,带有相同的列名称和
数据类型。
启动违反表和诊断表并指定它们的名称
下列语句为名为 items 的目标表启动违反表和诊断表。USING 子句为违反表和诊断表声明
显式的名称。违反表将命名为 exceptions,诊断表将命名为 reasons。
START VIOLATIONS TABLE FOR items
USING exceptions, reasons;
指定诊断表中的最大行数
下列语句为名为 orders 的目标表启动违反表和诊断表。当在目标表上执行诸如 INSERT、
MERGE 或 SET Database Object Mode 之类的单个语句时,MAX ROWS 子句指定可插入
到 orders_dia 诊断表内的最大行数。
START VIOLATIONS TABLE FOR orders MAX ROWS 50000;
如果您未为 START VIOLATIONS TABLE 语句中的 MAX ROWS 指定值,则对诊断表中
的行数没有缺省的限制,除了可用的磁盘空间之外。
MAX ROWS 子句仅对于表函数在其中作为诊断表的操作限定行的数目。
对违反表的权限的示例
下列示例说明如何从对目标表的权限的当前集派生对违反表的权限的初始集。
例如,假设我们创建了名为 cust_subset 的表,且此表由下列列组成:ssn(客户的社会保险
号码)、fname(客户的名)、lname(客户的姓)以及 city(客户生活的城市)。
在 cust_subset 表上存在下列权限集:

用户 alvin 是该表的所有者。

用户 barbara 具有对该表的 Insert 和 Index 权限。她还具有对 ssn 和 lname 列的
Select 权限。

用户 carrie 具有对 city 列的 Update 权限。她还具有对 ssn 列的 Select 权限。

用户 danny 具有对该表的 Alter 权限。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 192 -
现在,用户 alvin 为 cust_subset 表启动名为 cust_subset_viols 的违反表和名
为 cust_subset_diags 的诊断表,如下:
START VIOLATIONS TABLE FOR cust_subset
USING cust_subset_viols, cust_subset_diags;
数据库服务器授予对 cust_subset_viols 违反表的下列初始权限集:

用户 alvin 是该违反表的所有者,因此他具有对该表的所有表级别权限。

用户 barbara 具有对违反表的 Insert、Delete 和 Index 权限。她还具有对违反表的
下列列的 Select 权限:ssn 列、lname列、gbasedbt_tupleid 列、gbasedbt_optype 列
和 gbasedbt_recowner 列。

用户 carrie 具有对违反表的 Insert 和 Delete 权限。她还具有对违反表的下列列的
Update 权限:
city 列、
gbasedbt_tupleid列、
gbasedbt_optype 列和 gbasedbt_recowner 列。
她具有对违反表的下列列的 Select 权限:ssn 列、gbasedbt_tupleid列、
gbasedbt_optype 列和 gbasedbt_recowner 列。

用户 danny 不具有对违反表的任何权限。
对诊断表的权限的示例
下列示例说明如何从对目标表的当前权限集派生对诊断表的初始权限集。
例如,假设名为 cust_subset 的表由下列列组成:ssn(客户的社会保险编号)、fname(客
户的名)、lname(客户的姓)以及 city(客户生活的城市)。
对 cust_subset 表存在下列权限集:

用户 alvin 为该表的所有者。

用户 barbara 具有对该表的 Insert 和 Index 权限。她还具有对 ssn 和 lname 列的
Select 权限。

用户 carrie 具有对 city 列的 Update 权限。她还具有对 ssn 列的 Select 权限。

用户 danny 具有对该表的 Alter 权限。
现在,用户 alvin 为 cust_subset 表启动名为 cust_subset_viols 的违反表和名
为 cust_subset_diags 的诊断表,如下:
START VIOLATIONS TABLE FOR cust_subset
USING cust_subset_viols, cust_subset_diags;
数据库服务器对于 cust_subset_diags 诊断表授予下列初始的权限集:

用户 alvin 为诊断表的所有者,因此他具有对该表的所有表级别权限。

用户 barbara 具有对诊断表的 Insert、Delete、Select 和 Index 权限。

用户 carrie 具有对诊断表的 Insert、Delete、Select 和 Update 权限。

用户 danny 对诊断表没有权限。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 193 -

ontape 实用程序与 ON-Bar 一样支持 GLS。您可以指定本地语言环境的数据库名称。

GBase 8s 备份与恢复指南
南大通用数据技术股份有限公司 - 249 -