返回首页

gbase数据、南大通用产品文档:GBase8sSTART VIOLATIONS TABLE 语句

更新日期:2024年09月11日

使用 START VIOLATIONS TABLE 语句来为指定的目标表创建违反表和诊断
表。START VIOLATIONS TABLE 语句是对 SQL 的 ANSI/ISO 标准的扩展。
语法

元素
描述
限制
语法
diagnostics 声明要与目标 table 相关
联的诊断表的名称。缺省
名称为 table_dia。
在表、视图、序列和
同义词的名称中必须
是唯一的
标识符

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1091
元素
描述
限制
语法
num_rows
当在 table 上执行单个语
句时,数据库服务器可插
入到 violations 内的行
的最大数目
必须为从 1 至
INTEGER 数据类型的
最大值之间的整数
精确数值
owner
table 的所有者
必须拥有该表
所有者名

table
要为其创建 violations
表和 diagnostics 表的目
标表
如果忽略 USING 子
句,则不超过 124
字节
标识符
violations
要与 table 相关联的违反
表。缺省的名称为
table_vio。
与 diagnostics 的
约束相同
标识符
用法
数据库服务器将 violations 表和 diagnostics 表与您在 FOR 关键字之后指定的目
标表相关联,通过在 sysviolations 系统目录表中记录三表之间的关系。
目标表必须满足这些要求:

不可为不是当前的数据库中的表。

它不可为 CREATE EXTERNAL TABLE 语句定义了的对象。

它不可已经与违反表或诊断表相关联。

它不可为系统目录表。
START VIOLATIONS TABLE 语句创建特定的违反表,该表持有在目标表上执行
插入、更新和删除操作期间不能满足约束和唯一索引的不符合的那些行。此语句
还创建特定的诊断表,该表包含关于在违反行中的每一行导致的完整性违反的信
息。
与 SET Database Object Mode 语句的关系
START VIOLATIONS TABLE 语句与 SET Database Object Mode 语句关系密切。
如果您使用 SET Database Object Mode 来将定义在表上的约束或唯一索引设置为

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1092
FILTERING 模式,还不使用 START VIOLATIONS TABLE,则不将在数据操作
操作中违反约束或唯一索引要求的任何行过滤到违反表。相反,您会收到错误消
息,表明您必须为目标表启动违反表。
类似地,如果您使用 SET Database Object Mode 语句来将禁用的约束或禁用的唯
一索引设置为 ENABLED 或 FILTERING 模式,但您没有为在其上定义数据库
对象的表使用 START VIOLATIONS TABLE,则不将不满足该约束或唯一索引要
求的任何行过滤到违反表。
在这些情况下,要标识不满足约束或唯一索引要求的那些行,请发出 START
VIOLATIONS TABLE 语句来启动违反表和诊断表。请在您使用 SET Database
Object Mode 语句来将数据库对象设置为 ENABLED 或 FILTERING 数据库对象
模式之前执行此操作。
对并发事务的影响
如果数据库有事务日志记录,则您必须单独发出 START VIOLATIONS TABLE。
也就是说,当您在事务内对目标表发出 START VIOLATIONS TABLE 时,在目
标表上不可有任何其他事务正在处理。在第一个事务已发出 START
VIOLATIONS TABLE 语句之后,在目标表上启动的任何事务有关违反表和诊断
表的行为都会与第一个事务的方式相同。也就是说,由这些随后的事务引起的任
何约束或唯一索引违反都会记录在违反表和诊断表中。
例如,如果事务 A 在表 tab1 上操作,并在表 tab1 上发出 START
VIOLATIONS TABLE 语句,则数据库服务器启动名为 tab1_vio 的违反表,并将
由事务 A 在表 tab1 上引起的任何约束或唯一索引违反都过滤到表 tab1_vio。
如果在事务 A 已发出了 START VIOLATIONS TABLE 语句之后,在表 tab1 启
动事务 B 和 C,则还会将由事务 B 和 C 引起的任何约束和唯一索引违反过滤
到表 tab1_vio。
结果就是,所有这三个事务都不会收到关于约束和唯一索引违反的错误消息,即
使事务 B 和 C 并不期望该行为。例如,如果事务 B 在表 tab1 上发出一违反
检查约束的 INSERT 或 UPDATE 语句,数据库服务器不会向事务 B 发出约束
违反错误。数据库服务器反而会将不符合的行(也称为“坏行”)过滤到违反表,
而不通知发生了数据完整性违反的事务 B。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1093
当您在 SET Database Object Mode、CREATE TABLE、ALTER TABLE 或
CREATE INDEX 语句中指定 FILTERING 模式时,您可通过指定 WITH
ERRORS 来防止在 GBase 8s 中发生这种情况。当多个事务在表上操作且 WITH
ERRORS 选项生效时,在目标表上违反约束或唯一索引要求的任何事务都会收到
数据完整性错误消息。
停止违反表和诊断表
在您使用 START VIOLATIONS TABLE 来在目标表与违反表和诊断表之间创建
关联之后,删除在目标表与违反表和诊断表之间的关联的唯一方法就是为目标表
发出 STOP VIOLATIONS TABLE 语句。要获取更多信息,请参阅 STOP
VIOLATIONS TABLE 语句。
USING 子句
您可使用 USING 子句来为违反表和为诊断表声明显式的名称。
如果您省略 USING 子句,则数据库服务器为违反表和诊断表指定名称。系统指
定的违反表的名称由目标表的名称后跟字符串 _vio 构成。数据库服务器指定给
诊断表的名称由目标表的名称后跟字符串 _dia 构成。
如果您省略 USING 子句,则目标表的名称的最大长度为 124 字节。
使用 MAX ROWS 子句
当在目标表上执行单个语句时,MAX ROWS 子句指定数据库服务器可插入到诊
断表内的最大行数。如果您省略 MAX ROWS 子句,则当在目标表上执行单个语
句时,对可插入到诊断表中的行的数目不设上限。
指定诊断表中行的最大数目
下列语句为名为 orders 的目标表启动违反表和诊断表。当在目标表上执行诸如
INSERT 之类的单个语句时,MAX ROWS 子句指定可插入到诊断表内的最大行
数。
START VIOLATIONS TABLE FOR orders MAX ROWS 50000;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1094
启动违反表和诊断表所需要的权限
要为目标表启动违反表或诊断表,您必须满足下列要求之一:

您必须有对数据库的 DBA 权限。

您必须是目标表的所有者且还有对数据库的 Resource 权限。

您必须有对目标表的 Alter 权限且还有对数据库的 Resource 权限。
违反表的结构
当您为目标表发出 START VIOLATIONS TABLE 时,该语句创建的违反表有预
先定义的结构。此结构由目标表的列和三个附加列组成。
下表展示违反表的模式。
列名称
数据类型
列描述
出现在目标表中的相同的
列(以相同的顺序)
与目标表中对
应的列相同的
类型。
违反表与目标表有相同的模式,
因此可将在插入、更新和删除操
作期间违反约束或唯一索引的那
些行过滤到违反表。
gbasedbt_tupleid
SERIAL
对于不符合的行的唯一的序列代

gbasedbt_optype
CHAR(1)
导致此坏行的操作的类型。此列
可有下列值:

I = Insert

D = Delete

O = Update(在此行中带
有原始的值)

N = Update(在此行中带
有新值)

S = SET Database Object
Mode
gbasedbt_recowner
CHAR(32)
发出了创建此不符合的行的语句
的用户
如果 START VIOLATIONS TABLE 语句的目标表受到安全策略的保护,则数据
库服务器以同样的安全策略保护该违反表。在此情况下,违反表的模式包括一
IDSSECURITYLABEL 列,其名称和在其他列之中的位置对应于目标表的

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1095
IDSSECURITYLABEL 列。当创建违反表时,在目标表中保护列的任何
SECURED WITH label 规范还保护对应的违反表列。
将目标表中的连续的列转换成违反表中的整数数据类型。
用户可检测在违反表中的这些不符合的行,分析在诊断表中包含诊断信息的相关
的行,并采取纠正行动。
START VIOLATIONS TABLE 语句的示例
下列示例展示执行 START VIOLATIONS TABLE 语句的不同方式。
带有缺省名称的违反表和诊断表
下列语句为名为 cust_subset 的目标表启动违反表和诊断表。在默认情况下,违
反表名为 cust_subset_vio,诊断表名为 cust_subset_dia。
START VIOLATIONS TABLE FOR cust_subset;
带有显式的名称的违反表和诊断表
下列语句为名为 items 的目标表启动违反表和诊断表。USING 子句指定违反表
和诊断表的显式的名称。违反表命名为 exceptions,诊断表命名为 reasons。
START VIOLATIONS TABLE FOR items USING exceptions, reasons;
目标表、违反表和诊断表之间的关系
用户可利用目标表、违反表和诊断表之间的关系来获得关于在 INSERT、
DELETE 和 UPDATE 期间导致数据完整性违反的行的诊断信息。违反表的每一
行至少在诊断表中有一对应的行。

违反表中的一行是在目标表中检测到了其数据完整性违反的任何行的一个
副本。诊断表中的行包含由违反表中不符合的行导致的数据完整性违反的
本质的信息。

违反表中的一行在 gbasedbt_tupleid 列中有唯一的序列标识符。诊断表中
的行在它的 gbasedbt_tupleid 列中有相同的序列标识符。
违反表中的给定的行可在诊断表中有多个对应的行。诊断表中的多个行在它们的
gbasedbt_tupleid 列都有相同的序列标识符,以便于它们都链接到违反表中的同

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1096
一行。对于违反表中的同一行,诊断表中可存在多行,因为违反表中的不符合的
行可导致多次数据完整性违反。
例如,同一不符合的行可违反一列的唯一索引,违反另一列的非 NULL 约束,并
违反第三列的检查约束。在此情况下,对于违反表中的单个不符合的行,诊断表
包含三行。每一诊断行标识违反表不符合的行导致的一种不同的数据完整性违
反。
通过连接违反表与诊断表,DBA 或目标表的所有者可获得关于违反表中任何或所
有不符合的行的诊断信息。SELECT 语句可交互地执行这些连接,或您可写程序
来在会话内执行它们。
对违反表的初始权限
当您发出 START VIOLATIONS TABLE 语句来创建违反表时,数据库服务器使
用在目标表上授予的权限集作为对违反表授予权限的基础。然而,当数据库服务
器授予每一权限类别时,它遵循不同的规则。
下表汇总数据库服务器在其下对违反表授予的每一类权限的环境。
权限 授予该权限的条件
Alter 未在违反表上授予 Alter 权限。(用户不可更改违反表。)
Index 如果用户在目标表上有 Index 权限,则用户在违反表上有 Index 权限。
Insert 如果用户在目标表的任何列上有 Insert、Delete 或 Update 权限,则用户
在违反表上有 Insert 权限。
Delete 如果用户在目标表的任何列上有 Insert、Delete 或 Update 权限,则用户
在违反表上有 Delete 权限。
Select 如果用户在目标表的任何列上有 Select 权限,则用户在违反表的
gbasedbt_tupleid、gbasedbt_optype 和 gbasedbt_recowner 列上有
Select 权限。
如果用户在目标表中同一列上有 Select 权限,则用户在违反表的任何其
他列上有 Select 权限。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1097
Update 如果用户在目标表的任何列上有 Update 权限,则用户在违反表的
gbasedbt_tupleid、gbasedbt_optype 和 gbasedbt_recowner 列上有
Update 权限。
(然而,即使在 gbasedbt_tupleid 列上带有 Update 权限,用户也不可
更新此 SERIAL 列。)
如果用户在目标表中的同一列上有 Update 权限,则用户在任何其他的
违反表列上有 Update 权限。
References 不在违反表上授予 References 权限。(用户不可将引用约束添加到
违反表。)
下列规则适用于违反表的所有者和违反表上的权限:

当创建违反表时,目标表的所有者成为违反表的所有者。

违反表的所有者自动地收到违反表上的所有表级权限,包括 Alter 和
References 权限。然而,数据库服务器防止违反表的所有者更改违反表或
将引用约束添加到违反表。

您可使用 GRANT 和 REVOKE 语句来更改违反表上的权限的初始集。

当您在其上定义了过滤模式唯一索引或约束的目标表上发出 INSERT、
DELETE 或 UPDATE 语句时,您必须在违反表和诊断表上有 Insert 权
限。
如果您在违反表和诊断表上没有 Insert 权限,则数据库服务器在目标表上
执行 INSERT、DELETE 或 UPDATE 语句,假设您在目标表上有必要的
权限。数据库服务器不返回关于在违反表和诊断表上缺少 Insert 权限的错
误,除非在执行 INSERT、DELETE 或 UPDATE 语句期间检测到完整性
违反。
类似地,当您发出 SET Database Object Mode 语句来将禁用的约束或禁用
的唯一索引设置为启用的或过滤器模式,且对于目标表存在违反表和诊断
表,则您必须在违反表和诊断表上有 Insert 权限。
如果您在违反表和诊断表上没有 Insert 权限,则数据库服务器执行 SET
Database Object Mode 语句,如果您在在目标表上有必要的权限的话。 数

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1098
据库服务器不返回有关在违反表和诊断表上缺少 Insert 权限的错误,除非
在执行 SET Database Object Mode 语句期间检测到完整性违反。

在违反表上的权限的初始集的授予者与在目标表上的权限的授予者相同。
例如,如果用户 jill 和用户 albert 授予了用户 henry 在目标表上的
Insert 权限,则 jill 和 albert 将违反表上的 Insert 权限授予 henry。

在启动违反表之后,从一用户撤销目标表上的权限不会自动地从那个用户
撤销在违反表上的同一权限。您反而必须显式地从该用户撤销在违反表上
的该权限。

如果您在目标表上有分片级权限,则您在违反表上有对应的分片级权限。
违反表上权限的示例
下列示例展示如何从目标表上的权限的当前集推导出违反表上的权限的初始集。
假设名为 cust_subset 的表由下列列组成:ssn (客户“社会保险”号)、fname
(客户的名)、lname(客户的姓)和 city(客户生活的城市)。
在 cust_subset 表上存在下列权限集:

用户 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_viols 违反表上授予下列初始权限集:

用户 alvin 是违反表的所有者,因此他在表上有所有表级权限。

用户 barbara 在表上有 Insert、Delete 和 Index 权限。
用户 barbara 在违反表的五列上有 Select 权限:ssn、the lname、
gbasedbt_tupleid、gbasedbt_optype 和 gbasedbt_recowner 列。

用户 carrie 在违反表上有 Insert 和 Delete 权限。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1099
用户 carrie 在违反表的四列上有 Update 权限:city、gbasedbt_tupleid、
gbasedbt_optype 和 gbasedbt_recowner 列。然而,她不可更新
gbasedbt_tupleid 列(因为这是 SERIAL 列)。
用户 carrie 在违反表的四列上有 Select 权限:ssn 列、gbasedbt_tupleid
列、gbasedbt_optype 列和 gbasedbt_recowner 列。

用户 danny 在违反表上没有权限。
使用违反表
下列规则涉及违反表的结构和使用:

违反表中每对更新行都在 gbasedbt_tupleid 列中有相同的值,表明两行都
引用目标表中的同一行。

如果目标表有名为 gbasedbt_tupleid、gbasedbt_optype 或
gbasedbt_recowner 的列,则数据库服务器尝试通过在列名称尾部附加数
字,在违反表中为这些列生成可替代的名称(例如 gbasedbt_tupleid1)。
如果这样做失败,则返回错误,且不为目标表启动违反表。

当某个表作为违反表时,它不可在其上定义触发器或约束。

当某个表作为违反表时,用户可在它之上创建索引,即使存在索引会影响
性能。不可将违反表上的唯一索引设置为 FILTERING 数据库对象模式。

如果目标表有违反表和诊断表与它相关联,则以级联模式(缺省的模式)
删除该目标表导致违反表和诊断表也被删除。如果以受限模式删除该目标
表,则 DROP TABLE 操作失败(因为存在违反表和诊断表)。

在为目标表启动违反表之后,ALTER TABLE 不可添加、修改或删除违反
表、诊断表或目标表的列。在您可更改任何这些表之前,您必须为目标表
发出 STOP VIOLATIONS TABLE 语句。

在 INSERT、UPDATE、DELETE 或 SET Database Object Mode 操作期
间,在数据库服务器使用违反表之前或之后,它不清除违反表的内容。

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

如果目标表在它之上定义有过滤器模式约束或唯一索引,且违反表与它相
关联,则用户不可通过从违反表选择来插入到目标表内。 在您通过从违
反表选择来将行插入到目标表内之前,您必须采用下列步骤之一:
o
您可将约束或唯一索引设置为 DISABLED 模式。
o
您可为目标表发出 STOP VIOLATIONS TABLE。
如果不便于采取这些步骤之一,但您仍想将记录从违反表复制到目标表
内,则第三个选项就是从违反表选择到临时表内,然后再将临时表的内容
插入到目标表内。

如果在 START VIOLATIONS TABLE 语句中指定的目标表是分片的,则
违反表与目标表有相同的分片策略。违反表的每一分片与目标表的对应分
片存储在相同的 dbspace 分区中。

一旦为目标表启动违反表,您不可使用 ALTER FRAGMENT 语句来更改
目标表或违反表的分片策略。

如果在 START VIOLATIONS TABLE 语句中指定的目标表未分片,则数
据库服务器将违反表放置在与目标表相同的 dbspace 中。

如果目标表有 BYTE 或 TEXT 列,则在存储目标表中的 BYTE 或
TEXT 数据的同一 blobspace 中创建违反表中的 BYTE 或 TEXT 数据
值。
违反表的示例
要在演示数据库中为名为 customer 的目标表启动违反表和诊断表,请输入下列
语句:
START VIOLATIONS TABLE FOR customer;
由于您未包括 USING 子句,所以将违反表缺省地命名为 customer_vio。
customer_vio 表包括这五列:
列一
列二
列三
列四
列五

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1101
customer_num
fname lname
company
address1
address2
city
state
zipcode
phone
gbasedbt_tupleid
gbasedbt_optype
gbasedbt_recowner
customer_vio 表与 customer 表有相同的表定义,除了 customer_vio 表有三个
附加的列之外,这些列包含关于导致不符合行的操作的信息。
诊断表的结构
当您为目标表发出 START VIOLATIONS TABLE 语句时,该语句创建的诊断表
有预先定义的结构。此结构与目标表的结构无关。
下表展示诊断表的模式。
列名称
数据类型
描述
gbasedbt_tupleid
INTEGER
隐式地引用违反表中的
gbasedbt_tupleid 列值。然而,不将
此关系声明为外键对主键的关系。
objtype
CHAR(1)
标识违反的类型。此列可有下列值:
C = 约束违反
I = 唯一索引违反
objowner
CHAR(32)
表示为其检测到了完整性违反的约束
或索引的所有者
objname
VARCHAR(128,
0)
包含为其检测到了完整性违反的约束
或索引的名称
诊断表上的初始权限
当 START VIOLATIONS TABLE 语句创建诊断表时,在目标表上授予的访问权
限集是在诊断表上授予权限的基础。然而,当数据库服务器授予每一类权限时,
它遵循下列规则:
下表说明数据库服务器在诊断表上授予每一权限所处的环境。
权限 授予权限的条件

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1102
Insert 如果用户在目标表的任何列上有 Insert、Delete 或 Update 权限,则用
户有在诊断表上的 Insert 权限。
Delete 如果用户在目标表的任何列上有 Insert、Delete 或 Update 权限,则用
户在诊断表上有 Delete 权限。
Select 如果用户在目标表的任何列上有 Select 权限,则用户在诊断表上有
Select 权限。
Update 如果用户在目标表中的任何列上有 Update 权限,则用户在诊断表上有
Update 权限。
Index 如果用户在目标表上有 Index 权限,则用户在诊断表上有 Index 权
限。
Alter 不在诊断表上授予 Alter 权限。
(用户不可更改诊断表的模式。)
References 不在诊断表上授予 References 权限。
(用户不可在诊断表上定义引用的约束。)
下列规则涉及在诊断表上的访问权限:

当创建诊断表时,目标表的所有者成为诊断表的所有者。

诊断表的所有者自动地收到诊断表上的所有表级权限,包括 Alter 和
References 权限。然而,数据库服务器防止诊断表的所有者更改诊断表或
給诊断表添加引用的约束。

您可使用 GRANT 和 REVOKE 语句来修改在诊断表上的初始权限集。

对于在其上定义有过滤器模式唯一索引或约束的目标表上的 INSERT、
DELETE 或 UPDATE 操作,您必须在违反表和诊断表上有 Insert 权
限。
如果您在违反表和诊断表上没有 Insert 权限,则数据库服务器在目标表上
执行 INSERT、DELETE 或 UPDATE 语句,假如您在目标表上有必要的
权限的话。数据库服务器不返回有关在违反表和诊断表上缺少 Insert 权限
的错误,除非在执行 INSERT、DELETE 或 UPDATE 语句期间检测到完
整性违反。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1103
类似地,当您发出 SET Database Object Mode 语句来将禁用的约束或禁用
的唯一索引设置为启用的或过滤器模式,且对于目标表存在违反表和诊断
表时,您必须在违反表和诊断表上有 Insert 权限。
如果您在违反表和诊断表上没有 Insert 权限,则数据库服务器执行 SET
Database Object Mode 语句,假如您在目标表上有必要的权限的话。数据
库服务器不返回有关在违反表和诊断表上缺少 Insert 权限的错误,除非在
执行 SET Database Object Mode 语句期间检测到完整性违反。

在诊断表上的权限的初始集的授予者与在目标表上的权限的授予者相同。
例如,如果通过用户 wayne 和用户 laurie 在目标表上授予了 用户
jenny Insert 权限,则用户 wayne 和用户 laurie 都将在诊断表上的
Insert 权限授予用户 jenny。

一旦为目标表启动诊断表,从一用户取消在目标表上的权限不会自动地从
该用户取消在诊断表上的同一权限。您反而必须显式地在诊断表上从该用
户取消该权限。

如果您在目标表上有分片级权限,则您在诊断表上有相应的表级权限。
下一示例展示如何从目标表上的当前权限推导出诊断表上的权限的初始集。 假设
您有持有 customer 数据的名为 cust_subset 的表。此表由下列列组成:ssn
(社保编号)、fname(名)、lname(姓)和 city(客户生活的城市)。在
cust_subset 表上存在下列访问权限集:

用户 alvin 是表的所有者。

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

用户 danny 有表上的 Alter 权限。

用户 carrie 在 city 列上有 Update 权限。她还在 ssn 列上有 Select 权
限。
现在,用户 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 权限。

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

用户 carrie 在诊断表上有 Insert、Delete、Select 和 Update 权限。

用户 danny 在诊断表上没有权限。
使用诊断表
下列问题涉及诊断表的结构和使用。

当您在目标表上执行诸如 INSERT 或 SET Database Object Mode 语句这
样的单个语句时,START VIOLATIONS TABLE 语句的 MAX ROWS 子
句对可插入到诊断表内的行数设置限制。

MAX ROWS 子句仅对该表作为诊断表的操作限制行数。

当某表作为诊断表时,它不可在它之上定义触发器或约束。

当某表作为诊断表时,用户可在该表上创建索引,但索引的存在会影响性
能。您不可将诊断表上的唯一索引设置为 FILTERING 数据库对象模
式。

如果对象表有违反表和诊断表与它相关联,则以级联模式(缺省的模式)
删除对象表会导致违反表和诊断表也被删除。

如果以受限的模式删除目标表,则 DROP TABLE 操作失败(因为存在
违反表和诊断表)。

一旦为目标表启动违反表,您不可使用 ALTER TABLE 语句来添加、修
改或删除目标表、违反表或诊断表中的列。在您可修改任何这些表之前,
您必须为目标表发出 STOP VIOLATIONS TABLE 语句。

在 Insert、Update、Delete、Merge、SET CONSTRAINTS 或 SET
INDEXES 操作期间,在数据库服务器使用诊断表之前或之后,它不清除
诊断表的内容。

如果在 START VIOLATIONS TABLE 语句中指定的目标表是分片的,则
诊断表以轮转法策略在目标表被分片的同一 dbspace 之上分片。
要在演示数据库中为名为 stock 的目标表启动违反表和诊断表,请输入下列语
句:
START VIOLATIONS TABLE FOR stock;
由于您的 START VIOLATIONS TABLE 语句不包括 USING 子句,因此缺省地
命名诊断表为 stock_dia。stock_dia 表包括下列两列:
列一
列二
gbasedbt_tupleid objtype
objowner objname

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1105
对于目标表,此列的列表展示诊断表与违反表之间的差异。尽管违反表有与目标
表中每列相匹配的列,而诊断表的列不与目标表中的任何列相匹配。通过任何
START VIOLATIONS TABLE 语句创建的诊断表都有相同的列,有相同的列名称
和数据类型。
要获取更多关于诊断表与违反表之间关系的信息,请参阅 目标表、违反表和诊断
表之间的关系。

使用 ON-Bar 创建备份时,bar_act.log 文件中的参考消息 log backup is already running 以
及 online.log 文件中的参考消息 Process exited with return code 152 可能会在某些情况下
出现。
这些消息可能会在以下情况下出现:

将 ALARMPROGRAM 配置参数设置为 log_full.sh 时。
事件将定期使 log_full.sh 触发 onbar -b -l 命令。 如果在运行 onbar -b -l 命令时
某个日志填满,那么 ON-Bar 还将备份该日志。如果直到下个事件触发时为止备
份还未完成,将在 bar_act.log 文件中生成一个警告。下个事件触发时,日志备份
可以继续进行。

自动启动 onbar -b -l 命令时。
0 级归档(特别是使用 -w 选项启动时)将首先归档数据库,接着自动启动 onbar
-b -l 命令来备份当前已填满但还未备份的所有逻辑日志。在 online.log 中可能没
有 log_full.sh 消息,这是因为 onbar -b -l 命令是直接启动的。

当前一个磁带填满后安装新磁带时,将调度 log_full.sh 事件但不触发该事件。
一旦下个日志填满并在 log_full.sh 文件中生成事件触发器时,将归档所有可用日
志。
以通过运行 onbar -b -l 来强制执行归档,或通过运行 onmode -l 强制触发
log_full.sh。

REPLICATION_STAT 用于描述日志同步状态信息,如发起端发送日志位置、收端接收
日志位置等。
名称
类型
描述
pid
bigint
线程的PID。
usesysid
oid
用户系统ID。
usename
name
用户名。
application_name
text
程序名称。
client_addr
inet
客户端地址。
client_hostname
text
客户端名。
client_port
integer
客户端端口。
backend_start
timestamp wi
程序启动时间。

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
1056
名称
类型
描述
th time zone
state
text
日志复制的状态:
追赶状态。
一致的流状态。
sender_sent_location
text
发送端发送日志位置。
receiver_write_location
text
接收端write 日志位置。
receiver_flush_location
text
接收端flush 日志位置。
receiver_replay_location
text
接收端replay 日志位置。
sync_priority
integer
同步复制的优先级(0 表示异步)。
sync_state
text
同步状态:
异步复制。
同步复制。
潜在同步者。