使用违反表
下列规则涉及违反表的结构和使用:
违反表中每对更新行都在
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 操作期间,在数据库服务器使用违反表之前或之后,它不清除违反表的内容。
如果目标表在它之上定义有过滤器模式约束或唯一索引,且违反表与它相关联,则用户不可通过从违反表选择来插入到目标表内。 在您通过从违反表选择来将行插入到目标表内之前,您必须采用下列步骤之一:
您可将约束或唯一索引设置为 DISABLED 模式。
您可为目标表发出 STOP VIOLATIONS TABLE。
如果不便于采取这些步骤之一,但您仍想将记录从违反表复制到目标表内,则第三个选项就是从违反表选择到临时表内,然后再将临时表的内容插入到目标表内。
如果在 START VIOLATIONS TABLE 语句中指定的目标表是分片的,则违反表与目标表有相同的分片策略。违反表的每一分片与目标表的对应分片存储在相同的 dbspace 分区中。
一旦为目标表启动违反表,您不可使用 ALTER FRAGMENT 语句来更改目标表或违反表的分片策略。
如果在 START VIOLATIONS TABLE 语句中指定的目标表未分片,则数据库服务器将违反表放置在与目标表相同的 dbspace 中。
如果目标表有 BYTE 或 TEXT 列,则在存储目标表中的 BYTE 或 TEXT 数据的同一 blobspace 中创建违反表中的 BYTE 或 TEXT 数据值。
父主题:
START VIOLATIONS TABLE 语句