当约束处于过滤模式时,插入的结果

如果将 cust_subset 表上的 NOT NULL 约束设置为过滤模式,则用户 linda 发出的 INSERT 命令不能在此表中插入新行。而将该新行插入到违反表内,并将描述完整性违反的诊断行添加到诊断表。

假设用户 joe 已为 cust_subset 表启动了违反表和诊断表。违反表名为 cust_subset_vio,诊断表名为 cust_subset_dia。当用户 lindacust_subset 目标表上发出 INSERT 语句时,添加到 cust_subset_vio 违反表的新行有下列列值。
ssn fname lname city gbasedbt_tupleid gbasedbt_optype gbasedbt_recowner
973824499 jane NULL los altos 1 I linda
cust_subset_vio 违反表中的此新行有下列特征:
  • 违反表的前四列恰好与目标表的列相匹配。这四列与目标表的对应列有相同的名称和相同的数据类型,它们具有用户 linda 输入的 INSERT 语句提供了的列值。
  • gbasedbt_tupleid 列中的值 1 是分配给不符合的行的唯一序列标识符。
  • gbasedbt_optype 列中的值 I 表示操作类型的代码,该操作已导致了创建此不符合的行。特别地,I 代表 INSERT 操作。
  • gbasedbt_recowner 列中的值 linda 标识发出了导致创建此不符合行的用户。
用户 lindacust_subset 目标表上发出的 INSERT 语句还导致将诊断行添加到 cust_subset_dia 诊断表。添加到诊断表的诊断行有下列列值。
gbasedbt_tupleid 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 便可采取更正行动。